为啥我的 ggplot2 条形图不显示大于 0 的 ylim 最小值?

Posted

技术标签:

【中文标题】为啥我的 ggplot2 条形图不显示大于 0 的 ylim 最小值?【英文标题】:Why does my ggplot2 bar chart not display with a ylim minimum that is greater than 0?为什么我的 ggplot2 条形图不显示大于 0 的 ylim 最小值? 【发布时间】:2015-12-13 14:09:29 【问题描述】:

我试图在 1 到 5 的范围内绘制答案,我希望我在 ggplot2 中的绘图范围从 1 到 5。但是,当我更改 scale_y_continuous(limits = c(1, 5)) 时,数据消失了。任何想法如何解决这个问题(除了从我的值中减去 1 并重新标记的 hack-y 方式)?

可重现的例子:

dat <- structure(list(year = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 
4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 
4L, 1L, 2L, 3L, 4L), .Label = c("2011", "2012", "2013", "2015"
), class = "factor"), variable = structure(c(1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 
6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L), .Label = c("instructor.knowledge", 
"instructor.enthusiastic", "instructor.clear", "instructor.prepared", 
"instructor.feedback", "instructor.out.of.class", "class.dynamic"
), class = "factor"), value = c(5, 4.75, 5, 4.75, 5, 5, 4.85714285714286, 
4.75, 4.75, 4.75, 4.71428571428571, 3.75, 5, 4.75, 5, 4.5, 5, 
4.75, NA, 5, 5, 5, NA, 4.5, 5, 5, NA, 4.5)), row.names = c(NA, 
-28L), .Names = c("year", "variable", "value"), class = "data.frame")

library(ggplot2)
ggplot(dat, aes(x = variable, y = value, fill = year)) + 
  geom_bar(position = "dodge", stat = "identity") +
  scale_y_continuous(name = "Average score across all respondents",
                     limits = c(1, 5),  # fails
                     # limits = c(0, 5),  # succeeds
                     breaks = 1:5)

【问题讨论】:

什么意思?您将 (0,1) 排除在外。整个数据都消失了? 因为条形图从 0 开始,它们不能在绘图限制之外开始。你可以做+coord_cartesian(ylim=c(1,5)) 【参考方案1】:

您只需要设置oob = rescale_none 参数就可以了:

library(scales)
library(ggplot2)
ggplot(dat, aes(x = variable, y = value, fill = year)) + 
  geom_bar(position = "dodge", stat = "identity") +
  scale_y_continuous(name = "Average score across all respondents",
                     limits = c(1, 5),
                     oob = rescale_none) 

确保附上scales 包以使oob = rescale_none 工作。

【讨论】:

没问题:)。很高兴我能帮上忙! 我希望 ggplot 对越界值的处理,以及改变其行为 (oob) 的方法,更加明显并且有更好的文档记录!【参考方案2】:

作为另一种选择,您的数据可能更容易理解为多面线图:

ggplot(dat, aes(x = year, y = value, group=1)) + 
  geom_point() +
  geom_line() +
  scale_y_continuous(name = "Average score across all respondents",
                     limits = c(1, 5),  # fails
                     # limits = c(0, 5),  # succeeds
                     breaks = 1:5) +
  facet_grid(. ~ variable)

【讨论】:

同意,好主意。在这种情况下,我对时间趋势不感兴趣,只是显示所有年份的平均值都很高,所以我可能会坚持使用条形图。但总的来说,这很聪明,我会牢记在心。

以上是关于为啥我的 ggplot2 条形图不显示大于 0 的 ylim 最小值?的主要内容,如果未能解决你的问题,请参考以下文章

在R ggplot2中将条形图绘制到地图上

Matplotlib 条形图不接受数组作为高度参数

在 ggplot2 中创建显示平均值的分组条形图(我不想手动输入)

ggplot2条形图中的顺序条

R:条形图不一致的宽度

带有facet_grid的ggplot2中带有多个分类变量的堆积条形图