2016-01-12 14 views
12

Sto aprendo questa domanda per tre motivi: in primo luogo, per riaprire la discussione su due assi con ggplot. Secondo, chiedere se esiste un approccio generico non torturante per farlo. E infine per chiedere il tuo aiuto per quanto riguarda un work-around.Secondary/Dual axis - ggplot

Mi rendo conto che ci sono più discussioni e domande su come aggiungere un asse secondario a un ggplot. Quelli di solito finiscono in una delle due conclusioni:

  1. E 'male, non farlo: Hadley Wickham ha risposto alla stessa domanda here, giungendo alla conclusione che non è possibile. Ha avuto un'ottima argomentazione sul fatto che lo "usando scale y separate (non le scale y che sono trasformazioni l'una dell'altra) sono fondamentalmente errate".

  2. se insistete, over-complicare la vita e sull'uso di griglie: per esempio here e here


Tuttavia, qui ci sono alcune situazioni che spesso devono affrontare, in cui la visualizzazione trarrebbe grande beneficio dal doppio asse. Ho astratto i concetti di seguito.

  1. La trama è ampia, quindi duplicando l'asse y sul lato destro aiuterebbe (o asse x in alto) allevierebbe interpretazione. (Abbiamo tutti siamo imbattuti in una di quelle trame in cui abbiamo bisogno di usare un righello sullo schermo, perché l'asse è troppo lontano) enter image description here

  2. ho bisogno di aggiungere un nuovo asse che è una trasformazione agli assi originali (es .: percentuali, quantili, ..). (attualmente sto affrontando un problema con questo esempio riproducibile al di sotto.) enter image description here

  3. E, infine, l'aggiunta di Raggruppamento/Meta informazioni: inciampo in che quando si utilizzano dati categorici con più livelli, (ad esempio, : Categorie = {1,2, x, y, z}, che sono "meta-divisi" in lettere e numeri.) Anche se i codici a colori i meta-livelli e l'aggiunta di una legenda o addirittura di sfaccettature risolvono il problema, le cose diventa un po 'più semplice con un asse secondario, in cui l'utente non deve necessariamente abbinare il colore delle barre a quello della legenda. enter image description here


Domanda di carattere generale: Date le nuove caratteristiche di estensibilità ggplot 2.0.0, c'è un più robusto modo non-tortura per avere due assi senza l'utilizzo di griglie?

E un ultimo commento: Sono assolutamente d'accordo che l'uso sbagliato del doppio asse può essere pericolosamente fuorviante ... Ma non è forse il caso della visualizzazione delle informazioni e della scienza dei dati in generale?



work-around in discussione:

Attualmente, ho bisogno di avere una percentuale di assi (2 ° caso). Ho usato annotate e geom_hline come soluzione alternativa. Tuttavia, non riesco a spostare il testo all'esterno della trama principale. Anche lo hjust non sembra funzionare con me.

esempio riproducibile:

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

si potrebbe usare latticeExtra se si vuole veramente avere un secondo asse y – MLavoie

+0

@MLavoie, è un po 'frustrante che si potrebbe cambiare da ggplot a reticolo, per un motivo come straight-forward .. –

+0

ricordo che Hadley ha scritto da qualche parte che gli assi secondari che sono trasformazioni degli assi primari sarebbero accettabili e probabilmente accetterebbe una richiesta di pull che aggiunge tale funzionalità. – Roland

risposta

4

In risposta a # 1

Abbiamo tutti siamo imbattuti in una di quelle trame in cui abbiamo bisogno di usare un righello sullo schermo, perché l'asse è troppo

cowplot.

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