Я открываю этот вопрос по трем причинам: во-первых, чтобы повторно открыть обсуждение с двумя осями с помощью 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"))