Нечетные полосы ошибок geom_bar из-за преобразования бесконечных значений в y-логарифмическую шкалу

В наблюдениях 2,3,5 я получаю неполные планки погрешностей для переменной при построении графика в масштабе LOG10, я получаю следующее сообщение:

Произведено NaN Преобразование ввело бесконечные значения в непрерывной оси Y

library(tidyverse)
df <- tibble::tibble(
Observation = rep(1:5,2),
Type = rep(c(rep("A",5), rep("B",5))), value = c(33046,970250,1870125,259625,3838750,196,578,323,509,215), sd = c(8538, 319023,1538959,27754,1602186,161,687,380,474,282))


ggplot(df, aes(x=Observation, y=value, fill=Type)) + 
  geom_bar(stat="identity", color="black", 
           position=position_dodge()) +
  geom_errorbar(aes(ymin=value-sd, ymax=value+sd), width=.2,
                 position=position_dodge(.9)) + theme_classic() +
   # scale_fill_manual(values=c('#999999','#E69F00'))+
  scale_y_continuous(trans='log10')

Как я могу это исправить?введите здесь описание изображения


person Ecg    schedule 08.01.2021    source источник


Ответы (1)


Это потому, что df$value - df$sd создает отрицательные значения, которые не могут быть преобразованы в log10. Я бы рекомендовал обрезать значения при некотором положительном значении. Пример ниже использует pmax() для установки минимального значения 1.

library(tidyverse)
df <- tibble::tibble(
  Observation = rep(1:5,2),
  Type = rep(c(rep("A",5), rep("B",5))), 
  value = c(33046,970250,1870125,259625,3838750,196,578,323,509,215), 
  sd = c(8538, 319023,1538959,27754,1602186,161,687,380,474,282))


ggplot(df, aes(x=Observation, y=value, fill=Type)) + 
  geom_bar(stat="identity", color="black", 
           position=position_dodge()) +
  geom_errorbar(aes(ymin=pmax(value-sd, 1), ymax=value+sd), width=.2,
                position=position_dodge(.9)) + theme_classic() +
  scale_y_continuous(trans='log10', oob = scales::oob_squish_any)

Создано 08 января 2021 г. с помощью пакета reprex (v0.3.0)

person teunbrand    schedule 08.01.2021
comment
Это интересно. Кроме того, план Б будет отображать указанную выше ошибку только с использованием geom_errorbar(aes(ymin=value, ymax=value+sd)) Спасибо! - person Ecg; 08.01.2021