2016-01-12 2 views
12

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

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

  1. Это плохо, не делайте этого: Hadley Викхам ответил тот же вопрос here, заключив, что это не представляется возможным. У него был очень хороший аргумент в пользу того, что «с использованием отдельных шкал y (не y-шкалы, которые являются преобразованиями друг друга) в корне ошибочны».

  2. Если вы настаиваете, чрезмерно усложняют вашу жизнь и использование сетей: например here и here


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

  1. Участок широкий, следовательно, дублируя ось у на правой стороне будет способствовать (или по оси Х на вершине) будет облегчить интерпретацию. (Мы все наткнулись один из тех участков, где мы должны использовать линейку на экране, потому что ось слишком далеко) enter image description here

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

  3. И, наконец, добавив Группировки/Meta информации: Я наткнуться, что при использовании категориальных данных с множественным уровнем, (например, : Категории = {1,2, x, y, z}, которые «метадеблируются» на буквы и цифры.) Несмотря на то, что цветовое кодирование метауровней и добавление легенды или даже фасетки решают проблему, вещи получить немного проще со вторичной осью, где пользователю не нужно будет соответствовать цвету баров по отношению к легенде. enter image description here


Общий вопрос: Учитывая новые возможности расширяемости 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")) 
+0

вы могли бы использовать latticeExtra, если вы действительно хотите иметь вторую ось у – MLavoie

+0

@MLavoie, это немного расстраивает, что можно было бы изменить от ggplot решетки, для такой прямой вперед причины .. –

+0

я помню, что Хэдли писал где-то, что вторичные оси, которые являются преобразованиями первичных осей, были бы приемлемыми, и он, вероятно, согласился бы с запросом на растяжение, который добавит такую ​​функциональность. – Roland

ответ

4

В ответ на # 1

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

cowplot.

# Assign your original plot to some variable, `gpv` <- ggplot(...) 
ggdraw(switch_axis_position(gpv, axis="y", keep="y")) 
Смежные вопросы