ggplot theme_bw () не работает с прочитанными данными, но точно такой же код отлично работает с данными mtcars

#r #ggplot2

#r #ggplot2

Вопрос:

У меня есть данные, которые выглядят следующим образом, около 2000 строк, где sample_name уникально (на самом деле это значение фактора, но я преобразовал здесь, чтобы скрыть его):

 head(df)
  sample_name metric metric_name metric_mean metric_sd year_month
1           1      0   my_metric    154260.5  76782.54    2020-08
2           2 156845   my_metric    154260.5  76782.54    2020-08
3           3  78015   my_metric    154260.5  76782.54    2020-08
4           4  87620   my_metric    154260.5  76782.54    2020-08
5           5 102581   my_metric    154260.5  76782.54    2020-08
6           6 145976   my_metric    154260.5  76782.54    2020-08
  

Я использую это содержимое RMD для создания PDF-файла с графиком. Сгенерированный график удаляется theme_bw() , как показано на выходном графике, сгенерированном с использованием преобразования rmarkdown PDF.

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

 ---
title: "Example"
author: John Doe
output: pdf_document
---

# Here is my plot

This is a plot of mpg vs. number of cylinders in a car.

```{r, results = 'asis', echo = FALSE, eval = TRUE, message = FALSE, warn = FALSE}
  library(ggplot2)
  library(data.table)

  df <- fread('/tmp/gopala.csv', data.table = FALSE)
    metric_mean <- unique(df$metric_mean)
    metric_sd <- unique(df$metric_sd)
    metric_name <- unique(df$metric_name)
    year_month <- unique(df$year_month)

  ggplot(df, aes(x = sample_name, y = metric))  
    geom_point(size = 0.5, color = '#1F77B4')  
    labs(
      title = paste0('CHART FOR PERIOD ', year_month),
      x = 'NAME', y = toupper(metric_name)
      )  
    geom_hline(yintercept = metric_mean, color = 'red', size = 0.5)  
    geom_hline(
      yintercept = metric_mean   metric_sd, color = 'blue', size = 0.5
      )  
    geom_hline(
      yintercept = metric_mean - metric_sd,
      color = 'blue', linetype = 'dashed', size = 0.5
      )  
    geom_hline(
      yintercept = metric_mean   2 * metric_sd, color = 'purple', size = 0.5
      )  
    geom_hline(
      yintercept = metric_mean - 2 * metric_sd,
      color = 'purple', linetype = 'dashed', size = 0.5
      )  
    geom_hline(
      yintercept = metric_mean   3 * metric_sd, color = 'green', size = 0.5
      )  
    geom_hline(
      yintercept = metric_mean - 3 * metric_sd,
      color = 'green', linetype = 'dashed', size = 0.5
      )  
    geom_text(
      aes(
        label = paste0('Mean (', round(metric_mean, 2), ')'),
        x = Inf, y = metric_mean, color = 'red', fontface = 'bold'
        ),
      hjust = 1
      )  
    geom_text(
      aes(
        label = paste0(' 1SD (', round(metric_mean   metric_sd, 2), ')'),
        x = Inf, y = metric_mean   metric_sd, color = 'blue'
        ),
      hjust = 1
      )  
    geom_text(
      aes(
        label = paste0('-1SD (', round(metric_mean - metric_sd, 2), ')'),
        x = Inf, y = metric_mean - metric_sd, color = 'blue'
        ),
      hjust = 1
      )  
    geom_text(
      aes(
        label = paste0(' 2SD (', round(metric_mean   2 * metric_sd, 2), ')'),
        x = Inf, y = metric_mean   2 * metric_sd, color = 'purple'
        ),
      hjust = 1
      )  
    geom_text(
      aes(
        label = paste0('-2SD (', round(metric_mean - 2 * metric_sd, 2), ')'),
        x = Inf, y = metric_mean - 2 * metric_sd, color = 'purple'
        ),
      hjust = 1
      )  
    geom_text(
      aes(
        label = paste0(' 3SD (', round(metric_mean   3 * metric_sd, 2), ')'),
        x = Inf, y = metric_mean   3 * metric_sd, color = 'green'
        ),
      hjust = 1
      )  
    geom_text(
      aes(
        label = paste0('-3SD (', round(metric_mean - 3 * metric_sd, 2), ')'),
        x = Inf, y = metric_mean - 3 * metric_sd, color = 'green'
        ),
      hjust = 1
      )  
    theme_bw()  
    theme(
      plot.title = element_text(hjust = 0.5),
      axis.text.x = element_blank(),
      axis.ticks.x = element_blank(),
      legend.position = 'none'
      )
```
  

Изменив первые несколько строк на следующие, все работает нормально:

   metric_mean <- mean(mtcars$mpg)
  metric_sd <- sd(mtcars$mpg)

  ggplot(mtcars, aes(x = wt, y = mpg))  
    geom_point(size = 0.5, color = '#1F77B4')  
    labs(
      title = 'WT vs. MPG', x = 'WT', y = 'MPG'
      )  
  

Хоть убей, я не могу понять причину.

ДОПОЛНИТЕЛЬНО: если кто-нибудь знает, как увеличить мои текстовые метки на небольшую величину (относительный масштаб) без использования абсолютных значений, это тоже было бы очень полезно.

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

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

1. Когда я запускаю ваш код с 6 строками данных, я получаю белый фон (с линиями осей), соответствующий theme_bw() .

2. Для смещения ваших меток начните с vjust=0 (или даже =-0.1 (для каждого geom_text ). Вы столкнетесь с проблемами с вашей верхней меткой, но вы можете использовать coord_cartesian or ylim для увеличения касания.

3. Я бы подумал, что вы могли бы объединить все свои geom_text в один вызов, data.frame предварительно настроив один, например data.frame(x=Inf, y=metric_mean ..., label = ..., color = ...) , и затем geom_text(data = newdf, aes(x, y, label = label, color = I(color))) .

4. Как я уже указывал, размер данных составляет около 2000 строк, и я боюсь, что это как-то связано с theme_bw() исчезновением? Если да, то как это исправить?

5. Я понимаю, что 6 строк не представляют 2000 строк. Я просто скопировал ваши данные с 6 строк до 6000 строк, и я получаю те же результаты. Количество строк не должно влиять на поведение theme_bw() . Вы пробовали перезапустить R? Я знаю, это звучит сурово, но R не застрахован от проблем, которые исправляет новый перезапуск.