ggplot2:如何在轴上更改因子变量的显示顺序

22

当我使用ggplot2中的geom_tile()和离散比例尺时,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标签不同:

enter image description here

我希望将标签从上到下、从左到右按字母顺序排序。是否有快速的方法可以实现?


2
你可能还想在当前的 scale_colour_gradient 命令中添加 limits = c(0, 1) - 目前,1 超出了比例尺的限制,在图例中没有正确着色。 - hadley
@hadley:太好了,谢谢!那可能会是我的第二个问题 ;) - Seb
如何完全不排序y轴标签?例如,如果我有月份J,F,M,A,M。它会自动排序。是否可以覆盖此默认行为?谢谢。 - mindlessgreen
@Roy 据我所记是因为因素水平的问题。但这可能值得创建一个新问题来讨论! - Seb
2个回答

34

这里的重要点是因子水平的顺序。在级别中的顺序也是图表中的顺序。您可以使用rev来反转级别的顺序,像这样(请注意,我只重新排列数据帧中的一列):

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

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


谢谢你的快速帮助!但是这样不会改变x轴和y轴吗?x轴应该保持原样。或者我理解错了吗? - Seb
您可以单独更改数据框中每个变量的级别顺序。只需反转您需要的即可。 - Paul Hiemstra
当然!谢谢 - melt() 命令的产物是需要改变的关键点!非常出色和快速的解决方案 - 一如既往。此外,澄清还有所帮助! - Seb

7

对于那些不想修改底层数据中因子顺序的情况,可以使用 scale_y_discretelimits 参数来获得相同的结果:

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

给出这个输出:

输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接