Подталкивать / перемещать геометрические метки по отдельности или через эстетику?

#r #ggplot2

#r #ggplot2

Вопрос:

Я пытаюсь составить ответы на серию вопросов типа Likert с помощью ggplot(). Я рассчитал пропорции для каждого ответа («Полностью согласен», «Согласен» и т. Д.) На Каждый вопрос, Используя dplyr, И теперь хочу отобразить пропорции в виде столбчатой диаграммы (по одному столбцу на вопрос). Приведенный ниже код дает представление о том, что у меня есть на данный момент.

 library(ggplot2)

dat <- data.frame(Question = "Q1", 
                  Response = LETTERS[1:5], 
                  freq = c(.01, .03, .11, .35, .5),
                  offset = c(.5, .25, 0, 0, 0))

ggplot(dat, aes(x = Question, y = freq, fill = Response, label = Response))   
  geom_col()   
  geom_label(position = position_stack(vjust = 0.5))
 

Мне нужно включить метки для каждого ответа, показывающие пропорцию; моя проблема возникает из-за того, что очень немногие респонденты не согласны / категорически не согласны, что означает, что столбцы для этих ответов слишком малы, чтобы содержать метки (см. A и B в примере), и они перекрываются.

Я хочу смещать метки для конкретных ответов на фиксированную величину, чтобы они не перекрывались. Интуитивно я надеялся, что что-то подобное сработает:

 ggplot(dat, aes(x = Question, y = freq, fill = Response, label = Response))   
  geom_col()   
  geom_label(position = position_stack(vjust = 0.5), nudge_x = offset)
 

Но это возвращает «Ошибка: вы должны указать либо position или nudge_x / nudge_y «.

Я пытался использовать vjust aesthetic, но это недостаточно сдвигает метки, чтобы решить проблему.

Есть предложения о том, как переместить geom_labels с помощью эстетики? Пожалуйста, дайте мне знать, если вам нужна дополнительная информация!

Ответ №1:

1. «Ошибка: необходимо указать либо позицию, либо nudge_x / nudge_y».

Ошибка довольно понятна, вы не можете использовать nudge_x ее в сочетании ни с position_stack тем, ни с другим, поскольку оба являются параметрами для одного и того же position параметра:

Из исходного кода ggplot2:

   if (!missing(nudge_x) || !missing(nudge_y)) {
    if (!missing(position)) {
      stop("You must specify either `position` or `nudge_x`/`nudge_y`.", call. = FALSE)
    }

    position <- position_nudge(nudge_x, nudge_y)
  }
 

2. Есть предложения о том, как переместить geom_labels с помощью эстетики?

 dat <- data.frame(Question = "Q1", 
                  Response = LETTERS[1:5], 
                  freq = c(.01, .03, .11, .35, .5),
                  offset = c(.03, 0, 0, 0, 0))

ggplot(dat, aes(x = Question, y = freq, fill = Response, label = Response))   
  geom_col()   
  geom_label(aes(y = freq   offset), position = position_stack(vjust = 0.5))
 

Вы можете изменить эстетику, вызвав aes снова в geom_label вызове, здесь я добавил offset к исходной частоте (обратите внимание, что я также изменил значения смещения в вашем фрейме данных для создания лучшего графика):

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