Как ограничить бары стандартного отклонения в барплоте максимальным значением?

Я создаю barplots с использованием баров стандартного отклонения ggplot2. Мой фрейм данных довольно большой, но вот усеченная версия, например:

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, на графике показаны бары за пределами предела на оси y 100.

Пример бары стандартного отклонения выходят за пределы 100.

Вот код для создания вышеуказанного участка:

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, но этот вид делает участок похожим на то, что я скрываю некоторые данные:

Здесь верхняя часть баров стандартного отклонения отрезана

Вот код для создания графика с отрезанными столбцами стандартного отклонения:

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 и все еще держать верхнюю горизонтальную полосу видимой на графике. Кто-нибудь знает, как это сделать?

1 ответ

  1. В дополнение к вопросам, которые люди подняли в комментариях, Вот несколько других соображений:

    1. Нет необходимости добавлять столбец, повторяющий среднее значение для каждой строки данных. Вместо этого можно рассчитать и построить среднее значение в ggplot, используя фактические значения данных в Maj.Allele.Freq. (Фактически , используя столбец для значения 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)) 
    

    Введите описание изображения здесь

    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))   
    

    Введите описание изображения здесь

    Вы также можете поместить 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))
    

    Введите описание изображения здесь