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.