Панель ошибок дублирована для ggplot barplot - PullRequest
0 голосов
/ 03 октября 2018

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

abun_all <- data.frame("Tree.genus" = c(rep("Acer", 5), rep("Betula", 5), rep("Larix", 5), rep("Picea", 5), rep("Pinus", 5), rep("Quercus", 5)),
               "P.sampled" = c(sample(c(seq(from = 0.001, to = 0.06, by = 0.0005)), 30)),
               "Insects.sampled" = c(sample(c(seq(from = 1.667, to = 533, by = 1.335)), 30)),
               "Category" = as.factor(c(sample(c(seq(from = 1, to = 3, by = 1)), 30, replace = T))),
               "P.sampled_mean" = c(sample(c(seq(from = 0.006, to = 0.178, by = 0.0005)), 30)),
               "P.sampled_sd" = c(sample(c(seq(from = 0.004, to = 0.2137, by = 0.0005)), 30)))

ggplot(data = abun_all, aes(x = as.factor(Tree.genus), y = P.sampled , fill = Category)) +
geom_bar(stat = "identity", position = position_dodge(1)) +
geom_errorbar(aes(ymin = P.sampled - (P.sampled_mean+P.sampled_sd), ymax = P.sampled + (P.sampled_mean+P.sampled_sd)), width = 0.1, position = position_dodge(1)) + scale_fill_discrete(name = "Category",
                  breaks = c(1, 2, 3),
                  labels = c("NrAm in SSM", "NrAm in FR", "Eurp in FR")) +
xlab("Genus") + ylab("No. of Focus sp. per total insect abundance")

ПРИМЕЧАНИЕ. Значения являются случайными и не представляют фактические данные, но их должно быть достаточно для демонстрации проблемы!

Проблема, похоже, заключается вэта полоса ошибок построена для количества входов каждого Tree.genus в категорию.Как мне заставить это работать?

Редактировать: я создал еще один Df вручную, используя только максимальные значения каждой комбинации P.sampled, и теперь график выглядит так, как я хочу (за исключением двух отсутствующих панелей ошибок).

abun_plot <- data.frame("Tree.genus" = rep(genera, each = 3),
                      "P.sampled" = c(0.400000000, 0.100000000, 0.500000000, 0.200000000, 0.100000000, 0.042857143, 0.016666667, 0.0285714286, 0.0222222222, 0.020000000, 0, 0.010000000, 0.060000000, 0.025000000, 0.040000000, 0.250000000, 0.150000000, 0.600000000),
                      "Category" = as.factor(rep(c(1,2,3), 3)),
                      "P.sampled_SD" = as.numeric(c(0.08493057, 0.02804758, 0.19476489, 0.04533747, 0.02447665, 0.01308939, 0.004200168, "NA", 0.015356359, 0.005724859, "NA", "NA", 0.01633612, 0.01013794, 0.02045931, 0.07584737, 0.05760980, 0.21374053)),
                      "P.sampled_Mean" = as.numeric(c(0.07837134, 0.05133333, 0.14089286, 0.04537983, 0.02686200, 0.01680721, 0.005833333, 0.028571429, 0.011363636, 0.01101331, "NA", 0.01000000, 0.02162986, 0.01333333, 0.01668582, 0.08705221, 0.04733333, 0.17870370)))

ggplot(data = abun_plot, aes(x = as.factor(Tree.genus), y = P.sampled , fill = Category)) +
geom_bar(stat = "identity", position = position_dodge(1)) +
geom_errorbar(aes(ymin = P.sampled - P.sampled_SD, ymax = P.sampled + P.sampled_SD), width = 0.1, position = position_dodge(1)) +
scale_fill_discrete(name = "Category",
                    breaks = c(1, 2, 3),
                    labels = c("NrAm in SSM", "NrAm in FR", "Eurp in FR")) +
xlab("Genus") + ylab("No. of Focus sp. per total insect abundance")

Поскольку выполнение этого вручную занимает много времени, и некоторые другие графики имеют ту же проблему, я бы предпочел работать с оригинальным df (abun_all).Могу ли я просто установить df в функции ggplot(), чтобы получить желаемый результат?

1 Ответ

0 голосов
/ 03 октября 2018

Поскольку вы хотите просто показать максимальное значение для каждой комбинации рода и категории, вы можете использовать несколько функций dplyrtidyverse вместе с ggplot2) для группировки по роду и категории, а затемпринять верхнее значение для каждого.Таким образом, вы не строите abun_plot вручную, как во втором блоке.

library(dplyr)
library(ggplot2)

abun_plot <- abun_all %>%
  group_by(Tree.genus, Category) %>%
  top_n(1, P.sampled_mean)

head(abun_plot)
#> # A tibble: 6 x 6
#> # Groups:   Tree.genus, Category [6]
#>   Tree.genus P.sampled Insects.sampled Category P.sampled_mean P.sampled_sd
#>   <fct>          <dbl>           <dbl> <fct>             <dbl>        <dbl>
#> 1 Acer          0.041            295.  3                0.0125       0.044 
#> 2 Acer          0.044             81.8 1                0.166        0.037 
#> 3 Acer          0.0085           379.  2                0.155        0.134 
#> 4 Betula        0.0505           183.  2                0.170        0.0805
#> 5 Betula        0.0325            61.7 3                0.0405       0.0995
#> 6 Betula        0.0465           326.  1                0.0985       0.188

После этого график работает так, как вы изначально ожидали:

ggplot(data = abun_plot, aes(x = as.factor(Tree.genus), y = P.sampled , fill = Category)) +
  geom_col(position = position_dodge(1)) +
  geom_errorbar(aes(ymin = P.sampled - P.sampled_sd, ymax = P.sampled + P.sampled_sd), width = 0.1, position = position_dodge(1)) +
  scale_fill_discrete(name = "Category",
                      breaks = c(1, 2, 3),
                      labels = c("NrAm in SSM", "NrAm in FR", "Eurp in FR")) +
  xlab("Genus") + ylab("No. of Focus sp. per total insect abundance")

Также стоит отметить, что в нескольких выпусках, выпущенных после ggplot2, вы можете использовать geom_col() вместо geom_bar(stat = "identity").

Создано в2018-10-03 по представлению пакета (v0.2.1)

...