【问题标题】:Order of x-axis with geom_segmentx 轴与 geom_segment 的顺序
【发布时间】: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,这行得通。如果您将其发布为答案,我会接受。

标签: r ggplot2


【解决方案1】:

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

您可以使用scale_x_discrete(limits = levels(df$x2) )scale_x_discrete(drop = FALSE) 作为解决方法。

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

【讨论】:

  • 无论出于何种原因,drop = FALSE 对我不起作用,我不得不使用scale_x_discrete(limits = levels(df$x2)) 的其他建议(或在我的问题中的等价物)。请注意,x2 属性与 xend 美学相匹配。
  • @Andrew 这个例子仍然为我运行,输出与 ggplot2 3.2.1 相同。 drop = FALSE 在此示例或您自己的数据上是否无法为您工作?
猜你喜欢
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 2018-03-09
  • 1970-01-01
相关资源
最近更新 更多