R: Как добавить метку на правой оси в гистограмме ggplot?

#r #ggplot2 #bar-chart

Вопрос:

Предположим, я создаю гистограмму ggplot с помощью этого кода:

 mtcars$carb<-as.character(mtcars$carb)
mtcars$gear<-as.character(mtcars$gear)
mtcars$carb_labelright<-paste0("label_right",mtcars$carb)

#pelacolset
ggplot(mtcars, 
       #color by which to fill
       aes(fill=gear, 
           #y axis
           y=wt, 
           #x axis
           x=carb))  
  #title and subtitle
  
  
  #barplot
  geom_bar(position="fill", stat="identity",width=.8) 
  coord_flip() 
  

  #rotate x axis labels 90 degrees
  theme(axis.text.x = element_text(angle=90),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank())
 

График выглядит так:
введите описание изображения здесь

Теперь я хотел бы использовать столбец carb_labelright для добавления данных в правую часть гистограммы. Это должно выглядеть так:

введите описание изображения здесь

Как это можно сделать?

Ответ №1:

Я считаю, что проще всего аннотировать с geom_text помощью (вам понадобится фрейм данных) или annotate(geom = "text",...) . Использование аннотирования обычно безопаснее, поскольку geom_text ему нравится создавать метку для каждой строки (что хорошо, когда вы используете тщательно подготовленные фреймы данных для аннотирования).

 library(tidyverse)
mtcars$carb<-as.character(mtcars$carb)
mtcars$gear<-as.character(mtcars$gear)
mtcars$carb_labelright<-paste0("label_right",mtcars$carb)

ggplot(mtcars)  
  # use geom_col, a convenience wrapper for geom_bar(stat = "identity")
  geom_col(aes(fill=gear, y=wt, x=carb), 
           position="fill", width=.8)  
  # you have to turn clipping off
  coord_flip(clip = "off")  
  annotate(geom = "text", x = unique(mtcars$carb),
           label = unique(mtcars$carb_labelright),
           y = 1, hjust = 0)  
  # you need to increase the legend's margin and make it "transparent"
  # otherwise you will cover some labels. 
  theme(legend.margin = margin(l = 1, unit = "inch"),
        legend.background = element_blank())
 

Создано 2021-10-26 пакетом reprex (версия v2.0.1)

Комментарии:

1. спасибо, это работает, но есть ли вариант без создания нового фрейма данных? в моем приложении было бы лучше просто использовать столбец как есть…

2. Обновлено @Olympia

3. отличный ответ!

Ответ №2:

Я также столкнулся с проблемой дискретных осей, не поддерживающих вторичные масштабы (см. Соответствующую проблему в репозитории ggplot2). Я решил эту проблему, написав руководство вручную, которое позволяет мне создавать вторичные оси с дискретными масштабами. В приведенном ниже коде мы используем ggh4x::guide_axis_manual() в сочетании с лямбда-функцией rlang / purrr для форматирования меток. (Отказ от ответственности: Я автор ggh4x).

 library(ggplot2)
#> Warning: package 'ggplot2' was built under R version 4.1.1

mtcars$carb<-as.character(mtcars$carb)
mtcars$gear<-as.character(mtcars$gear)
mtcars$carb_labelright<-paste0("label_right",mtcars$carb)

p <- ggplot(mtcars, 
       aes(fill = gear, y = carb, x = wt))  
  geom_col(position="fill", width=.8)

p   guides(
  y.sec = ggh4x::guide_axis_manual(
    labels = ~ paste0("label_right_", .x)
  )
)
 

Кроме того, вы также можете указать метки в виде символьного вектора напрямую.

 p   guides(
  y.sec = ggh4x::guide_axis_manual(
    labels = sort(unique(mtcars$carb_labelright))
  )
)
 

Создано 2021-10-26 пакетом reprex (версия v2.0.1)

Комментарии:

1. отличное решение!