为啥我的 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 最小值?的主要内容,如果未能解决你的问题,请参考以下文章