2012-04-05 14 views
18

我偶然發現了這個奇怪的行爲,用ggplot2s排序的傳說,只是無法弄清楚自動放置傳說的邏輯是什麼是:多個圖例/指南的排序(什麼是自動邏輯以及如何更改它?)

我的目標:在一個有多個比例的情節中,我想按照與自動不同的(主題)順序排列它們。但是我在opts()或guides()中找不到一個命令來爲我執行此操作。只是要清楚:我不想改變傳說中的項目,這很好,但多個完整的傳說的安排。

所以我首先假設它們按類型排序,即比例,顏色等。但事實並非如此,它們的位置發生了變化(見下文)。

按字母順序?

library(ggplot2) ## v0.9 

    ## Scale_colour on top 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) + 
    scale_size(name = "A") + scale_colour_discrete(name = "B") 

    ## Reverse names --> scale_colour on bottom 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) + 
    scale_size(name = "B") + scale_colour_discrete(name = "A") 

    ## Change name B to C --> scale_colour on bottom 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) + 
    scale_size(name = "C") + scale_colour_discrete(name = "A") 

    ## Change name B to D --> scale_colour on top 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class) + 
    scale_size(name = "D") + scale_colour_discrete(name = "A") 

scale_colour(用於交換scale_size名)

  • 「E」 的另外的位置編號:底部
  • 「F」 - 「L」:頂部
  • 「M」 - 「N」:底部

並且它繼續出現在頂部和底部。

因子順序?

## From top to bottom: C - B - A 
    fname <- factor(c("A","B","C"), levels = c("A","B","C")) 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl) + 
    scale_size(name = fname[1]) + scale_colour_discrete(name = fname[2]) + scale_alpha(name=fname[3]) 

    ## From top to bottom: B - C - A 
    fname <- factor(c("A","B","C"), levels = c("C","B","A")) 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl) + 
    scale_size(name = fname[1]) + scale_colour_discrete(name = fname[2]) + scale_alpha(name=fname[3]) 

    ## From top to bottom: B - C - A 
    fname <- factor(c("A","B","C"), levels = c("B","C","A")) 
    qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl)+ 
    scale_size(name = fname[1]) + scale_colour_discrete(name = fname[2]) + scale_alpha(name=fname[3]) 

標題的長度是多少?編號 現在我將停止使用示例代碼,但是也會產生與字符長度無關的波動順序。

任何想法?

+1

有趣的是,對於第一組示例,爲每個名稱預留一個空格*會導致圖例以字母順序出現。 (即:'scale_size(name =「B」)+ scale_colour_discrete(name =「C」)')。 *儘管如此,當有兩個以上的傳說被安排時,這種方法再次失敗...... – 2012-04-05 21:18:17

+1

我會對這個問題的答案非常感興趣,儘管我懷疑它會需要像Kohske或Hadley這樣的人來衡量。我從郵件列表中找不到任何關於此的討論,但似乎應該在某個時候出現。 – joran 2012-04-05 21:28:07

+0

不幸的是,現在圖例框的順序取決於它們的「哈希」,所以沒有辦法預測順序......肯定這是我實現的不好主意。我(或Hadley或WCH)將在未來版本中解決此問題。 – kohske 2012-04-06 00:12:12

回答

17

正如我在上面的評論中提到的,沒有辦法控制和預測圖例框的位置。 我沒有意識到這個問題。感謝您澄清這一點。

也許有人需要控制的傳說中,這裏我把速戰速決:

# run this code before calling ggplot2 function 
guides_merge <- function(gdefs) { 
    gdefs <- lapply(gdefs, function(g) { g$hash <- paste(g$order, g$hash, sep = "z"); g}) 
    tapply(gdefs, sapply(gdefs, function(g)g$hash), function(gs)Reduce(guide_merge, gs)) 
} 
environment(guides_merge) <- environment(ggplot) 
assignInNamespace("guides_merge", guides_merge, pos = "package:ggplot2") 

,然後你可以使用order論據guide_legend(也guide_colorbar),

# specify the order of the legend. 
qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl)+ 
guides(size = guide_legend(order = 1), colour = guide_legend(order = 2), alpha = guide_legend(order = 3)) 

qplot(data = mpg,x = displ, y = cty, size = hwy, colour = class, alpha = cyl)+ 
guides(size = guide_legend(order = 3), colour = guide_legend(order = 1), alpha = guide_legend(order = 2)) 

order參數應該是一個正整數。傳說是按照順序排列的。 請注意,這是一個快速修復,因此界面可能會在ggplot2的下一個正式版本中更改。

+6

Kohske提供了此答案的更新版本(它使用在ggplot2中實現的更改因爲這個答案被給出)在http://stackoverflow.com/a/11397958/892313 – 2012-07-09 16:38:21

相關問題