Qual è un buon modo per usare R per creare un diagramma a dispersione che separa i dati dal trattamento?


30

Sono molto nuovo con R e statistiche in generale, ma ho bisogno di creare un diagramma a dispersione che penso possa essere al di là delle sue capacità native.

Ho un paio di vettori di osservazioni e voglio fare un diagramma a dispersione con loro, e ogni coppia rientra in una delle tre categorie. Vorrei creare un grafico a dispersione che separa ogni categoria, sia per colore che per simbolo. Penso che sarebbe meglio che generare tre diversi grafici a dispersione.

Ho un altro problema con il fatto che in ciascuna delle categorie ci sono cluster di grandi dimensioni in un punto, ma i cluster sono più grandi in un gruppo rispetto agli altri due.

Qualcuno conosce un buon modo per farlo? Pacchetti che dovrei installare e imparare come usare? Qualcuno ha fatto qualcosa di simile?

Grazie

Risposte:


53

cluster di grandi dimensioni : se la sovrastampa è un problema, è possibile utilizzare un'alfa inferiore, quindi i singoli punti sono scuri, ma la sovrastampa rende il colore più intenso. Oppure si passa agli istogrammi 2D o alle stime di densità.

require ("ggplot2")
  • ggplot (iris, aes (x = Sepal.Length, y = Sepal.Width, colour = Species)) + stat_density2d ()
    densità
    Probabilmente vorrai sfaccettare questo ...

  • ggplot (iris, aes (x = Sepal.Length, y = Sepal.Width, fill = Species)) + stat_binhex (bins=5, aes (alpha = ..count..)) + facet_grid (. ~ Species)
    hexbin
    Mentre puoi proclamare questo complotto anche senza sfaccettature, l'ordine in cui le Specie si preannuncia come un quadro finale.

  • Puoi evitarlo se sei disposto a sporcarti le mani (= link a spiegazione e codice) e calcolare colori misti per gli esagoni: inserisci qui la descrizione dell'immagine

  • Un'altra cosa utile è usare bin (esadecimali) per aree ad alta densità e tracciare singoli punti per altre parti:

    ggplot (df, aes (x = date, y = t5)) + 
      stat_binhex (data = df [df$t5 <= 0.5,], bins = nrow (df) / 250) +
          geom_point (data = df [df$t5 > 0.5,], aes (col = type), shape = 3) +
      scale_fill_gradient (low = "#AAAAFF", high = "#000080") +
      scale_colour_manual ("response type", 
        values = c (normal = "black", timeout = "red")) + 
      ylab ("t / s")

    inserisci qui la descrizione dell'immagine


Per completezza dei pacchetti di stampa, vorrei anche menzionare lattice:

require ("lattice")
  • xyplot(Sepal.Width ~ Sepal.Length | Species, iris, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length | Specie, iris, pch = 20) </code>

  • xyplot(Sepal.Width ~ Sepal.Length, iris, groups = iris$Species, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length, iris, groups = iris $ Species, pch = 20) </code>

  • xyplot(Sepal.Width ~ Sepal.Length | Species, iris, groups = iris$Species, pch= 20)
    <code> xyplot (Sepal.Width ~ Sepal.Length | Specie, iris, gruppi = iris $ Specie, pch = 20) </code>


Bello! Grazie mille, i bidoni esagonali hanno fatto perfettamente il trucco!
crf

22

Questo è uno dei problemi classici per il set di dati "Iris". Questo è un collegamento a un intero set di progetti di stampa basati su quel set di dati con codice R, che potresti essere in grado di adattare al tuo problema.

Ecco un approccio che utilizza con base R anziché un pacchetto aggiuntivo.

plot(iris$Petal.Length, iris$Petal.Width, pch=21, 
     bg=c("red","green3","blue")[unclass(iris$Species)], 
     main="Edgar Anderson's Iris Data")

che produce questa figura:

inserisci qui la descrizione dell'immagine

Da lì, a seconda della trama, puoi iniziare a scherzare con i livelli di alfa / trasparenza per consentire la sovrapposizione, ecc. Ma prima vorrei creare un grafico molto semplice.

Mentre ci sono molti motivi per rimanere con la base R, altri pacchetti semplificano la stampa. Separare i dati con una caratteristica distintiva è uno dei punti di forza dei pacchetti ggplot2 e reticolo . ggplot2 crea trame particolarmente visivamente accattivanti. Entrambi i pacchetti sono dimostrati nella risposta da @cbeleites.


4
Leggermente confuso perché sebbene tu raccomandi ggplot2 non lo usi nel tuo esempio? Un equivalente di ggplot2 dovrebbe essere una libreria (ggplot2); qplot (Petal.Length, Petal.Width, color = Species, data = iris, main = "Edgar Anderson's Iris Data"). Ciò ha anche il vantaggio di produrre automaticamente una legenda.
Peter Ellis,

@PeterEllis Questo perché, sebbene io riconosca qualcosa che si presta bene a ggplot2, sono anche solo passivamente competente con la grafica di base.
Fomite,

1
Grande trucco con unclass () nella grafica di base BTW
Peter Ellis,

16

O con ggplot2:

ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, colour = Species)) + geom_point()
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point() + facet_grid(~Species)

Quale produce

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

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.