2011-04-19 44 views
8

我有一个数据框,我想从它生成一个geom_tile()图,但我希望图表的排序不是基于字母,而是基于此数据框内的变量。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 2011-04-19 16:41:03

+0

@Chase:V1是x轴,V2是y轴,V3是factores,但V1和V2是字符,我想绘制这个数据基于V3排序。我试过这个:test [with(test,order(-V3)),],当我打印数据框时,它将以有序方式打印,但是当我绘制它时,它将根据V1和V2中的字母来绘制,而不是基于订单。 – weblover 2011-04-20 07:01:32

+0

尝试在上面发布的示例代码上运行'str()'。所有三列都是有特色的。如果您要提供示例数据,请使其代表您的真实数据集,它对结果答案产生影响。其次 - 请在你第一次发布信息时多考虑你的问题。它不应该通过评论和编辑采取几个后续行动,以达到你想要的。 – Chase 2011-04-20 13:33:22

回答

16

我通常尝试使用水平手之前解决我的数据:

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() 

enter image description here

UPDATE:

还是关于你的尺寸不完全清楚,但也许是这样的:

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

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

enter image description here

+0

感谢您的帮助,但是我想要的是V1在x轴上,V2在y轴上,V3是数据,我想要基于V3 ,例如(所有大的值将在左上角,小的值在右下) – weblover 2011-04-20 07:03:42

+0

感谢您的帮助,这是我需要的,但它给我一个错误,当我尝试? ('* tmp *',“xp”,value = integer(0))的错误: 替换有0行,数据有7 – weblover 2011-04-20 08:09:54

+0

我能够解决错误,是我的一个错误,但是当我绘制数据时,x轴没有标签(NA)为什么? – weblover 2011-04-20 08:13:57

11

作为对duplicate question的回答,下面是直接使用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 2017-06-13 15:39:27