Как назначить уникальные заголовки и текстовые метки ggplots, созданным в lapply l oop? - PullRequest
0 голосов
/ 25 января 2020

Я пробовал каждую итерацию, которую я могу найти в Stack Exchange для циклов for и lapply, для создания ggplots, и этот код хорошо работал для меня. Моя единственная проблема в том, что я не могу назначать уникальные названия и ярлыки. Из того, что я могу сказать в функции, я беру значения моей переменной ответа, поэтому я не могу индексировать нужный заголовок в качестве i-й записи в символьной строке заголовков.

Приведенный мной пример создает графики с правильными значениями, но 2-й и 3-й графики в списках графиков не имеют правильных заголовков или меток.

Макетный набор данных:

library(ggplot2)

nms=c("SampleA","SampleB","SampleC")
measr1=c(0.6,0.6,10)
measr2=c(0.6,10,0.8)
measr3=c(0.7,10,10)
qual1=c("U","U","")
qual2=c("U","","J")
qual3=c("J","","")
df=data.frame(nms,measr1,qual1,measr2,qual2,measr3,qual3,stringsAsFactors = FALSE)

определяет столбцы в наборе данных, которые содержат ответ переменная

measrsindex=c(2,4,6)

Создание списка графиков, на котором показаны все выборки для каждого измерения

plotlist=list()
plotlist=lapply(df[,measrsindex], function(i) ggplot(df,aes_string(x="nms",y=i))+
             geom_col()+
             ggtitle("measr1")+
             geom_text(aes(label=df$qual1)))

Создание списка графиков, на которых показаны все измерения для каждого образца

plotlist2=list()
plotlist2=lapply(df[,measrsindex],function(i)ggplot(df,aes_string(x=measrsindex, y=i))+
              geom_col()+
              ggtitle("SampleA")+
              geom_text(aes(label=df$qual1)))

Проблема в том, что я не могу создать уникальный заголовок для каждого графика. (Все графики в примере имеют заголовок "measurer1" или "SampleA)

Дополнительно Я не могу применить уникальные метки (из столбцов квалификаций) для каждого столбца. (например, буква для квали 2 должна появляться в верхней части столбца для measurer2 для каждого образца)

Дополнительно во втором списке графиков значения x это не «измерения1», «измерения2», «измерения3», это значения индекса для тех столбцов, которые не идеальны.

Я относительно новичок в R и никогда раньше не публиковал в переполнении стека поэтому любые отзывы о моей проблеме или публикации вопросов приветствуются.

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

Здесь я получил исходный код для создания своих циклов, однако этот пример не включает названия или метки: Зацикливание на ggplot2 со столбцами

Ответы [ 2 ]

1 голос
/ 25 января 2020

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

library(ggplot2)
library(rlang)

plotlist3 <- purrr::map(names(df)[measrsindex], 
             ~ggplot(df, aes(nms, !!sym(.x), label = qual1)) + 
               geom_col() + ggtitle(.x) + geom_text(vjust = -1))

plotlist3[[1]]

enter image description here

plotlist3[[2]]

enter image description here


То же самое можно достичь с помощью lapply

plotlist4 <- lapply(names(df)[measrsindex], function(x)
  ggplot(df, aes(nms, !!sym(x), label = qual1)) + 
         geom_col() + ggtitle(x) + geom_text(vjust = -1))
0 голосов
/ 25 января 2020

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

library(tidyverse)

#Change from wide to long format
df1<-df %>% 
  pivot_longer(cols = -nms,
               names_to = c(".value", "obs"),
               names_sep = c("r","l")) %>%
  #Separate Sample column into letters
  separate(col = nms,
           sep = "Sample",
           into = c("fill","Sample"))

#Change measures index to 1-3
measrsindex=c(1,2,3)

plotlist=list()
plotlist=lapply(measrsindex, function(i){
  #Subset by measrsindex (numbers) and plot
  df1 %>%
    filter(obs == i) %>%
    ggplot(aes_string(x="Sample", y="meas", label="qua"))+
    geom_col()+
    labs(x = "Sample") +
    ggtitle(paste("Measure",i, collapse = " "))+
    geom_text()})

#Get the letters A : C
samplesvec<-unique(df1$Sample)

plotlist2=list()
plotlist2=lapply(samplesvec, function(i){
  #Subset by samplesvec (letters) and plot
  df1 %>%
    filter(Sample == i) %>%
    ggplot(aes_string(x="obs", y = "meas",label="qua"))+ 
    geom_col()+
    labs(x = "Measure") +
    ggtitle(paste("Sample",i,collapse = ", "))+
    geom_text()})

Смотря на последние графики, я думаю, что было бы полезно использовать facet_wrap для создания этих графиков. Я добавил код, чтобы использовать его с вашими графиками.

#Plot for Measures
ggplot(df1, aes(x = Sample, 
                y = meas, 
                label = qua)) +
  geom_col()+
  facet_wrap(~ obs) +
  ggtitle("Measures")+
  labs(x="Samples")+
  geom_text()

#Plot for Samples
ggplot(df1, aes(x = obs, 
                y = meas, 
                label = qua)) +
  geom_col()+
  facet_wrap(~ Sample) +
  ggtitle("Samples")+
  labs(x="Measures")+
  geom_text()

Вот пример графиков с использованием facet_wrap.

Measures

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