【问题标题】:How to create a barchart with a main grouping variable and a sub-grouping variable using ggplot2?如何使用 ggplot2 创建具有主分组变量和子分组变量的条形图?
【发布时间】:2018-09-18 02:17:59
【问题描述】:

我想制作一个 Z 的条形图,按称为 Y 的分组变量分组,然后进一步分组到 X。我确信有一种理想的方法来绘制它,但这就是我所拥有的。

HW1bii <- HW1b %>% 
  group_by(Y,X)

ggplot(data = HW1bii, mapping = aes(x = Z)) +
  geom_bar(color = "Black", fill = "steelblue")

不完全是我要找的东西,但我希望有人可以帮助我找到更好的东西。

structure(list(X = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 
4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L), Y = c(1L, 2L, 3L, 
1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
2L, 3L), Z = c(113L, 109L, 105L, 80L, 122L, 88L, 104L, 98L, 93L, 
105L, 99L, 105L, 99L, 105L, 94L, 104L, 110L, 109L, 106L, 93L, 
125L)), row.names = c(NA, -21L), class = c("tbl_df", "tbl", "data.frame"
))

【问题讨论】:

  • 你可以使用dput(head(HW1bii, 50))来获取例如前50行

标签: r ggplot2 group-by bar-chart


【解决方案1】:

有很多方法可以做到这一点。这是在 x 轴上绘制 X,使用 facet_gridY 分组。

library(ggplot2)

ggplot(data = HW1b, aes(x = factor(X), y = Z)) +
  geom_bar(stat = "identity", color = "Black", fill = "steelblue", width = 0.5) +
  scale_x_discrete(name = "X") +
  facet_grid(Y ~ .)

您也可以使用coord_flip 进行坐标轴翻转。

ggplot(data = HW1b, aes(x = factor(X), y = Z)) +
  geom_bar(stat = "identity", color = "Black", fill = "steelblue", width = 0.5) +
  scale_x_discrete(name = "X") +
  coord_flip() +
  facet_grid(Y ~ .)

或使用facet_grid(Y ~ X, scales = "free_x)

ggplot(data = HW1b, aes(x = factor(X), y = Z)) +
  geom_bar(stat = "identity", color = "Black", fill = "steelblue", width = 0.5) +
  scale_x_discrete(name = "") +
  facet_grid(Y ~ X, scales = "free_x")

或将Y 映射到fill

ggplot(data = HW1b, aes(x = factor(X), y = Z, fill = factor(Y))) +
  geom_bar(stat = "identity", color = "Black", width = 0.5) +
  scale_x_discrete(name = "X") +
  scale_fill_viridis_d(name = "Y") +
  coord_flip()

或者使用position = "dodge"创建分组条形图。

ggplot(data = HW1b, aes(x = factor(X), y = Z, fill = factor(Y))) +
  geom_bar(stat = "identity", position = "dodge", color = "Black", width = 0.5) +
  scale_x_discrete(name = "X") +
  scale_fill_viridis_d(name = "Y")

这不是条形图,但您也可以考虑使用geom_tileZ 映射为fill

ggplot(data = HW1b, aes(x = X, y = Y, fill = Z)) +
  geom_tile(color = "Black") +
  scale_fill_viridis_c()

数据

HW1b <- structure(list(X = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 
                     4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L, 7L, 7L, 7L), Y = c(1L, 2L, 3L, 
                                                                        1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
                                                                        2L, 3L), Z = c(113L, 109L, 105L, 80L, 122L, 88L, 104L, 98L, 93L, 
                                                                                       105L, 99L, 105L, 99L, 105L, 94L, 104L, 110L, 109L, 106L, 93L, 
                                                                                       125L)), row.names = c(NA, -21L), class = c("tbl_df", "tbl", "data.frame"
                                                                                       ))

【讨论】:

  • 努力。但是,这并不能回答问题。他希望 y 轴是 stat = "count" 和由 X 和 Y 分组的图。如果是 aes(y =..count..),则第二种方法可以。
  • @AbdallahAtef 感谢您的评论。我认为stat = "count" 没有意义。 OP 没有说他需要stat = "count"。它恰好是geom_bar 的默认设置。
  • 但他确实提到他希望 X 和 Y 成为分组变量。从逻辑上讲,这意味着它们都不应该在 Y 轴上
  • @www 您在 position = dodge 上的代码不是我考虑的,而是做得更好!谢谢你。话虽如此,我正在尝试将代码并行化为一个简单的“按 X 分组的 Z 条形图”,但我不断地让这些条形交叉;不确定这些甚至代表什么......
【解决方案2】:

您可以在创建分组变量后使用facet_wrap() 执行此操作:

ggplot(HW1b %>% mutate(group = paste(X, Y, sep = "-")), aes(x = Z)) +
geom_bar(color = "Black", fill = "steelblue") +
facet_wrap(~group)

请注意ggplot() 会忽略group_by() 创建的组,因此您不需要代码的第一步

【讨论】:

  • 我尝试使用您的代码,但得到以下结果。
  • HW1b 中的错误 %>% mutate(group = paste(X, Y, sep = "-"), mapping = aes(x = Z)) + : 二元运算符的非数字参数 In另外:警告消息:在 ggplot(data = HW1b %>% mutate(group = paste(X, Y, sep = "-"), : 不兼容的方法 ("Ops.data.frame", "+.gg") “+”
  • 只是少了一个括号。尝试上面的代码(已编辑)。它正在使用提供的数据样本。附加输出
  • 努力,但不是我想要的。我想更好地理解这些问题,因为我目前正在努力制作仅基于 X 的 Z 条形图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多