2016-01-12 5 views
12

Otwieram to pytanie z trzech powodów: po pierwsze, aby ponownie otworzyć dwuosiową dyskusję za pomocą ggplota. Po drugie, aby zapytać, czy istnieje ogólne podejście, które nie ma na celu torturowania. I wreszcie poprosić o pomoc w odniesieniu do obejścia.Drugorzędna/podwójna oś - ggplot

Zdaję sobie sprawę, że istnieje wiele dyskusji i pytań dotyczących dodawania osi pomocniczej do ggplot. Ci, zazwyczaj kończy się na jeden z dwóch wniosków:

  1. To źle, nie rób tego: Hadley Wickham odpowiedział na to samo pytanie here, stwierdzając, że nie jest to możliwe. Miał bardzo dobry argument, zgodnie z którym "za pomocą oddzielnych skal y (nie w skali y, które są transformacjami nawzajem) są zasadniczo wadliwe".

  2. Jeśli upierasz, nadmiernie komplikować swoje życie i zastosowania siatek na przykład: here i here


Jednak tutaj są pewne sytuacje, które często stoją, w którym wizualizacja bardzo skorzystałaby na dwuosiowości. Wyjaśniłem poniższe pojęcia.

  1. Działka szerokości, a tym samym powielenie oś y prawej strony pomoże (lub oś X na górze), by ułatwić interpretacji. (Wszyscy natknął się jeden z tych działek, na których musimy użyć linijki na ekranie, ponieważ oś jest zbyt daleko) enter image description here

  2. muszę dodać nową oś, która jest transformacja do oryginalnych osi (np. Wartości procentowe, kwantyle, ...). (jestem obecnie w obliczu problemu z tym przykładem powtarzalne poniżej). enter image description here

  3. i wreszcie, dodając Grupowanie/Meta informacje: I natknąć się, że podczas korzystania z danych kategorycznych ze stwardnieniem poziomie, (np : Categories = {1,2, x, y, z}, które są "meta-podzielone" na litery i cyfry.) Mimo że kodowanie kolorami meta-poziomów i dodawanie legendy, a nawet fasetowania rozwiązują problem, rzeczy uzyskać nieco prostszą oś pomocniczą, w której użytkownik nie musi dopasowywać koloru pasków do koloru legendy. enter image description here


pytanie ogólne: Biorąc pod uwagę nowe funkcje rozszerzalności ggplot 2.0.0, czy jest bardziej wytrzymała bez tortur sposób mieć dwuosiowy bez użycia siatki?

I ostatnia uwaga: absolutnie zgadzam się, że niewłaściwe użycie podwójnej osi może być niebezpiecznie mylące ... Ale czy tak nie jest w przypadku wizualizacji informacji i nauki o danych w ogóle?



obejście pytanie:

Obecnie muszę mieć procentową oś (2nd przypadku). Użyłem annotate i geom_hline jako obejścia. Nie mogę jednak przenieść tekstu poza główny wątek. hjust również nie działa ze mną.

Powtarzalne przykład:

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

można użyć latticeExtra jeśli naprawdę chcesz mieć drugą oś Y – MLavoie

+0

@MLavoie, to trochę frustrujące, że należałoby zmienić ggplot do kraty, dla takiego prosta powodu .. –

+0

Pamiętam, że Hadley napisał gdzieś, że drugorzędne osie, które są transformacjami osi głównych, byłyby dopuszczalne i prawdopodobnie zaakceptowałby żądanie ściągnięcia, które dodaje taką funkcjonalność. – Roland

Odpowiedz

4

W odpowiedzi na # 1

Wszyscy natknął się jeden z tych działek, na których musimy użyć linijki na ekranie, ponieważ oś jest za daleko

cowplot.

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