2016-11-04 157 views
0

我使用ggplot2創建帶有標準偏差條的條形圖。我的數據幀是相當大的,但這裏是例如截短版本:如何將我的barplot中的標準偏差條限制爲最大值?

SampleName Target.ID Maj.Allele.Freq SD AVG.MAF 
W15-P2-1 rs1005533 99.74811083 24.98883743 93.70753223 
W15-P2-2 rs1005533 100 24.98883743 93.70753223 
W15-P2-3 rs1005533 100 24.98883743 93.70753223 
W15-P2-4 rs1005533 100 24.98883743 93.70753223 
W15-P2-1 rs1005533 99.94819995 24.98883743 93.70753223 
W15-P2-2 rs1005533 100 24.98883743 93.70753223 
W15-P2-3 rs1005533 100 24.98883743 93.70753223 
W15-P2-4 rs1005533 100 24.98883743 93.70753223 
W21-P2-1 rs1005533 100 24.98883743 93.70753223 
W21-P2-2 rs1005533 100 24.98883743 93.70753223 
W21-P2-3 rs1005533 99.90044798 24.98883743 93.70753223 
W21-P2-4 rs1005533 99.72375691 24.98883743 93.70753223 
W21-P2-1 rs1005533 100 24.98883743 93.70753223 
W21-P2-2 rs1005533 100 24.98883743 93.70753223 
W21-P2-3 rs1005533 100 24.98883743 93.70753223 
W21-P2-4 rs1005533 0 24.98883743 93.70753223 
W15-P2-1 rs10092491 52.40641711 1.340954343 51.8604281 
W15-P2-2 rs10092491 53.69923603 1.340954343 51.8604281 
W15-P2-3 rs10092491 52.56689284 1.340954343 51.8604281 
W15-P2-4 rs10092491 50.11764706 1.340954343 51.8604281 
W15-P2-1 rs10092491 50.30094583 1.340954343 51.8604281 
W15-P2-2 rs10092491 50.96277279 1.340954343 51.8604281 
W15-P2-3 rs10092491 50.94102886 1.340954343 51.8604281 
W15-P2-4 rs10092491 51.2849162 1.340954343 51.8604281 
W21-P2-1 rs10092491 53.56976202 1.340954343 51.8604281 
W21-P2-2 rs10092491 50.27861123 1.340954343 51.8604281 
W21-P2-3 rs10092491 52.8358209 1.340954343 51.8604281 
W21-P2-4 rs10092491 51.42585551 1.340954343 51.8604281 
W21-P2-1 rs10092491 52.77890467 1.340954343 51.8604281 
W21-P2-2 rs10092491 52.89017341 1.340954343 51.8604281 
W21-P2-3 rs10092491 53.70786517 1.340954343 51.8604281 
W21-P2-4 rs10092491 50 1.340954343 51.8604281 

因爲在最後一列(AVG.MAF)能產生標準差條超過最大的100的平均值,該圖顯示的條超出上的100

Example Standard Deviation bars extend beyond 100.

這裏y軸的極限是創建上述情節的代碼:

pe1 = ggplot(half1, aes(x=Target.ID, y=AVG.MAF))+ 
geom_bar(stat = "identity", position = "dodge", colour = "black", 
width = 0.5, fill = "yellowgreen")+xlab("")+ 
ylab("Average Major Allele Frequency")+ 
labs(title="Allele Balance AmpliSeq Identity Sample P2")+ 
geom_errorbar(aes(ymin = AVG.MAF-SD, ymax = AVG.MAF+SD), 
width = 0.4, position = position_dodge(0.9), 
    size = 0.6)+ 
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = .5)) 

我試圖截斷使用coord_cartesian的情節,那種這使劇情看起來像我隱藏一些數據:

Here the top of the standard deviation bars is cut off

這裏是代碼來創建與標準差條情節切斷:

pe1 = ggplot(half1, aes(x=Target.ID, y=AVG.MAF))+geom_bar(stat = "identity", position = "dodge", colour = "black", width = 0.5, fill = "yellowgreen")+xlab("")+ylab("Average Major Allele Frequency")+labs(title="Allele Balance AmpliSeq Identity Sample P2")+geom_errorbar(aes(ymin = AVG.MAF-SD, ymax = AVG.MAF+SD), width = 0.4, position = position_dodge(0.9), size = 0.6)+theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = .5))+coord_cartesian(ylim=c(0,100)) 

似乎必須有一種方法來將標準偏差條限制爲我預期的ymax爲100,並且仍然保持頂部水平條在圖中可見。有誰知道如何做到這一點?

+6

爲什麼要通過截斷標準開發欄的頂部來歪曲標準偏差? – Nate

+1

'... geom_errorbar(aes(ymin = AVG.MAF-SD,ymax = pmin(AVG.MAF + SD,100)...'做你想做的事情?幾乎可以肯定的是, ,可能是因爲使用的基礎錯誤模型是不合適的 – Miff

+0

@NathanDay和Miff你們都給了我一些想法,謝謝你們對你們的意見和可能的解決方案 – aminards

回答

0

除了人在意見中提出的問題,這裏有一些其他方面的考慮:

  1. 你並不需要添加重複的平均值爲您的數據的每一行一列。相反,您可以使用Maj.Allele.Freq中的實際數據值計算並繪製ggplot中的平均值。 (實際上,通過使用y值的列來重複每個Target.ID的平均值,您實際上繪製了平均值的多個副本,一個在另一個之上。)

    您也可以彙總ggplot之外的數據(即計算平均值和標準偏差),然後使用匯總數據框進行繪圖。在更復雜的情況下,這有時是必需的,但您可以在ggplot中完成。

  2. 在我看來,點比這裏的酒吧更好。

下面的代碼同時提供點和酒吧版本,並且還示出了如何添加任一數據的標準偏差或數據的平均值的95%置信區間。藍線表示標準偏差,而紅線表示95%置信區間。

我提供了自舉置信區間。爲了提供經典的正常置信區間,從mean_cl_boot切換到mean_cl_normal

如果您希望y軸下降到零,請添加coord_cartesian(ylim=c(0,150))或您希望的任何最大y值(正如評論所討論的,爲避免誤導性圖形,它應該高於錯誤欄的頂部,不管條形圖是代表SD還是CI)。

ggplot(half1, aes(x=Target.ID, y=Maj.Allele.Freq)) + 
    stat_summary(fun.data=mean_sdl, geom="errorbar", width=0.1, colour="blue") + 
    stat_summary(fun.data=mean_sdl, geom="point", colour="blue", size=3) + 
    stat_summary(fun.data = mean_cl_boot, colour="red", geom="errorbar", width=0.1) + 
    stat_summary(fun.data = mean_cl_boot, colour="red", geom="point") + 
    labs(x="", y="Average Major Allele Frequency", 
     title="Allele Balance AmpliSeq\nIdentity Sample P2") + 
    theme_bw() + 
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = .5)) 

enter image description here

ggplot(half1, aes(x=Target.ID, y=Maj.Allele.Freq)) + 
    stat_summary(fun.y=mean, geom="bar", fill="yellowgreen", colour="black") + 
    stat_summary(fun.data=mean_sdl, geom="errorbar", width=0.1, size=1, colour="blue") + 
    stat_summary(fun.data = mean_cl_boot, colour="red", geom="errorbar", width=0.1, size=0.7) + 
    labs(x="", y="Average Major Allele Frequency", 
     title="Allele Balance AmpliSeq\nIdentity Sample P2") + 
    theme_bw() + 
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = .5)) 

enter image description here

你也可以把兩塊SD和95%CI在同一個情節:

pnp = position_nudge(x=0.1) 
pnm = position_nudge(x=-0.1) 

ggplot(half1, aes(x=Target.ID, y=Maj.Allele.Freq)) + 
    stat_summary(fun.data=mean_sdl, geom="errorbar", width=0.1, position=pnp, aes(colour="SD")) + 
    stat_summary(fun.data=mean_sdl, geom="point", position=pnp, aes(colour="SD")) + 
    stat_summary(fun.data = mean_cl_boot, geom="errorbar", width=0.1, 
       position=pnm, aes(colour="95% CI")) + 
    stat_summary(fun.data = mean_cl_boot, geom="point", position=pnm, aes(colour="95% CI")) + 
    labs(x="", y="Average Major Allele Frequency", colour="", 
     title="Allele Balance AmpliSeq\nIdentity Sample P2") + 
    theme_bw() + 
    theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = .5)) 

enter image description here

+0

我總是在這裏學到新的東西,我不知道我可以從ggplot中進行計算,謝謝你的詳細解答。我可以根據需要進行一些調整,評論者是正確的,切斷SD欄是沒有意義的,但現在我知道如何去做。 – aminards

+0

您可以創建將數據框混亂,然後繪製(在更復雜的情況下有時是必需的,但不在這裏),或者可以在ggplot中進行計算。無論哪種方式,您都不需要添加一個反覆重複平均值的列,實際上這樣做會導致每個條的多個副本被繪製成一個在另一個之上。我已經更新了我的答案來討論這個問題。 – eipi10