【问题标题】:ggplot2: change order of display of a factor variable on an axisggplot2:更改轴上因子变量的显示顺序
【发布时间】:2016-12-07 01:31:44
【问题描述】:

当我使用 geom_tile()ggplot2 和离散刻度时,标签在 x 轴上按升序排列,在 y 轴上按降序排列:

#some sample data
a <- runif(400)
a <- matrix(a, ncol=20)
colnames(a) <- letters[seq( from = 1, to = 20 )]
rownames(a) <- letters[seq( from = 1, to = 20 )]
a <- melt(a)

当我绘制数据框 a 时:

ggplot(a, aes(X1, X2, fill = value)) + geom_tile() + 
scale_fill_gradient(low = "white",  high = "black", breaks=seq(from=0, to=1, by=.1), name="value") + 
opts(axis.text.x=theme_text(angle=-90, hjust=0)) +
scale_x_discrete(name="") + scale_y_discrete(name="") 

x 和 y 的坐标标记不同:

我想让标签从上到下从左到右从 a-z 排序。有没有快速的方法来做到这一点?

【问题讨论】:

  • 您可能还想在当前的scale_colour_gradient 命令中添加一个limits = c(0, 1) - 目前1 超出了比例的限制,并且在图例中没有正确着色。
  • @hadley:非常感谢!这可能是我的第二个问题;)
  • 如何完全不订购 y 标签?如果我有几个月,例如 J、F、M、A、M。它会自动排序。是否可以覆盖此默认行为?谢谢
  • @Roy 我记得这是一个因素水平的问题。但这可能值得创建一个新问题!

标签: r ggplot2


【解决方案1】:

这里的重点是因子水平的顺序。级别中的顺序也是情节中的顺序。您可以使用rev 像这样反转级别的顺序(请注意,我只是重新排序 data.frame 中的一列):

df$X1 = with(df, factor(X1, levels = rev(levels(X1))))

根据需要使用此语法对因子重新排序。

【讨论】:

  • 感谢您的快速帮助!但这不会改变 x y 轴。 x 轴应保持原样。还是我做错了什么?
  • 您可以分别更改 data.frame 中每个变量的级别顺序。只需反转您需要的那些。
  • 当然!谢谢 - melt() 命令的产品是改变的重点!出色而快速的解决方案 - 一如既往。澄清还有帮助!
【解决方案2】:

对于您不希望修改基础数据中因子顺序的情况,您可以使用scale_y_discretelimits 参数获得相同的结果:

ggplot(a, aes(X1, X2, fill = value)) +
  geom_tile() + 
  scale_y_discrete(name="", limits = rev(levels(a$X2)))

给出这个输出:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 2022-01-13
    • 2018-12-10
    相关资源
    最近更新 更多