Come correggere le proporzioni in ggplot?


89

Sto cercando di ridimensionare un grafico per adattarlo al mio documento, ma ho difficoltà a far sì che il diagramma tracciato sia un quadrato.

Esempio:

pdf(file = "./out.pdf", width = 5, height = 5)
p <- ggplot(mydata, aes(x = col1, y = col2))
print(p)
aux <- dev.off()

Sebbene i limiti per x e y siano gli stessi, il grafico nel risultato non è quadrato. Immagino che R renda il pannello che lo racchiude 5x5 "ma non si preoccupa delle dimensioni effettive del diagramma.

Come posso riattivare i miei diagrammi?

Risposte:


115

Il ggplotmeccanismo per preservare le proporzioni della trama consiste nell'aggiungere un coord_fixed()livello alla trama. Ciò manterrà le proporzioni del grafico stesso, indipendentemente dalla forma del riquadro di delimitazione effettivo.

(Ti suggerisco anche ggsavedi salvare la trama risultante in pdf / png / ecc, piuttosto che nella pdf(); print(p); dev.off()sequenza.)

library(ggplot2)
df <- data.frame(
    x = runif(100, 0, 5),
    y = runif(100, 0, 5))

ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()

inserisci qui la descrizione dell'immagine


3
Sai perché ggplot insiste a mettere l'etichetta dell'asse y verso sinistra? Mi piacerebbe sapere come evitare che ...
Chase

@chase Una soluzione alternativa è modificare la hjustposizione del titolo: prova opts(axis.title.y=theme_text(hjust=10)). Ma, purtroppo, non sembra. Vedi groups.google.com/group/ggplot2/browse_thread/thread/… per una discussione sulla mailing list ggplot e la risposta di @ Baptiste.
Andrie

3
Questo comportamento è stato risolto nella versione di sviluppo.
Hadley

5
Con il titolo più generale della domanda, potresti forse anche aggiungere informazioni su come calcolare il rapporto (l'argomento per coord_fixed) dato che non si usano gli stessi limiti su entrambi gli assi?
htorque

1
In seguito al commento di @ htorque; se y invece è definito come y=runif(100, 0, 50)allora l'aspetto del grafico non è più quadrato. coord_fixed()fa sì che la scala di ogni asse sia uguale solo che sembra?
un diverso ben

80

Per garantire un rapporto di aspetto particolare, ad esempio per il quadrato, utilizzare theme(aspect.ratio=1).

La risposta di Andrie non fornisce il quadro completo, poiché l'esempio fornisce dati forse innaturali in cui l'intervallo di x è uguale all'intervallo di y. Se invece i dati fossero:

df <- data.frame(
  x = runif(100, 0, 50),
  y = runif(100, 0, 5))
ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed()

quindi la trama sarebbe simile a questa:

inserisci qui la descrizione dell'immagine

La funzione coord_fixed () ha anche un argomento per regolare il rapporto degli assi:

ratio rapporto d'aspetto, espresso come y / x

In modo che la trama possa essere quadrata con:

ggplot(df, aes(x=x, y=y)) + geom_point() + coord_fixed(ratio=10)

inserisci qui la descrizione dell'immagine

Ma è necessario regolarlo con i limiti delle variabili o dell'area del grafico (non tutti i limiti sono ben divisibili per numeri interi come questi esempi).


13

Per completezza: se si desidera prendere in considerazione limiti di assi molto diversi:

df <- data.frame(
  x = runif(100, 0, 5000),
  y = runif(100, 0, 5))
ratio.display <- 4/3
ratio.values <- (max(df$x)-min(df$x))/(max(df$y)-min(df$y))
plot <- ggplot(df, aes(x=x, y=y)) + geom_point()
plot + coord_fixed(ratio.values / ratio.display)

Con il risultato di:


14
come è meglio di plot + theme(aspect.ratio=4/3)? Il ggplot può avere più livelli, con più set di dati e gli assi possono avere fattori di espansione arbitrari, quindi il calcolo del rapporto y / x da una sorgente dati sembra piuttosto fragile.
baptiste

2
Perché questo apparentemente non è facilmente individuabile. Ciò è dimostrato dal fatto che ci sono tre risposte qui, ma nessuna ne fa menzione. Dovresti metterlo in una risposta, è sicuramente la soluzione migliore.
Graipher
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.