#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
orylim
для увеличения касания.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 не застрахован от проблем, которые исправляет новый перезапуск.