ggplot: Как установить различные выравнивания в позиции geom_text в зависимости от типа переменной?

#r #ggplot2 #label #position #geom-text

Вопрос:

У меня есть 100% — ная столбчатая диаграмма, которая отображает 3 типа переменных. Я установил базу данных примеров, чтобы мне было проще создавать график.

Я уже настроил диаграмму с помощью нужных мне цветов и информации. Но я не могу самостоятельно расположить ярлыки. Вот текущий код и выходные данные.

Код:

 (empilhadolt;-ggplot(dfm, aes(y = Year, x = abs(value), fill = variable))     scale_x_continuous(sec.axis = sec_axis(trans = ~.*1, name="Trab."), expand=expansion(mult=c(0,0.05)))   geom_col(data = rotulo, aes(y = Year, x=abs(trabalho), fill=NULL), width = .7, colour="black", lwd=0.1, position = "fill", orientation = "y")    geom_label(data = rotulo, aes(y= Year, x = abs(trabalho), fill=NULL, label=paste(format(round(trabalho, digits=0), nsmall=0, decimal.mark=",", big.mark="."),   format(round(aprovado, digits=0), nsmall=0, decimal.mark=",", big.mark="."))  ), color="black", size=4, position = position_fill(vjust=1.06))    geom_col(width = .7, colour="black", lwd=0.1, position = "fill", orientation = "y")    geom_text(aes(label=format(round(value, digits=0), nsmall=0, decimal.mark=",", big.mark=".")),  size=4, color="white", position = position_fill(vjust=0.5))    theme(panel.grid.major = element_line(colour = "gray90",size=0.75), panel.grid.minor = element_line(colour = "gray90",size=0.75),  legend.position="top", axis.text.x = element_blank(), axis.ticks.x = element_blank(),  axis.title.x = element_blank(), panel.background = element_blank())   scale_fill_manual(values = c("#000000","tomato","blue"))  

Выход:

Выходной ток

Как оно сейчас? Position_fill(vjust=0.5) , поэтому все метки расположены по центру внутри соответствующей панели.

Чего я хочу? Чтобы иметь возможность установить положение метки «Марионеток» слева(как при vjust=0), сохраните метку «Педидо» как есть (в центре панели «Педидо») и поместите метку «Фатура» справа (как при vjust=1).

Заранее спасибо!

Ответ №1:

Одним из вариантов достижения желаемого результата было бы вычислить/задать позиции для каждой метки и выравнивание по горизонтали вручную вместо использования position="fill" :

Использование некоторых случайных фиктивных данных:

 library(ggplot2) library(dplyr)  dfm lt;- dfm %gt;%  group_by(Year) %gt;%  arrange(desc(variable)) %gt;%  mutate(  pct = value / sum(value),  x_label = case_when(  variable == "Marionete" ~ 0,  variable == "Pedido" ~ .5 * (cumsum(pct)   lag(cumsum(pct))),  TRUE ~ 1  ),  hjust = case_when(  variable == "Marionete" ~ 0,  variable == "Pedido" ~ .5,  TRUE ~ 1  )  )   ggplot(dfm, aes(y = Year, x = abs(value), fill = variable))    scale_x_continuous(sec.axis = sec_axis(trans = ~ . * 1, name = "Trab."), expand = expansion(mult = c(0, 0.05)))    geom_col(width = .7, colour = "black", lwd = 0.1, position = "fill", orientation = "y")    geom_text(aes(x = x_label, label = format(round(value, digits = 0), nsmall = 0, decimal.mark = ",", big.mark = "."), hjust = hjust),  size = 4, color = "white"  )    theme(  panel.grid.major = element_line(colour = "gray90", size = 0.75), panel.grid.minor = element_line(colour = "gray90", size = 0.75),  legend.position = "top", axis.text.x = element_blank(), axis.ticks.x = element_blank(),  axis.title.x = element_blank(), panel.background = element_blank()  )    scale_fill_manual(values = c("#000000", "tomato", "blue"))  

данные

 set.seed(123)  dfm lt;- data.frame(  Year = rep(c(2006:2016), each = 3),  value = sample(1:100, 3 * 11, replace = TRUE),  variable = c("Fatura", "Pedido", "Marionete") ) dfm$variable lt;- factor(dfm$variable, levels = c("Fatura", "Pedido", "Marionete")) dfm$Year lt;- factor(dfm$Year)  

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

1. Превосходно! Я пытался ввести это в данные, как вы, но ваша строка variable == "Pedido" ~ .5 * (cumsum(pct) lag(cumsum(pct))) действительно решила мою проблему с hjust(0.5). Просто и эффективно, большое спасибо! Я изменил значение в вашем коде только на abs(значение), потому что я должен выводить отрицательные числа как положительные. Еще раз спасибо!