#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. отличное решение!