在geom_tile中对数据进行排序

13

我有一个数据框,想要从中生成一个geom_tile()图,但是我希望图表的排序不是按照字母顺序,而是基于数据框内部的某个变量。

structure(list(V1 = c("a", "y", "w", "p", "v", "h", "i"), 
    V2 = c("r", "w", "q", "m", "l", "q", "g"), V3 = c( 
    "5", "2", "9", "2", "1", "3", "0")), .Names = c("V1", "V2", 
"V3"), class = "data.frame", row.names = c(NA, -8L))

我希望根据变量V3对图形进行排序,因为正常绘图会根据V1V2中的字母顺序对它们进行排序。

如何实现?


2
那么X轴和Y轴是什么?V1和V2?它们是因素吗?基于V3重新排序是什么意思?您的示例数据表明它们都是字符类,这对我来说似乎很奇怪。您尝试了哪些代码?为什么它不能按照您想要的方式工作?期望的输出是什么?您必须帮助我们帮助您...没有人会读取您的想法。 - Chase
@Chase:V1 是 x 轴,V2 是 y 轴,V3 是因子,但 V1 和 V2 是字符。我想按照 V3 的顺序绘制这些数据。我尝试了这个:test[with(test, order(-V3)), ],当我打印数据框时,它会按顺序打印,但是当我绘图时,它会根据 V1 和 V2 中的字母顺序绘制,而不是按顺序绘制。 - weblover
尝试在你上述发布的示例代码中运行str()。所有三列都是字符类。如果您要提供示例数据,请确保它代表您真实的数据集,它会影响结果答案。其次,请在首次发布问题时更加思考您包含的信息。这不应该需要通过评论和编辑进行多次跟进才能得到您想要的核心内容。 - Chase
2个回答

19

通常我会在处理数据之前尝试使用级别来修复它:

x <- structure(list(V1 = c("a", "y", "w", "p", "v", "h", "i"), 
    V2 = c("r", "w", "q", "m", "l", "q", "g"), V3 = c( 
    "5", "2", "9", "2", "1", "3", "0")), .Names = c("V1", "V2", 
"V3"), class = "data.frame", row.names = c(NA, -8L))

x <- x[1:7,]

x$V1 <- factor(x$V1, levels=(x$V1)[order(x$V3)])

# Note it's not an ordered factor, it's a factor in the right order

ggplot(x, aes(V1, V3)) + geom_tile()

输入图像描述

更新:

还不太清楚你的尺寸,但或许可以像这样:

x$V2 <- factor(x$V2, levels=(x$V2)[order(x$V3)])

ggplot(x, aes(V1,V2,fill=V3)) + geom_tile() 

输入图像描述


谢谢你的帮助,但是我想要的是V1在x轴上,V2在y轴上,V3是数据,并且我想要该图像根据V3进行排序,例如(所有大值将位于左上角,小值将位于右下角)。 - weblover
谢谢你的帮助,这正是我所需要的,但是当我尝试时它给了我一个错误?? 在 $<-.data.frame(*tmp*, "xp", value = integer(0)) 中出现错误: 替换行数为0,数据有7行。 - weblover
我已经成功解决了错误,这是我的一个错误。但是当我绘制数据时,x轴没有标签,只有(NA),为什么? - weblover
上面的步骤仍然是必要的 x <- x[1:7,](提取前7行)。不确定为什么,但您的结构在底部(第8行)抛出了一个NA行。这就是为什么NA会出现的原因。 - Brandon Bertelsen

19

作为对重复问题的回答,这里提供了一种直接使用ggplot的解决方案,并且不需要更改数据。

x <- structure(list(V1 = c("a", "y", "w", "p", "v", "h", "i"), 
                    V2 = c("r", "w", "q", "m", "l", "q", "g"), 
                    V3 = c( "5", "2", "9", "2", "1", "3", "0")), 
               .Names = c("V1", "V2", "V3"), class = "data.frame", 
               row.names = c(NA, -8L))

x <- x[1:7,]

ggplot(x, aes(V1, V2, fill=V3)) + geom_tile() +
  scale_x_discrete(limits=(x$V1)[order(x$V3)]) + 
  scale_y_discrete(limits=(x$V2)[order(x$V3)])

1
标题的宽度会随着这个解决方案而改变,需要进行调整。 - user1700890

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