如何使用 R 中 gplot() 包中的 plotmean() 函数使用 paste0() 操作 n.label 值以获得观察次数

Posted

技术标签:

【中文标题】如何使用 R 中 gplot() 包中的 plotmean() 函数使用 paste0() 操作 n.label 值以获得观察次数【英文标题】:How to manipulate the n.label values with paste0() for the number of observations using the plotmean() function in the gplot() package in R 【发布时间】:2021-01-15 07:59:48 【问题描述】:

问题:

我有一个名为 FID 的数据框,我想标记每个平均值的观察次数以及上下置信区间。因为数据框显示了三年内每月的观察次数(下图),所以 n.labels 被标记为 n=3(参见下图 1)。

我创建了两个名为 observations 和 month_level 的向量,我希望使用函数 paste0() 将真正的 n.label 值插入到图中(参见 R 代码)。当我尝试将这些 n.label 值粘贴到绘图上时,连接平均值的绘图线往往会消失,n.labels 本身也会消失(参见下面的图 2),以及几个月的两个 x 轴标签(1-12月)消失(见图3)。

如果有人能够帮助在此图上放置正确的 n.label 值(请参阅下面的真实值),我将不胜感激。

非常感谢。

键:

n.label = 一个逻辑值,指示是否应将给出每组中观察次数的文本添加到图中。

 ##Three instances of each month over 3 years
 Year     Month       FID                             Month       FID  
 2018    January       86                             January     208
 2019    January       66                             February    176
 2020    January       56
 2018    February      76
 2019    February      55
 2020    February      45

 January (n=3)
 February (n=3) etc...............

三年内每月正确的观察次数(如下所示):

##the correct n.labels are these observations

       Month Observations 
1    January       113  
2   February        94  
3      March       111  
4      April       111  
5        May        33  
6       June         9   
7       July        14   
8     August        89  
9  September        86  
10   October        83  
11  November        81  
12  December       101  

R 代码:

      library(gplots)
      library(tidyverse)

    ##Produce a vector showing the true n.label value of observations
        
     Observations<-c(113, 94, 111, 111, 33, 9, 14, 89, 86, 83, 81, 101)

    ##Create a vector to ensure the dates are in the right order

     month_levels = c('January', 'February', 'March', 'April', 'May', 'June', 
                 'July', 'August', 'September', 'October', 'November', 'December')
    
    ##Plot means, ci_labels, and n.lables for the column 'FID'

    ##Open plotting window
     dev.new()
    
    ##Plot the mean per month for FID but with incorrect n.label values
    ##Code for figure 1

           plotmeans(FID~Month, 
                    data=FID,
                    ci.label = TRUE,
                    mean.labels = TRUE,
                    n.label = TRUE,
                    digits = 2,
                    pch=0.3, 
                    col="red",
                    ccol="black",
                    barcol="blue",
                    ylab="Mean Blue Whale Sightings",
                    xlab="Months")

          ##Open plotting window
            dev.new()

          ##Code for figure 2

          plotmeans(FID~Month, 
                    data=FID,
                    ci.label = TRUE,
                    mean.labels = TRUE,
                    n.label = paste0("month_levels", levels=Observations),
                    digits = 2,
                    pch=0.3, 
                    col="red",
                    ccol="black",
                    barcol="blue",
                    ylab="FID",
                    xlab="Months")

       ##Plot means for the 'Final_New_Blue'
       ##Open plotting window
         dev.new(width=10, height=10, unit="in")

       ## Margins area
         par(oma=c(3,3,3,3)) # all sides have 3 lines of space

          Obs <-c(111, 33, 9, 14, 89, 86, 83, 81, 101, 113, 94, 111)
           
               plotmeans(FID~Month, 
                         data=FID,
                         ci.label = TRUE,
                         mean.labels = TRUE,
                         n.label = FALSE,
                         digits = 2,
                         pch=0.3, 
                         col="red",
                         ccol="black",
                         barcol="blue",
                         ylab="FID",
                         xlab="Months")
           
                         axis(1, at=1:12, labels = paste("n =", Obs), pos = -35, col = NA)
           
           

图 1

图2

图 3

数据框:FID

structure(list(Year = c(2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 
2015L, 2015L, 2015L, 2015L, 2015L, 2015L, 2016L, 2016L, 2016L, 
2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 2016L, 
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 
2017L, 2017L, 2017L), Month = structure(c(5L, 4L, 8L, 1L, 9L, 
7L, 6L, 2L, 12L, 11L, 10L, 3L, 5L, 4L, 8L, 1L, 9L, 7L, 6L, 2L, 
12L, 11L, 10L, 3L, 5L, 4L, 8L, 1L, 9L, 7L, 6L, 2L, 12L, 11L, 
10L, 3L), .Label = c("April", "August", "December", "February", 
"January", "July", "June", "March", "May", "November", "October", 
"September"), class = "factor"), FID = c(65L, 88L, 43L, 54L, 
98L, 0L, 0L, 23L, 10L, 15L, 6L, 33L, 56L, 29L, 98L, 23L, 6L, 
10L, 7L, 65L, 53L, 41L, 25L, 30L, 44L, 65L, 38L, 27L, 20L, 0L, 
8L, 45L, 34L, 26L, 44L, 39L)), class = "data.frame", row.names = c(NA, 
-36L))

【问题讨论】:

【参考方案1】:

首先,一些坏消息:plotmeans() 可能不是执行您正在做的事情的最佳功能。问题是n.label 只是一个真/假值,它决定了绘图是否会将观察的数量相加并将它们添加到轴上。 plotmeans() 不允许您更改该值,除非您编辑函数的代码,这需要时间。

现在好消息是:可以绕过这个限制并手动修复您的情节。首先,将n.label设置为FALSE

# Rank factor levels by month name
FID$Month <- factor(FID$Month, levels = month.name)

##Code for figure 2
dev.new()
plotmeans(FID~Month, 
          data=FID,
          ci.label = TRUE,
          mean.labels = TRUE,
          n.label = FALSE,
          digits = 2,
          pch=0.3, 
          col="red",
          ccol="black",
          barcol="blue",
          ylab="FID",
          xlab="Months")

现在您可以使用 Base R 函数 axis() 在 x 轴上方手动添加观察数:

Obs <-c(111, 33, 9, 14, 89, 86, 83, 81, 101, 113, 94, 111)
axis(1, at=1:12, labels = paste("n =", Obs), pos = -70, col = NA)

要调整标签的位置,请更改pos = 的值。

结果:

【讨论】:

感谢您的回答。如果您想提出 PR,请随时在此处进行:github.com/talgalili/gplots 我会看看。 T 嘿维尔纳。非常感谢您的回复,我真的很感激。请问我做错了什么?我使用 plotmean() 函数运行代码,并且 Obs 标签打印在 x 轴标签下方,您只能在绘图全局环境中看到,但不能在绘图窗口中看到。有什么方法可以操纵 n=3 个标签(上图)将值粘贴到 Obs 向量中,而不是粘贴到图中的相同位置? @AliceHobbs 不客气!错误位于n.label = paste0("month_levels", levels=Observations) 行(图 2 中)。 n.label 只能是TRUEFALSE,不能是向量。不,没有简单的方法来操纵 n = 3 个标签。函数plotmeans() 没有允许您更改它的参数,因此您必须手动执行或使用不同的数据框。使用我建议的代码,尝试使用不同的pos = 值来修复手动添加标签的位置。 嘿维尔纳。伟大的!感谢您的指导,因为我不是高级 R 用户。我听取了您的建议并更改了 'pos =' 值。我还更改了绘图窗口的尺寸。极好的!您现在可以在绘图上看到 n.labells。很抱歉提出更多问题,但我的几个 x 轴标签(1 月至 12 月)已经消失,月份的顺序也不正确。有什么办法可以解决这个问题吗?我编辑了问题并将新的情节放在上面的图 3 中。如果您能提供建议,再次感谢您:) @AliceHobbs 你确定标签消失了吗?尝试扩展绘图窗口。您可以通过定义这样的因子级别来按月份名称对 x 轴进行排序:FID$Month &lt;- factor(FID$Month, levels = month.name),我将使用这行代码更新我的答案。

以上是关于如何使用 R 中 gplot() 包中的 plotmean() 函数使用 paste0() 操作 n.label 值以获得观察次数的主要内容,如果未能解决你的问题,请参考以下文章

如图所示,无法将 gplot 保存到 R 中的文件

R语言使用car包中的avPlots函数创建变量添加图(Added-variable plots)在图像交互中,在变量添加图中手动标识(添加)对于每一个预测变量影响较大的强影响点

R语言可视化两个以上的分类(类别)变量之间的关系使用vcd包中的Mosaic函数创建马赛克图( Mosaic plots)用可视化的方式展示分类型数据

R语言可视化两个以上的分类(类别)变量之间的关系使用vcd包中的Mosaic函数创建马赛克图( Mosaic plots)分别可视化两个三个四个分类变量的关系的马赛克图

R语言ggplot2可视化:使用ggfortyify包中的autoplot函数自动可视化时间序列数据(Time Series Plot From a Time Series Object (ts))

R语言使用party包中的ctree函数构建条件推理决策树(Conditional inference trees)使用plot函数可视化训练好的条件推理决策树条件推理决策树的叶子节点的阴影区域表