2013-12-08 88 views
4

我想從數據框中的兩個序列'Pos'和'Neg'(y值)產生一個圖。 x值在'平均值'列中。我希望系列具有不同的顏色。使用aes_string時ggplot2中的兩個geom_point()的顏色

搜索stackoverflow給了我一個類似的問題:change color for two geom_point() in ggplot2,但我想使用aes_string爲了避免在檢查包時的注意事項。

我得到它使用aes和'自動'的顏色,如下面的第一個例子。但是,我無法弄清楚如何使用aes_string生成相同的繪圖,並且仍然讓ggplot決定顏色。我覺得這應該是一個簡單的事情......

重複的例子:

exData <- data.frame(Marker = rep("TH01", 10), 
       Mean = seq(1:10), 
       Neg = -1*runif(10,0.1,1), 
       Pos = runif(10,0.1,1)) 

# Produce the correct plot, with 'automatic' colours. 
gp <- ggplot(exData, aes_string(x="Mean"), 
      shape=val_shape, alpha=val_alpha) 
gp <- gp + geom_point(aes(y=Pos, colour="Max")) 
gp <- gp + geom_point(aes(y=Neg, colour="Min")) 
gp <- gp + scale_colour_discrete(name = "Legend") 
print(gp) 

# Produce the correct plot, but not with 'automatic' colours. 
gp <- ggplot(exData, aes_string(x="Mean"), 
      shape=val_shape, alpha=val_alpha) 
gp <- gp + geom_point(aes_string(y="Pos"), colour=1) 
gp <- gp + geom_point(aes_string(y="Neg"), colour=2) 
gp <- gp + scale_colour_discrete(name = "Legend") 
print(gp) 
+0

對不起,做了最後一項改動,但忘了一個......現在修復了。 –

回答

3

你的數據被格式化的方式是不理想的ggplot2。先將其轉換爲 「長」 格式:

library(reshape2) 
exData.m <- melt(exData, id.vars=c("Marker", "Mean")) 

ggplot(exData.m, aes(x=Mean, y=value, color=variable)) + geom_point() 

Result of plot

作爲一個經驗法則,每個審美(X,Y,顏色,形狀,α,...)需要在一列數據幀被繪製。 reshape2庫在這裏很有幫助。

+0

感謝您的好解釋! –

0

若要直接回答您的問題,請在您的第一張圖ggplot中組裝所有顏色標示(此處爲「最大」和「最小」),並將它們視爲一個因子。然後它使用默認的調色板,在對this question的響應中以及在Cookbook for R中進行了精美的描述。所以「Max」被視爲具有兩種顏色的默認調色板中的第一種顏色。

在第二個圖中,您指定了顏色編號(整數)。在這種情況下,ggplot恢復爲默認R色的調色板,它可以如下所示:

y <- 1:6 
barplot(y,col=y) 

要獲得默認顏色與aes_string(...)使用由@krlmlr中描述的方法。

+0

謝謝,這也有幫助。 –

相關問題