要显示大量重叠数据,它可能有助于抖动点,以便更好地识别它们。对于离散(不一定是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。
答案 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]))
原始答案
如果您切换position_dodge
和x
美学,可以使用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()
p + facet_wrap(~gear)
另一个选择是使用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)