轻触变量

时间:2017-01-30 03:49:36

标签: r ggplot2

要显示大量重叠数据,它可能有助于抖动点,以便更好地识别它们。对于离散(不一定是factor)数据,略微偏移整个系列会很有帮助。现在可以使用ggplot2::position_nudge()非常巧妙地完成此操作。据我所知,该函数不接受来自ggplot()调用的NSE变量,因此(如果我错了,一定要纠正我)如果提供变量,则需要指定数据源偏离某些数据结构。

如果我们想要根据另一个值微调一个值,我们可以这样做:

library(ggplot2)
p <- ggplot(mtcars, aes(x = mpg, y = factor(cyl))) + 
  geom_point(aes(col = factor(am)), 
             position = position_nudge(y = 0.1*mtcars$am))
p

尝试在am调用中仅使用position_nudge()失败("non-numeric argument to binary operator")。否则这是可以接受的。

这个问题是facet_wrap在这样的调用上打破了效果,因为可能是,分面代码对此显式数据一无所知

p + facet_wrap(~gear)

有没有办法允许这种情况发生(没有转换为连续,手动移动,然后重新标记轴),还是更合适的功能?如果什么都没有出现,我会在回购中提出一个问题,但我想我应该先咨询一下hivemind。

1 个答案:

答案 0 :(得分:2)

更新:根据评论中的讨论,最好的方法可能是在绘图区域外的位置添加假数据,以便所有因子级别至少有一个数据点。这将导致每个方面都被躲避。例如:

首先,我们将为将成为图中因子的所有变量的所有唯一值添加数据点,但我们将为它们分配mpg值为-1,这超出了绘图区域的范围。真实的数据。

library(ggplot2)
library(ggstance)
library(dplyr)

mtcars = bind_rows(mtcars, 
                   expand.grid(mpg=-1, 
                               cyl=unique(mtcars$cyl), 
                               am=unique(mtcars$am), 
                               gear=unique(mtcars$gear)))

现在我们可以像原始答案那样使用垂直躲避进行绘图,但所有点都将被躲避:

ggplot(mtcars, aes(x = mpg, y = factor(cyl))) + 
  geom_point(aes(col = factor(am)), position = position_dodgev(0.5)) +
  facet_wrap(~gear) +
  coord_cartesian(xlim=range(mtcars$mpg[mtcars$mpg>0]))

enter image description here

原始答案

如果您切换position_dodgex美学,可以使用y,然后添加coord_flip以将cyl放回垂直轴:< / p>

p = ggplot(mtcars, aes(y = mpg, x = factor(cyl))) + 
  geom_point(aes(col = factor(am)), position = position_dodge(0.3)) +
  coord_flip() 

enter image description here

p + facet_wrap(~gear)

enter image description here

另一个选择是使用position_dodgev包中的ggstance,它可以提供垂直躲避,并且无需翻转轴:

library(ggstance)

p = ggplot(mtcars, aes(x = mpg, y = factor(cyl))) + 
  geom_point(aes(col = factor(am)), position = position_dodgev(0.3))

虽然没有必要,但是如果你在aes内进行,那么像原始方法这样的东西可以工作,这样所有的ggplot组件都可以知道映射。例如:

ggplot(mtcars, aes(x = mpg, y = cyl + 0.2*(am - mean(am)))) + 
  geom_point(aes(col = factor(am))) +
  scale_y_continuous(breaks=unique(mtcars$cyl), minor_breaks=NULL) +
  facet_wrap(~ gear)