【问题标题】:How to assign unique title and text labels to ggplots created in lapply loop?如何为 lapply 循环中创建的 ggplots 分配唯一的标题和文本标签?
【发布时间】:2020-05-11 07:41:21
【问题描述】:

我已经尝试了在 Stack Exchange 上找到的 for 循环和 lapply 循环的每一次迭代,以创建 ggplots,这段代码对我来说效果很好。我唯一的问题是我无法分配唯一的标题和标签。从我在函数中可以看出,我获取了我的响应变量的值,因此我无法将我想要的标题作为标题字符串中的第 i 个条目进行索引。

我提供的示例创建了具有正确值的绘图,但绘图列表中的第二个和第三个绘图没有正确的标题或标签。

模拟数据集:

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)))

问题是我无法为每个图创建唯一的标题。(示例中的所有图都有标题“measr1”或“SampleA)

另外我不能为每个条应用唯一标签(来自 qual 列)。(例如,qual 2 的字母应该出现在每个样本的 measr2 列的顶部)

此外,在第二个绘图列表中,x 值不是“measr1”、“measr2”、“measr3”,它们是那些不理想的列的索引值。

我对 R 比较陌生,之前从未在 Stack Overflow 上发过帖子,因此欢迎对我的问题提供任何反馈或发布问题。

我找到了很多关于这类主题的问题和答案,但没有一个像我的那样具有数据结构或所需的情节。如果这是一个多余的问题,我深表歉意,但我已尝试在以前的答案中找到解决方案但一直无法解决。

这是我获得创建循环的原始代码的地方,但是此示例不包含标题或标签: Looping over ggplot2 with columns

【问题讨论】:

    标签: r ggplot2 lapply geom-text ggtitle


    【解决方案1】:

    我建议在使用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 的绘图示例。

    【讨论】:

    • 非常感谢您的帮助,这正是我想要的!
    【解决方案2】:

    您可以循环遍历列的名称而不是列本身,然后使用一些非标准评估从名称中获取列值。另外,我在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]]
    

    plotlist3[[2]]
    


    lapply 也可以达到同样的效果

    plotlist4 <- lapply(names(df)[measrsindex], function(x)
      ggplot(df, aes(nms, !!sym(x), label = qual1)) + 
             geom_col() + ggtitle(x) + geom_text(vjust = -1))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-10
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      相关资源
      最近更新 更多