ggplot, почему добавление нового элемента перезаписывает цвет внутри l oop, но не снаружи - PullRequest
1 голос
/ 04 марта 2020

Я пишу функцию для построения n серий данных. Моя идея состояла в том, чтобы l oop через каждую серию и добавить новый gg_smooth для каждого l oop. Это работает, когда я "l oop" вручную, но вставляя его в фактический l oop, перезаписываю цвет aesteti c.

Данные, с которыми я работаю, идея в том, чтобы иметь возможность иметь n количество столбцов:

данные

Используя следующие строки, я получаю желаемый результат:

gene_list <- c("tetA", "tet.W.")
gg <- ggplot()

gg <- gg + geom_smooth(data=df_analysis_summed, 
              aes(x=as.Date(dato), y=!!sym(gene_list[1]), linetype = oua_2, colour = gene_list[1] ),
              method="auto", se=F)

gg <- gg + geom_smooth(data=df_analysis_summed, 
              aes(x=as.Date(dato), y=!!sym(gene_list[2]), linetype = oua_2, colour = gene_list[2] ),
              method="auto", se=F)

gg + labs(colour = "gene")

Desired outcome

Затем я пытаюсь добавить функциональность в oop:

plot_genes_scat_smooth <- function (df,gene_list) {
  plot <- ggplot()

  for (gene_index in 1:length(gene_list)) {
    print(gene_index)
    print(gene_list[gene_index])
    plot <- plot +
      geom_smooth(data=df, aes(x=as.Date(dato), y=!!sym(gene_list[gene_index]), linetype=oua_2, colour = gene_list[gene_index]), method="auto", se=F)#+
      #geom_point(data=df,aes(x=as.Date(dato), y=!!sym(gene), colour = gene, shape = oua_2))
  }
  plot
}

genes = c("tetA", "tet.W.")
plot_genes_scat_smooth(df_analysis_summed,gene_list = genes)

Используя функцию, я получаю следующий результат:

Wrong result from loop/function

Это будет Кажется, что цвет aes первой строки перезаписывается вторым вызовом при попытке реализовать его как функцию. Как это может быть?

1 Ответ

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

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

#create some data
set.seed(1)
dato<-seq.Date(as.Date("2018-04-25"), length.out = 14, by="1 day")
oua_2<-rep(c(0, 1), 7)
tetA<-rnorm(14, 0.04, 0.02)
tet.W<-rnorm(14, 0.2, 0.02)

df_analysis_summed <- data.frame(dato, oua_2, tetA, tet.W)

#convert the data frame to long
library(tidyr)
df_analysis_long <- df_analysis_summed %>% pivot_longer(starts_with("tet"), names_to = "genes", values_to = "value")

#function to plot
plot_genes_scat_smooth_long <- function (df) {
  plot <- ggplot()
  plot <- plot +
    geom_smooth(data=df_analysis_long, aes(x=as.Date(dato), y=value, linetype=as.factor(oua_2), colour = genes), method="auto", se=F)

  plot
}

plot_genes_scat_smooth_long(df_analysis_long)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...