Как управлять значениями n.label с помощью paste0 () для количества наблюдений с помощью функции plotmean () в пакете gplot () в R

Проблема:

У меня есть фрейм данных под названием FID, и я хочу пометить количество наблюдений для каждого среднего и верхнего и нижнего доверительных интервалов. Поскольку во фрейме данных показано количество наблюдений в месяц за три года (см. Ниже), n-метки помечены как n = 3 (см. Рисунок 1 ниже).

Я создал два вектора с именами наблюдения и month_level, и я надеялся использовать функцию paste0 () для вставки истинных значений n.label в график (см. Код R). Когда я попытался вставить эти значения n-метки на график, сюжетная линия, соединяющая средние значения, имеет тенденцию исчезать, как и сами n-метки (см. Рисунок 2 ниже) вместе с двумя метками оси x в течение нескольких месяцев. (Январь-декабрь) исчезновение (см. Рисунок 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))

person Alice Hobbs    schedule 29.09.2020    source источник


Ответы (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")

Теперь вы можете вручную добавить количество наблюдений над вашей осью x, используя функцию Base R axis():

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 =.

Результат:  Сюжет Алисы

person Werner    schedule 01.10.2020
comment
Спасибо за ответ. Если вы хотите предложить PR, не стесняйтесь сделать это здесь: github.com/talgalili/gplots А я посмотрю. Т - person Tal Galili; 01.10.2020
comment
Привет, Вернер. Большое спасибо за ваш ответ, я очень признателен. Могу я спросить, что я делаю не так? Я запустил код с помощью функции plotmean (), и метки Obs печатаются под меткой оси x, которую вы можете видеть только в глобальной среде графиков, но не в окне построения. Есть ли способ манипулировать метками n = 3 (см. Выше) для вставки значений в вектор Obs вместо того, чтобы в ту же позицию на графике? - person Alice Hobbs; 02.10.2020
comment
@AliceHobbs Добро пожаловать! Ошибка находится в строке n.label = paste0("month_levels", levels=Observations) (график на рис. 2). n.label может быть только TRUE или FALSE, это не может быть вектор. Нет, нет простого способа манипулировать n = 3 метками. Функция plotmeans() не имеет аргумента, который позволил бы вам это изменить, поэтому вам придется либо сделать это вручную, либо использовать другой фрейм данных. Используя предложенный мной код, попробуйте использовать другие значения pos = , чтобы исправить положение добавленных вручную меток. - person Werner; 02.10.2020
comment
Привет, Вернер. Большой! Спасибо за ваше руководство, так как я не продвинутый пользователь R. Я последовал твоему совету и изменил значение pos =. и я также изменил размеры окна черчения. Фантастика! Теперь вы можете увидеть ярлыки на графике. Извините за дополнительные вопросы, но пара моих меток оси x (январь-декабрь) исчезла, и месяцы не в правильном порядке. Как я могу это исправить? Я отредактировал вопрос и поместил новый график, как показано на рисунке 3 выше. Еще раз спасибо, если можете посоветовать :) - person Alice Hobbs; 02.10.2020
comment
@AliceHobbs Вы уверены, что ярлыки исчезли? Попробуйте расширить окно графика. Вы можете отсортировать ось X по названию месяца, определив уровни факторов следующим образом: FID$Month <- factor(FID$Month, levels = month.name), я обновлю свой ответ этой строкой кода. - person Werner; 02.10.2020
comment
Привет, Вернер. Большое тебе спасибо. Я применил ваши предложения по изменению размера окна и определению окон факторов, и это сработало. Я действительно многому научился из этого взаимодействия. Я очень признателен за вашу помощь - person Alice Hobbs; 02.10.2020