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

#r #ggplot2 #geom-bar #errorbar

#r #ggplot2 #геометрическая шкала #панель ошибок

Вопрос:

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

Преобразование, произведенное NaNs, ввело бесконечные значения в непрерывную ось 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')
 

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

Ответ №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)
 

Создано 2021-01-08 пакетом reprex (версия 0.3.0)

Комментарии:

1. Это интересно. Также планом B было бы только отображение вышеуказанной ошибки с помощью geom_errorbar(aes(ymin=value, ymax=value sd)) Thanks!