#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(значение), потому что я должен выводить отрицательные числа как положительные. Еще раз спасибо!