ggplot2 menjaga level barplot yang tidak terpakai

102

Saya ingin memplot level yang tidak digunakan (yaitu, level di mana hitungannya adalah 0) di plot-batang saya, namun, level yang tidak terpakai dijatuhkan dan saya tidak tahu cara menyimpannya

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()

Dalam contoh di atas, saya ingin melihat C diplot dengan hitungan 0, tetapi sama sekali tidak ada ...

Terima kasih atas bantuannya Ulrik

Edit:

Ini melakukan apa yang saya inginkan

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")

Tebak solusinya adalah dengan menghitung frekuensi menggunakan tabel () dan kemudian plot

Ulrik
sumber

Jawaban:

69

Anda perlu menyetel drop = FALSE pada kedua skala (isi dan x) seperti ini:

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)

Edit:

Saya cukup yakin ini berhasil. Lupa mengubah x untuk mengetik alih-alih grup dan posisi = 'menghindar'! Cukup tempel dan uji. Stat_bin menangani bin dengan jumlah nol. Periksa dokumennya .

Jarretinha
sumber
Saya pikir ini harus menjadi jawaban atas pertanyaan OP. Jawabannya juga menangani level yang dijatuhkan dalam legenda.
SavedByJESUS
ketika saya melakukan ini, itu mengubah warna bar saya. Apakah ada cara untuk mempertahankan warna aslinya?
morgan121
71

Apakah ini sesuai dengan keinginan Anda?

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

masukkan deskripsi gambar di sini

smillig
sumber
9

Penurunan level tidak bekerja. Menurunkan level pada contoh pertama

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)

hasil di plot ini:

masukkan deskripsi gambar di sini

Solusinya ada di contoh kedua di mana frekuensi dihitung secara manual:

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")

Hasil ini:

masukkan deskripsi gambar di sini

Yang terakhir adalah yang paling informatif karena ruang diisi oleh kategori di sana count = 0

Ulrik
sumber
1

Anda juga dapat menggunakan "scale_fill_color" sebagai contoh:

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)
Yan Zhang
sumber