Controllare la dimensione dei punti in un grafico a dispersione R?


116

In R, la plot()funzione accetta un pchargomento che controlla l'aspetto dei punti nel grafico. Sto creando grafici a dispersione con decine di migliaia di punti e preferisco un punto piccolo, ma non troppo piccolo. Fondamentalmente, trovo pch='.'di essere troppo piccolo, ma pch=19troppo grasso. C'è qualcosa nel mezzo o un modo per ridimensionare i punti in qualche modo?


Invece di rimpicciolire i punti, esiste un modo per tracciare semplicemente dire che 100 punti dati casuali sarebbero più facili da vedere di 1000?
user2363642

Per molti piccoli punti, l'uso di alfa (trasparenza) può rendere un grafico a dispersione molto più informativo rispetto al semplice utilizzo di meno punti per tracciarlo.

1
Suggerisco di non usarlo pch='.', sarà fuori centro. Fonte: pch='.'
usavo

@geneorama Intendi usare ·invece di .?
nanaki

@nanaki più o meno, ma stranamente il tuo simbolo appare come piccole scatole quando lo uso in R. Le risposte seguenti fanno un buon lavoro nello spiegare l'approccio giusto.
geneorama

Risposte:


100

Prova l' cexargomento:

?par

  • cex
    Un valore numerico che fornisce la quantità di ingrandimento del testo e dei simboli della stampa rispetto al valore predefinito. Notare che alcune funzioni grafiche come plot.default hanno un argomento con questo nome che moltiplica questo parametro grafico, e alcune funzioni come i punti accettano un vettore di valori che vengono riciclati. Altri usi prenderanno solo il primo valore se viene fornito un vettore di lunghezza maggiore di uno.

15
Non penso che userei mai 'cex' per controllare la dimensione del simbolo a meno che non avessi altra opzione. Funziona solo per alcune volte; la regola è che quando "cex" è impostato tramite "par", influisce sulla dimensione del (la maggior parte) del testo sul grafico, se impostato all'interno di "trama", "cex" influisce solo sulla dimensione del simbolo. Quindi, se applichi erroneamente quella regola, non solo la dimensione del tuo simbolo non viene modificata, ma ora hai più parametri che influiscono sulla dimensione del testo (cex.axis, cex.lab, cex.main e cex.sub - fanno tutti lo stesso lavoro come 'cex', solo a pezzi). Un codice del genere è difficile da mantenere ed estendere.
Doug

5
Essere d'accordo. L'impostazione cexglobale tramite parmodifica tutti i tipi di cose, inclusi i margini delle figure, che devi correggere. l'impostazione cexall'interno plot, tuttavia, sembra funzionare.
vola il

Il consiglio sposato sopra dal commento di doug non è necessariamente sbagliato, ma esagera in modo significativo qualsiasi potenziale problema con l'utilizzo cexdell'argomento durante la trama. Ci sono molti, molti casi in cui è sia utile che l'opzione migliore.
joran

lwdcontrolla la larghezza della linea del pch, ad es plot(1:5, pch=1:5, col=1:5, lwd=1:5). Grazie a sthda.com/english/wiki/…
geneorama

95

pch = 20 restituisce un simbolo di dimensioni comprese tra "." e 19.

È un simbolo pieno (che è probabilmente quello che vuoi).

A parte questo, anche il sistema grafico di base in R consente all'utente un controllo dettagliato sulle dimensioni, il colore e la forma dei simboli. Per esempio,

dfx = data.frame(ev1=1:10, ev2=sample(10:99, 10), ev3=10:1)

with(dfx, symbols(x=ev1, y=ev2, circles=ev3, inches=1/3,
                  ann=F, bg="steelblue2", fg=NULL))

Esempio di grafico


Amo questa trama, ma vorrei che il raggio fosse uguale al numero di osservazioni su quel punto, potresti mostrarmi come farlo?
Derk Arts

pi*R^2(la superficie) dovrebbe essere proporzionale al numero di osservazioni.
SESman

5
@saratis Questo farà quello che vuoi:symbols(x=dfx$ev1, y=dfx$ev2, circles=sqrt(dfx$ev3/pi), inches=1/3, ann=F, bg="steelblue2", fg=NULL)
fmark

1
qualche idea su come potrei usarlo per tracciare più serie sullo stesso grafico? cioè "punti (x = dfx2 $ ev1, y = dfx2 $ ev2, cerchi = dfx2 $ ev3, ...)" non funziona.
Neodyme

Nel caso ti stia chiedendo "Cos'è un pollice?" vedi qui
MichaelChirico

22

Come affermato da rcs , cexfarà il lavoro nel pacchetto grafico di base. Immagino che tu non sia disposto a fare il tuo grafico ggplot2ma se lo fai, c'è un sizeattributo estetico, che puoi facilmente controllare ( ggplot2ha argomenti di funzione user-friendly: invece di digitare cex(espansione dei caratteri), ggplot2puoi digitare ad es. size = 2E otterrai un punto di 2 mm).

Ecco l'esempio:

### base graphics ###
plot(mpg ~ hp, data = mtcars, pch = 16, cex = .9)

### ggplot2 ###
# with qplot()
qplot(mpg, hp, data = mtcars, size = I(2))
# or with ggplot() + geom_point()
ggplot(mtcars, aes(mpg, hp), size = 2) + geom_point()
# or another solution:
ggplot(mtcars, aes(mpg, hp)) + geom_point(size = 2)

4
E, se stai davvero tracciando decine di migliaia di punti, ggplot2 ha diversi modi alternativi per renderlo piacevole: aggiustamenti alfa, contenitori esadecimali, grafici di contorno, ecc. Controlla le pagine 72-77 del libro ggplot2, se ce n'è uno nella tua biblioteca o se la tua biblioteca ha accesso elettronico ai libri Springer (penso che la maggior parte dei libri R siano lì).
Matt Parker

Sì ... lo uso soprattutto alphanei grafici a dispersione, per evitare l'overplot.
aL3xa

@ aL3xa Puoi usare alpha nel pacchetto grafico di base. Basta aggiungere ad esempio col = rgb(0, 0, 0, 0.6)nelle opzioni di trama.
RobJan
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.