2013-12-16 39 views
3

我很抱歉,如果這是更多的SO而不是CV。ggplot2 - boxplot同時停留多個data.frames

我正在嘗試將第二個boxplot包含到已繪製值的平均值排序的現有boxplot中。當我從第二個data.frame(代表一個控制樣本到其他圖)中包含boxplot時,原始圖將失去其排序。

下面是一個例子:

x1 <- data.frame("V1" = runif(100, 0, 100), "siteno" = "X1") #mean = 50.3 
x2 <- data.frame("V1" = runif(100, 200, 450), "siteno" = "X2") #mean = 322.4 
x3 <- data.frame("V1" = runif(100, 50, 150), "siteno" = "X3") #mean = 97.8 
xData <- rbind(x1,x2,x3) 
xData$siteno <- with(xData, reorder(siteno, V1, mean)) 

zData <- data.frame("V1" = runif(300, 0, 450), "siteno" = "Z1") #mean = 224.2 

#orders xData correctly 
ggplot(xData, aes(x = siteno , y = V1)) + 
stat_summary(fun.y=mean, colour="red", geom="point") + 
geom_boxplot (aes(fill=siteno), alpha=.5, width=1, position = position_dodge(width = 1), outlier.colour = "dark gray", outlier.size = 1) 

這將產生以下情節與變量x的平均正確排序:

correctly ordered boxplots

如果我嘗試下面的代碼添加的控制數據, x變量的順序丟失:

x1 <- data.frame("V1" = runif(100, 0, 100), "siteno" = "X1") #mean = 50.3 
x2 <- data.frame("V1" = runif(100, 200, 450), "siteno" = "X2") #mean = 322.4 
x3 <- data.frame("V1" = runif(100, 50, 150), "siteno" = "X3") #mean = 97.8 
xData <- rbind(x1,x2,x3) 
xData$siteno <- with(xData, reorder(siteno, V1, mean)) 

zData <- data.frame("V1" = runif(300, 0, 450), "siteno" = "Z1") #mean = 224.2 

#orders xData correctly 
ggplot(xData, aes(x = siteno , y = V1)) + 
stat_summary(fun.y=mean, colour="red", geom="point") + 
geom_boxplot (aes(fill=siteno), alpha=.5, width=1, position = position_dodge(width = 1), outlier.colour = "dark gray", outlier.size = 1) + 
geom_boxplot(data=zData, aes(x = siteno , y = V1)) 

這將產生以下情節沒有排序的變量x: incorrectly ordered boxplots

我圖的一點是要展示由他們的平均命令的測試值,然後有值箱圖關,爲視覺參考權的控制。我想可能有一個解決方案結合了xData和zData數據框;如果有一些建議,我願意嘗試。 謝謝你的時間。

+0

爲什麼不ggplot名單上問? –

回答

2

當您使用兩個數據幀合併一個繪圖中的數據時,原始級別(和順序)將丟失,並且使用比兩個數據幀合併數據的新級別。您不會爲填充值獲取此行爲,因爲您沒有爲第二個數據框提供填充參數。但是對於離散x尺度,兩個數據幀都是組合的,並且新的級別是X1,X2,X3Z1

沒有從所有價值做出一個數據幀就可以使用scale_x_discrete()然後在參數limits=使用功能levels()得到的siteno水平的原始順序,並結合Z1它的參考水平。

ggplot(xData, aes(x = siteno , y = V1)) + 
    stat_summary(fun.y=mean, colour="red", geom="point") + 
    geom_boxplot (aes(fill=siteno), alpha=.5, outlier.colour = "dark gray", 
                outlier.size = 1) + 
    geom_boxplot(data=zData, aes(x = siteno , y = V1))+ 
    scale_x_discrete(limits=c(levels(xData$siteno),"Z1")) 

enter image description here

+0

感謝您的解決方案和一個很好的解釋。 'scale_x_discreet'就像一個魅力。 –

1

爲什麼不添加它們都在同一個data.frame和秩序,所有4個級別?

data2 <- rbind(xData, zData) 
ggplot(data2, aes(x = siteno , y = V1)) + 
stat_summary(fun.y=mean, colour="red", geom="point") + 
geom_boxplot (aes(fill=siteno), alpha=.5, width=1, 
       position = position_dodge(width = 1), 
       outlier.colour = "dark gray", outlier.size = 1) 

enter image description here

+1

感謝您提供這個有用的建議。我使用了以前的解決方案,以便我可以更好地控制控件樣本boxplot的外觀。但毫無疑問,你的方法將會順利完成。 –

0

捕捉希望的順序,例如,像:

ord <- xvars[order(mean(xvars))] 

然後使用scale_x_discrete()

+0

謝謝里卡多。你的解決方案,就像Didzis的上述工作一樣。 –