2013-06-02 82 views
2

我有一個稠密的散點圖,我想控制繪製點的順序,因爲使用alpha不起作用 - 基本上,少數我希望被繪製在「最上面」的點。這聽起來像是控制ggplot2中這個點的「z順序」的唯一方法就是使用圖層。我有以下內容:控制點的順序,並結合ggplot2/rpy2中多個圖層的圖例

df <- data.frame(x=rnorm(10000),y=rnorm(10000)) 
df$g <- c("1") 
df[500,]$g <- c("special") 
df[600,]$g <- c("special2") 
ggplot(df) + geom_point(aes(x=x, y=y, colour=g)) 

這會在g列中顯示一個很好的圖例。這裏的值爲「special」,「special2」的點恰好被繪製在其餘點的頂部,但很多時候這是不正確的,在這種情況下,我試圖將數據幀分解成多個層,每層繪製一個之一,以確保我得到點的順序:

df1 <- df[df$g == "special",] 
df2 <- df[df$g == "special2",] 
df3 <- df[df$g == "1",] 
# plot layer by layer 
p <- ggplot() + geom_point(aes_string(x=x,y=y), data=df1, color="red") 
p <- p + geom_point(aes_string(x=x, y=y), data=df2, color="green") 
p <- p + geom_point(aes_string(x=x, y=y), data=df3, color="blue") 

這個工作,但隨後沒有傳說中不像在DF繪製只colour=g第一種情況中。我怎樣才能讓傳說展現出來?

還有,有沒有更簡單的方法來做到這一點?除分層問題外,最初的調用是完美的。有沒有辦法告訴ggplot的順序,例如

ggplot(df) + geom_point(aes(x=x, y=y, colour=g), order=c("1", "special", "special2")) 

以表示它應該首先繪製的所有點與g1,那麼所有與gspecial等棒打數據幀到單獨的一個,並使用層,然後指定圖例中的點是手動一個巨大的痛苦只是爲了控制繪製點的順序。在簡單的第一個電話中,ggplot也會照顧你非常好的顏色。謝謝。

ps我使用rpy2來製作這些圖,但是我展示了R,因爲翻譯(通常)很容易理解爲rpy2,但是rpy2解決方案會更好。

回答

4

geom_point的訂單取決於您的數據的順序。換句話說,數據幀底部的數據點將被最後繪製。

這指向一個簡單的解決方案:繪製之前排序數據幀:

df <- df[order(df$g), ] 
df$size <- df$g != 1 
ggplot(df) + geom_point(aes(x=x, y=y, colour=g, size=size)) 

enter image description here

然而,在許多情況下,僅僅是易於使用不同的圖層,只要在建議您題。在這種情況下,你仍然可以使用aes參數指定色標:

ggplot() + 
    geom_point(data=df[df$g==1, ], aes(x=x, y=y, colour=g), size=1) + 
    geom_point(data=df[df$g!=1, ], aes(x=x, y=y, colour=g), size=5) 

enter image description here