【发布时间】:2019-06-14 19:48:35
【问题描述】:
我正在尝试绘制 x 轴离散但未按字母顺序排序的图。
我有一个data.frame:
df <- data.frame(x1=factor(c('z1', 'z2', 'z1', 'z2'), levels=c('z3','z2', 'z1')),
x2=factor(c('z1', 'z1', 'z2', 'z3'), levels=c('z3','z2', 'z1')),
y1=c(1,2,3,4),
y2=c(5,6,7,8))
当我使用 geom_point 时,x 轴按因子级别正确排序:
ggplot(df) + aes(x=x1, y=y1) + geom_point(aes(x=x1, y=y1))
当我添加 geom_segment 时,排序会重置为字母顺序。
ggplot(df) + aes(x=x1, y=y1)+ geom_point() + geom_segment(aes(xend=x2, yend=y2))
如何强制 x 轴移动 z3、z2、z1?
【问题讨论】:
-
我不知道为什么会这样切换顺序,但是您可以通过
limits在适当的scale_*_discrete()中设置离散刻度的顺序。由于您的 x 变量已经是具有正确级别顺序的因素,您可以这样做scale_x_discrete(limits = levels(df$x2) ) -
我看到了这个Github issue关于这个话题。虽然它很老,但我认为为什么会发生这种情况的答案可能与那里相关,并且与数据中实际存在的不同因子水平有关(即使您明确将它们设置为具有相同的因子水平)。另见:
scale_x_discrete(drop = FALSE ) -
另一个相关(且已关闭)的问题,Ordered factor levels are rearranged on axis when layers are rearranged,其中
scale_x_discrete(drop = FALSE)“解决了”问题。ggplot(df) + aes(x = x1, y = y1)+ geom_segment(aes(xend = x2, yend = y2)) + scale_x_discrete(drop = FALSE) -
谢谢@aosmith,这行得通。如果您将其发布为答案,我会接受。