ggplot2 giữ các mức không sử dụng barplot


100

Tôi muốn vẽ các cấp độ không sử dụng (nghĩa là các cấp độ mà số đếm là 0) trong biểu đồ thanh của tôi, tuy nhiên, các cấp độ không sử dụng bị giảm xuống và tôi không thể tìm ra cách giữ chúng

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

Trong ví dụ trên, tôi muốn xem C được vẽ với số đếm là 0, nhưng nó hoàn toàn không có ...

Cảm ơn mọi sự giúp đỡ của Ulrik

Biên tập:

Điều này làm những gì tôi muốn

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

Đoán giải pháp là tính toán các tần số bằng cách sử dụng bảng () và sau đó vẽ biểu đồ

Câu trả lời:


68

Bạn cần đặt drop = FALSE trên cả hai thang (điền và x) như sau:

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)

Biên tập:

Tôi khá chắc chắn rằng điều này hiệu quả. Quên thay đổi x thành loại thay vì nhóm và vị trí = 'dodge'! Chỉ cần dán và kiểm tra. Stat_bin xử lý các thùng có số đếm bằng không. Kiểm tra tài liệu .


Tôi nghĩ đây phải là câu trả lời cho câu hỏi của OP. Câu trả lời cũng quan tâm đến mức độ bị giảm trong truyền thuyết.
Đã lưuByJESUS

khi tôi làm điều này, nó sẽ thay đổi màu sắc của các thanh của tôi. Có cách nào để giữ màu sắc ban đầu?
morgan121

71

Điều này có làm những gì bạn muốn?

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

nhập mô tả hình ảnh ở đây


9

Giảm cấp độ không hoạt động. Giảm cấp độ trong ví dụ đầu tiên

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)

kết quả trong âm mưu này:

nhập mô tả hình ảnh ở đây

Giải pháp là trong ví dụ thứ hai trong đó các tần số được tính toán thủ công:

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

Kết quả là:

nhập mô tả hình ảnh ở đây

Cái cuối cùng là thông tin nhiều nhất vì không gian được chiếm bởi các danh mục ở đó count = 0


1

bạn cũng có thể sử dụng "scale_fill_color", ví dụ:

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.