Альтернативная позиция geom_text с hjust

Я рисую столбчатую диаграмму с накоплением и использую geom_text для вставки значения каждого стека. Сложность, с которой я сталкиваюсь, заключается в том, что некоторые стопки очень маленькие / узкие, поэтому текст двух стопок перекрывает друг друга и, следовательно, не очень удобочитаем. Я хотел бы настроить расположение текста таким образом, чтобы, например, положение текста чередовалось между hjust == 1 и hjust == -1 для каждого стека, чтобы не было перекрытий (или любой другой метод, который приведет к читаемому тексту).

Вот пример того, что я делаю в настоящее время (ниже указано dput из mydf):

library(ggplot2)

ggplot(mydf, aes(x=variable, y = value, fill = Category)) + 
  geom_bar(stat="identity") +
  geom_text(aes(label = value, y = pos-(value/2)), size = 3) 

Что я пробовал до сих пор:

Использование position = position_dodge(width = 0.5) и position = position_jitter(h =0.5, w = 0.5), но ни один из них не привел к тому, что я пытался сделать.

Моей первой мыслью было определить hjust = c(1,-1) в надежде, что он будет переработан, а тексты будут чередоваться между hjust == 1 и hjust == -1, но это приводит к сообщению об ошибке:

Error: Incompatible lengths for set aesthetics: size, hjust

Я также попытался определить size = c(3,3,3,3,3,3,3,3,3), hjust = c(1,-1,1,-1,1,-1,1,-1,1), но это привело к тому же сообщению об ошибке.

Я был бы признателен за несколько советов о том, как добиться этого правильным путем (и я также открыт для других предложений).

Я не мог понять, почему dput не работал (также и для меня), поэтому вот данные в читаемом формате:

    Category variable value   pos maxpos
1        AX       WW  47.8  47.8  184.1
2        AY       WW   5.6  53.4  184.1
3        AZ       WW  15.8  69.2  184.1
4        BX       WW  31.4 100.6  184.1
5        BY       WW  11.7 112.3  184.1
6        BZ       WW  10.7 123.0  184.1
7        CX       WW   2.2 125.2  184.1
8        CY       WW  21.4 146.6  184.1
9        CZ       WW  37.5 184.1  184.1
10       AX       SM  39.8  39.8  148.6
11       AY       SM   2.9  42.7  148.6
12       AZ       SM  13.2  55.9  148.6
13       BX       SM  22.7  78.6  148.6
14       BY       SM   7.3  85.9  148.6
15       BZ       SM   8.9  94.8  148.6
16       CX       SM   1.6  96.4  148.6
17       CY       SM  17.3 113.7  148.6
18       CZ       SM  34.9 148.6  148.6
19       AX     AsIs 156.9 156.9  519.0
20       AY     AsIs  13.1 170.0  519.0
21       AZ     AsIs  70.5 240.5  519.0
22       BX     AsIs  72.6 313.1  519.0
23       BY     AsIs  30.7 343.8  519.0
24       BZ     AsIs  35.6 379.4  519.0
25       CX     AsIs   5.2 384.6  519.0
26       CY     AsIs  44.8 429.4  519.0
27       CZ     AsIs  89.6 519.0  519.0

person talat    schedule 08.07.2014    source источник
comment
Я не могу загрузить ваш dput по какой-то причине   -  person David Arenburg    schedule 08.07.2014
comment
@DavidArenburg, я не знаю, что случилось, надеюсь, вы не против использовать другой формат.   -  person talat    schedule 08.07.2014
comment
См. stackoverflow.com/a/50060510/2270475 для получения другого полезного решения.   -  person Moody_Mudskipper    schedule 27.04.2018


Ответы (1)


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

mydf$hj <- rep(c(1,0,-1), length.out=27)

ggplot(mydf, aes(x=variable, y=value, fill=Category)) + 
  geom_bar(stat="identity") +
  geom_text(aes(label=value, y=pos-(value/2), hjust=hj), size=4)

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


Слегка альтернативное решение, предложенное @konvas:

ggplot(mydf, aes(x=variable, y=value, fill=Category)) + 
  geom_bar(stat="identity") +
  geom_text(aes(label=value, y=pos-(value/2), hjust=rep(c(1,0,-1), length.out=length(value))), size=4)
person Jaap    schedule 08.07.2014
comment
Спасибо Jaap, это как раз то, что мне нужно :) +1 - person talat; 08.07.2014
comment
Или не создавайте новую переменную явно и добавьте hjust = rep(c(-1, 1), length.out = length(value)) в исходный вызов (внутри aes). - person konvas; 08.07.2014
comment
@konvas Спасибо за предложение. Я обновил свой ответ. - person Jaap; 08.07.2014