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

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 .


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


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


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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.