Как связать легенду столбца с вычисляемым столбцом в ggplot2? - PullRequest
1 голос
/ 27 марта 2020

Код строит данные с вычисленными недельными линиями регрессии. Я хотел бы объединить легенду с еженедельным временем удвоения, рассчитанным по недельным наклонам.

Приятно решить вопрос : я мог бы получить линии еженедельной регрессии с помощью geom_smooth. Однако я не смог извлечь коэффициент наклона (чтобы рассчитать время удвоения) из geom_smooth. Поэтому мне пришлось делать эквивалентные регрессии за пределами части ggplot.
Есть предложения, чтобы сделать это более элегантно?

Главный вопрос : Как я могу объединить легенду со столбцом вычисленного удвоения раз? С большим трудом я могу поставить легенду рядом с этим вычисленным временем удвоения. Это выглядит не очень хорошо, и когда я добавляю еще одну точку данных, мне приходится снова и снова возиться. Предложения будут оценены. Спасибо.

library(ggplot2)
library(gridExtra)

# Input data: Daily number of cases starting at day0 
cases <- c(1,1,2,3,7,10,13,16,24,38,51,62,85,116,150,202,240,274,402,554,709, 927) 
day0 <- as.Date("2020-03-04")

# actual dates by counting from day0
dates <- day0 + 1:length(cases) 

# week number as factor to obtain regression line for each week
week <- as.factor(1 + (1:length(cases) ) %/% 7)

# tibble with daily data, also with week number 
datatib <- tibble( dates, cases, week)

# tibble with computed doubling time per week
resulttib <- tibble(Week=unique(week), Doubling_Time=NA)

# linear regression on log of dependent variable
for (wk in unique(week) ) {
  resulttib[wk,'Doubling_Time'] <- 
    round( log(2) / lm(log(cases) ~ dates, data=datatib[week==wk,] )$coef['dates'], 2 )
}

# insert row at top for second line of column heading
resulttib <- add_row(resulttib, Week = '', Doubling_Time = '(days)', .before = 1) 

doublingtime = tableGrob(resulttib[,'Doubling_Time'], rows=NULL)

gp <- 
  ggplot(datatib, aes(dates, cases, color = week ) ) +
  geom_point() +
  geom_smooth( method = "lm", se = FALSE) +
  scale_x_date() +
  scale_y_continuous(trans="log10") +
  labs(x = "", y = "Number of Cases") +
  ggtitle("Number of Cases with Weekly Doubling Times") +
  theme(plot.title = element_text(hjust = 0.5)) +

  theme(legend.position=c(0.75,0), 
        legend.justification=c(1.2, -0.1), legend.text=element_text(size=14) ) +
  annotation_custom( doublingtime, 
      xmin=dates[length(cases)]-2, xmax=dates[length(cases)], ymin=-2.65 )

e

1 Ответ

1 голос
/ 27 марта 2020

В качестве ответа на ваш главный вопрос ... попробуйте это. Я просто присоединил время удвоения к вашему основному дф и создал новый вариант, в котором нет. недели и удвоения времени. Затем цвет сопоставляется с этой новой переменной.

Относительно вашего второго вопроса: есть способы вычислить наклон из вычисленных значений geom_smooth / stat_smooth. Однако, по моему мнению, ваш подход к вычислению уклонов - это более простой способ решения проблемы, которую вы пытаетесь решить.

library(ggplot2)
library(dplyr)
library(gridExtra)

# Input data: Daily number of cases starting at day0 
cases <- c(1,1,2,3,7,10,13,16,24,38,51,62,85,116,150,202,240,274,402,554,709, 927) 
day0 <- as.Date("2020-03-04")

# actual dates by counting from day0
dates <- day0 + 1:length(cases) 

# week number as factor to obtain regression line for each week
week <- as.factor(1 + (1:length(cases) ) %/% 7)

# tibble with daily data, also with week number 
datatib <- tibble( dates, cases, week)

# tibble with computed doubling time per week
resulttib <- tibble(Week=unique(week), Doubling_Time=NA)

# linear regression on log of dependent variable
for (wk in unique(week) ) {
  resulttib[wk,'Doubling_Time'] <- 
    round( log(2) / lm(log(cases) ~ dates, data=datatib[week==wk,] )$coef['dates'], 2 )
}

# insert row at top for second line of column heading
#resulttib <- add_row(resulttib, Week = '', Doubling_Time = '(days)', .before = 1) 

#doublingtime = tableGrob(resulttib[,'Doubling_Time'], rows=NULL)

datatib1 <- datatib %>% 
  left_join(resulttib, by = c("week" = "Week")) %>% 
  mutate(week1 = paste0(week, " (", Doubling_Time, ")"))

gp <- 
  ggplot(datatib1, aes(dates, cases, color = week1 ) ) +
  geom_point() +
  geom_smooth( method = "lm", se = FALSE) +
  scale_x_date() +
  scale_y_continuous(trans="log10") +
  labs(x = "", y = "Number of Cases") +
  ggtitle("Number of Cases with Weekly Doubling Times") +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme(
    legend.position = c(.95, .05),
    legend.justification = c("right", "bottom"),
    legend.box.just = "right",
    legend.margin = margin(6, 6, 6, 6)
  ) +
  labs(color = "Week (Doubling time in days)")

gp

Создано в 2020 году -03-27 представьте пакет (v0.3.0)

...