2011-09-26 74 views
8

我一直在ggplot2中遇到這個問題,也許有人可以幫助我。在不改變積分順序的情況下重新排序圖例

我有一個情節,圖例中變量的順序與它們在情節中的顯示順序相反。

例如:

df=data.frame(
mean=runif(9,2,3), 
Cat1=rep(c("A","B","C"),3), 
Cat2=rep(c("X","Y","Z"),each=3)) 

dodge=position_dodge(width=1) 
ggplot(df,aes(x=Cat1,y=mean,color=Cat2))+ 
geom_point(aes(shape=Cat2),size=4,position=dodge)+ 
scale_color_manual(values=c("red","blue","black"))+ 
scale_shape_manual(values=c(16:19))+ 
coord_flip() 

生產:

example

所以點被顯示在情節作爲CAT2 = Z,Y,然後X(黑鑽石,藍色三角形,紅圓形),但在圖例中它們顯示爲Cat2 = X,Y,然後Z(紅色圓圈,藍色三角形,黑色菱形)。

如何在不改變圖上的點的情況下顛倒圖例的順序?重新排列該因素會產生相反的問題(圖上的點是相反的)。

謝謝!

+2

現在,可能沒有簡單的方法。不過,下一個版本可能會有一個反轉圖例順序的選項。 – kohske

+0

嗯,那太臭了。很高興知道。感謝您的領導! – jslefche

+1

設置比例尺「休息」。 – hadley

回答

0

據我瞭解你想要達到的目標,這個簡單的操控確實爲我的伎倆:

  1. 定義CAT2的一個因素(在適當的順序水平)和
  2. 恰克的顏色和形狀的以匹配水平順序(在scale_manual命令)

下面是代碼做到這一點:

library(ggplot2) 

df=data.frame(
    mean=runif(9,2,3), 
    Cat1=rep(c("A","B","C"),3), 
    Cat2=factor(rep(c("X","Y","Z"),each=3), levels=c('Z', 'Y', 'X'))) 

dodge=position_dodge(width=1) 
ggplot(df,aes(x=Cat1,y=mean,color=Cat2))+ 
    geom_point(aes(shape=Cat2),size=4,position=dodge)+ 
    scale_color_manual(values=c("black","blue","red"))+ 
    scale_shape_manual(values=c(18:16))+ 
    coord_flip() 
+0

唉,當我埋在我的問題的最後,扭轉因素顛倒傳說,但也扭轉了劇情上的點(紅圈現在是第一個)。我想保留劇情上的點的順序,但要顛倒傳說。我已經使用了你的解決方案,並將圖例複製到第一個圖上。不雅,但必須這樣做。謝謝你的洞察力! – jslefche

3

爲了充實哈德利的意見,我們會做這樣的事情:

ggplot(df,aes(x=Cat1,y=mean,color=Cat2))+ 
geom_point(aes(shape=Cat2),size=4,position=dodge)+ 
scale_color_manual(values=c("red","blue","black"),breaks = c('Z','Y','X'))+ 
scale_shape_manual(values=c(16:19),breaks = c('Z','Y','X'))+ 
coord_flip() 

enter image description here

請注意,我們必須設定斷裂處尺度。如果我們只做了一個,它們就不會匹配,ggplot會將它們分成兩個傳說,而不是合併它們。

+0

如果您有多個手動秤,例如'scale_fill_manual','scale_color_manual'和'scale_shape_manual',並且您希望更改標籤,您需要爲所有標籤提供相同的標籤,這可能非常乏味(比如說6個變量和6個長解釋標籤)。沒有別的辦法,是嗎? – PatrickT

相關問題