2011-04-19 47 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