ggplot2 kullanılmayan seviyeleri barplot tutar


101

Kullanılmayan seviyeleri (yani sayının 0 olduğu seviyeler) çubuk grafiğimde çizmek istiyorum, ancak kullanılmayan seviyeler düşüyor ve bunları nasıl koruyacağımı bulamıyorum

df <- data.frame(type=c("A", "A", "A", "B", "B"), group=rep("group1", 5))
df$type <- factor(df$type, levels=c("A","B", "C"))

ggplot(df, aes(x=group, fill=type)) + geom_bar()

Yukarıdaki örnekte, C'nin 0 sayımıyla çizildiğini görmek istiyorum, ancak bu tamamen yok ...

Herhangi bir yardım için teşekkürler Ulrik

Düzenle:

Bu istediğimi yapıyor

df <- data.frame(type=c("A", "A", "A", "B", "B"), group=rep("group1", 5))
df1 <- data.frame(type=c("A", "A", "A", "B", "B", "A", "A", "C", "B", "B"), group=c(rep("group1", 5),rep("group2", 5)))

df$type <- factor(df$type, levels=c("A","B", "C"))
df1$type <- factor(df1$type, levels=c("A","B", "C"))
df <- data.frame(table(df))

df1 <- data.frame(table(df1))

ggplot(df, aes(x=group, y=Freq, fill=type)) + geom_bar(position="dodge")
ggplot(df1, aes(x=group, y=Freq, fill=type)) + geom_bar(position="dodge")

Tahmin edin çözüm, table () kullanarak frekansları hesaplamak ve ardından grafik

Yanıtlar:


68

Her iki ölçekte de (dolgu ve x) drop = FALSE ayarlamanız gerekir:

library(ggplot2)
df <- data.frame(type=c("A", "A", "A", "B", "B"), group=rep("group1", 5))
df1 <- data.frame(type=c("A", "A", "A", "B", "B", "A", "A", "C", "B", "B"), group=c(rep("group1", 5),rep("group2", 5)))
df$type <- factor(df$type, levels=c("A","B", "C"))
df1$type <- factor(df1$type, levels=c("A","B", "C"))

plt <- ggplot(df, aes(x=type, fill=type)) + geom_bar(position='dodge') + scale_fill_discrete(drop=FALSE) + scale_x_discrete(drop=FALSE)
plt1 <-  ggplot(df1, aes(x=type, fill=type)) + geom_bar(position='dodge') + scale_fill_discrete(drop=FALSE) + scale_x_discrete(drop=FALSE)

Düzenle:

Bunun işe yaradığından oldukça eminim. X'i grup yerine yazmak ve pozisyon = 'kaçmak' olarak değiştirmeyi unuttum! Sadece yapıştırın ve test edin. Stat_bin sıfır sayıya sahip kutularla ilgilidir. Belgeleri kontrol edin .


Bence bu, OP'nin sorusunun cevabı olmalı. Cevap, efsanede düşen seviyeyle de ilgilenir.
— SavedByJESUS

bunu yaptığımda çubukların renklerini değiştiriyor. Orijinal renkleri korumanın bir yolu var mı?
— morgan121

71

Bu istediğini yapıyor mu?

ggplot(df, aes(x=type)) + geom_bar() + scale_x_discrete(drop=FALSE)

görüntü açıklamasını buraya girin


9

Seviyeleri düşürmek işe yaramıyor. İlk örnekte seviyeleri düşürmek

library(ggplot2)

df <- data.frame(type=c("A", "A", "A", "B", "B"), group=rep("group1", 5))
df$type <- factor(df$type, levels=c("A","B", "C"))

ggplot(df, aes(x=group, fill=type)) + geom_bar(position="dodge") + scale_x_discrete(drop=FALSE) + scale_fill_discrete(drop=FALSE)

bu arsa ile sonuçlanır:

görüntü açıklamasını buraya girin

Çözüm, frekansların manuel olarak hesaplandığı ikinci örnektir:

df <- data.frame(type=c("A", "A", "A", "B", "B"), group=rep("group1", 5))
df1 <- data.frame(type=c("A", "A", "A", "B", "B", "A", "A", "C", "B", "B"), group=c(rep("group1", 5),rep("group2", 5)))

df$type <- factor(df$type, levels=c("A","B", "C"))
df1$type <- factor(df1$type, levels=c("A","B", "C"))

df <- data.frame(table(df))
df1 <- data.frame(table(df1))

df$plot = "A"
df1$plot = "B"

df <- rbind(df, df1)

ggplot(df, aes(x=group, y=Freq, fill=type)) + geom_bar(position="dodge", stat="identity") + facet_wrap( ~ plot, scales="free")

Bunun sonuçları:

görüntü açıklamasını buraya girin

Sonuncusu en bilgilendiricidir çünkü alan sayı = 0


1

örneğin "scale_fill_color" da kullanabilirsiniz:

plt <- ggplot(df, aes(x=type, fill=type)) + geom_bar(position='dodge') + scale_x_discrete(drop=FALSE)+
scale_fill_manual(
  values = c(
    "#ff6666",
    "#cc9900",
    "#cc9900",
    ),drop=FALSE)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.