ggplot2 เก็บระดับ barplot ที่ไม่ได้ใช้


100

ฉันต้องการพล็อตระดับที่ไม่ได้ใช้ (นั่นคือระดับที่นับเป็น 0) ในพล็อตบาร์ของฉันอย่างไรก็ตามระดับที่ไม่ได้ใช้จะหลุดออกไปและฉันไม่สามารถหาวิธีรักษาได้

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

ในตัวอย่างข้างต้นฉันต้องการเห็น C พล็อตด้วยจำนวน 0 แต่มันขาดไปโดยสิ้นเชิง ...

ขอบคุณสำหรับความช่วยเหลือใด ๆ Ulrik

แก้ไข:

นี่คือสิ่งที่ฉันต้องการ

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

เดาวิธีแก้ปัญหาคือการคำนวณความถี่โดยใช้ตาราง () แล้วพล็อต

คำตอบ:


68

คุณต้องตั้งค่า drop = FALSE บนสเกลทั้งสอง (เติมและ x) ดังนี้:

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)

แก้ไข:

ฉันค่อนข้างมั่นใจว่ามันได้ผล ลืมเปลี่ยน x เพื่อพิมพ์แทนกลุ่มและตำแหน่ง = 'หลบ'! เพียงแค่วางและทดสอบ stat_bin เกี่ยวข้องกับ bins ที่มีค่าเป็นศูนย์ ตรวจสอบเอกสาร


ฉันคิดว่านี่น่าจะเป็นคำตอบสำหรับคำถามของ OP คำตอบดูแลระดับที่ลดลงในตำนานด้วย
SavedByJESUS

เมื่อฉันทำสิ่งนี้มันจะเปลี่ยนสีของแท่งของฉัน มีวิธีรักษาสีเดิมหรือไม่?
morgan121


9

ระดับการลดลงไม่ทำงาน ลดระดับในตัวอย่างแรก

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)

ผลลัพธ์ในพล็อตนี้:

ป้อนคำอธิบายภาพที่นี่

วิธีแก้ปัญหาอยู่ในตัวอย่างที่สองซึ่งคำนวณความถี่ด้วยตนเอง:

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

ผลลัพธ์ในสิ่งนี้:

ป้อนคำอธิบายภาพที่นี่

อันสุดท้ายเป็นข้อมูลมากที่สุดเนื่องจากพื้นที่ถูกยึดตามหมวดหมู่ที่นั่นนับ = 0


1

คุณยังสามารถใช้ "scale_fill_color" ได้เช่น:

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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.