Вторичная/двойная ось - ggplot

Я открываю этот вопрос по трем причинам: во-первых, чтобы повторно открыть обсуждение с двумя осями с помощью ggplot. Во-вторых, чтобы спросить, существует ли непроверенный общий подход для этого. И, наконец, попросить о вашей помощи в отношении работы.

Я понимаю, что есть несколько дискуссий и вопросы о том, как добавить вторичную ось к ggplot. Обычно это заканчивается одним из двух заключений:

  • Плохо, не делай этого: Хэдли Уикхем ответил на тот же вопрос здесь, заключив, что это невозможно, У него был очень хороший аргумент, что "использование отдельных шкал y (не y-шкалы, которые являются преобразованиями друг друга) в корне ошибочны".

  • Если вы настаиваете, слишком усложняете свою жизнь и используете сетки: например здесь и здесь


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

  • Сюжет широк, поэтому дублирование ось y с правой стороны поможет (или оси x сверху) облегчит интерпретацию. (Мы все наткнулись на один из тех участков, где нам нужно использовать линейку на экране, потому что ось слишком далеко) введите описание изображения здесь

  • Мне нужно добавить новую ось, которая является преобразованием, к исходным осям (например: проценты, квантилы,..). (В настоящее время я сталкиваюсь с проблемой. Воспроизводимый пример ниже) введите описание изображения здесь

  • И, наконец, добавив Grouping/Meta information: я наткнулся на это при использовании категориальных данных с несколькими уровнями (например: Categories = {1,2, x, y, z }, которые "метаразделяются" на буквы и цифры.) Несмотря на то, что цветовое кодирование метауровней и добавление легенды или даже фрейминга решают проблему, все становится немного проще с вторичной осью, где пользователь выиграл Не нужно сопоставлять цвет баров с цветом легенды. введите описание изображения здесь


Общий вопрос: Учитывая новые функции расширяемости ggplot 2.0.0, есть ли еще - простой способ без пыток иметь двойную ось без использования сеток?

И один последний комментарий: я абсолютно согласен с тем, что неправильное использование двойной оси может быть опасно вводить в заблуждение... Но разве это не случай визуализации информации и науки о данных вообще?



Вопрос о работе:

В настоящее время мне нужно иметь процентную ось (второй случай). Я использовал annotate и geom_hline как обходной путь. Однако я не могу перемещать текст за пределами основного сюжета. hjust также не работал со мной.

Воспроизводимый пример:

library(ggplot2)

# Random values generation - with some manipulation : 
maxVal = 500
value = sample(1:maxVal, size = 100, replace = T)
value[value < 400] = value[value < 400] * 0.2
value[value > 400] = value[value > 400] * 0.9


# Data Frame prepartion : 
labels = paste0(sample(letters[1:3], replace = T, size = length(value)), as.character(1:length(value)))
df = data.frame(sample = factor(labels, levels = labels), value = sort(value, decreasing = T))


# Plotting : Adding Percentages/Quantiles as lines  
ggplot(data = df, aes(x = sample, y = value)) + 
  geom_bar(stat = "identity", fill = "grey90", aes(y = maxVal )) + 
  geom_bar(stat = "identity",  fill = "#00bbd4") + 
  geom_hline(yintercept = c(0, maxVal)) + # Min and max values
  geom_hline(yintercept = c(maxVal*0.25, maxVal*0.5, maxVal*0.75), alpha = 0.2) +  # Marking the 25%, 50% and 75% values 
  annotate(geom = "text", x = rep(100,3), y = c(maxVal*0.25, maxVal*0.5, maxVal*0.75), 
           label = c("25%", "50%", "75%"), vjust = 0, hjust = 0.2) +  
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  theme(panel.background = element_blank()) + 
  theme(plot.background = element_blank()) + 
  theme(plot.margin = unit(rep(2,4), units = "lines")) 

Ответ 1

В ответ на # 1

Мы все наткнулись на один из тех участков, где нам нужно использовать линейку на экране, потому что ось слишком далеко

cowplot.

# Assign your original plot to some variable, `gpv` <- ggplot( ... )
ggdraw(switch_axis_position(gpv, axis="y", keep="y"))