使用xlim()和facet_wrap(...,scales =“ free_y”)的意外绘图

时间:2019-10-08 12:39:26

标签: r ggplot2

我有一个可以使用mt数据集重现的问题:

require(ggplot2)
mt <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) + geom_point()
mt + facet_wrap(~ cyl, scales = "free_y")
mt + xlim(c(15,30)) + facet_wrap(~ cyl, scales = "free_y")

在第二个图中,如果第三个单元(“ 8”)的y轴上没有点,为什么它们的y轴上升到5.5? 如何使该轴跨度到显示点的实际范围(例如,从3到4.25)? 不是所有通过clim()将c(15,30)的x限制之外的点都设置为NA吗?

2 个答案:

答案 0 :(得分:1)

这里有几点。你把它们剪掉。为了获得更好的比例,您可能需要先filter要点:

mt <- mtcars %>% 
  filter(mpg>=15, mpg<=30) %>% 
  ggplot(aes(mpg, wt, colour = factor(cyl))) + geom_point()
mt + facet_wrap(~ cyl, scales = "free_y")
mt + xlim(c(15,30)) + facet_wrap(~cyl, scales = "free_y")

您得到: enter image description here

答案 1 :(得分:0)

由于ggplot谷歌列表中最近的讨论,我已经理解了这个问题 1

问题是xlim()的结果并没有真正将点(暗示x和y坐标)设置为NA,而是仅将x坐标设置为NA:“相应的y值仍然可用,并且因此用于计算y轴的范围。”

我必须补充一点,尽管xlim()的这种行为非常违反直觉,即使不是不合逻辑的。如果用户设置了xlim(c(15,30),那是因为他/她不想看到该范围内的点,因此应自动适应y限制,或者至少这应该是一种选择, .rm = TRUE。