R x轴与geom_段的顺序

R x轴与geom_段的顺序,r,ggplot2,R,Ggplot2,我试图画一个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),

我试图画一个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_段
时,顺序将重置为字母顺序

ggplot(df) + aes(x=x1, y=y1)+  geom_point() + geom_segment(aes(xend=x2, yend=y2))


如何强制x轴转到z3、z2、z1?

这与每个
x
变量具有不同的因子水平有关(一些讨论和讨论)

您可以使用
scale\u x\u discrete(限制=级别(df$x2))
scale\u x\u discrete(drop=FALSE)
作为解决方法

ggplot(df) +  
    aes(x=x1, y=y1) +
    geom_point() + 
    geom_segment(aes(xend=x2, yend=y2)) +
    scale_x_discrete(drop = FALSE )

我不确定它为什么会这样切换顺序,但您可以通过相应的
scale\u*\ u discrete()
中的
limits
设置离散比例的顺序。由于您的x变量已经是具有正确级别顺序的因子,您可以执行
scale\u x\u discrete(limits=levels(df$x2))
我在本主题中看到了这一点。虽然这是一个古老的问题,但我认为关于为什么会发生这种情况的答案可能与此相关,并且与数据中实际存在的不同因子水平有关(即使您明确地将它们设置为具有相同的因子水平)。另请参见:
scale\u x\u discrete(drop=FALSE)
另一个相关(已关闭)问题,其中
scale\u x\u discrete(drop=FALSE)
解决了该问题<代码>ggplot(df)+aes(x=x1,y=y1)+geom_段(aes(xend=x2,yend=y2))+scale_x_离散(drop=FALSE)谢谢@aosmith,这很有效。如果你把它作为一个答案发布,我会接受它。无论出于什么原因,
drop=FALSE
对我不起作用,我不得不使用另一个建议
scale\u x\u discrete(limits=levels(df$x2))
(或我问题中的等效建议)。请注意,
x2
属性与
xend
属性匹配。对于我来说,这个示例仍然使用与ggplot2 3.2.1相同的输出运行。
drop=FALSE
对本例或您自己的数据无效吗?
ggplot(df) +  
    aes(x=x1, y=y1) +
    geom_point() + 
    geom_segment(aes(xend=x2, yend=y2)) +
    scale_x_discrete(drop = FALSE )