2015-04-30 20 views
14

Sto provando a tracciare punti dati con tre colori diversi per tre intervalli di valori. Per esempio:ggplot geom_point() con colori basati su specifici valori discreti

library(ggplot2) 
ggplot(mtcars, aes(wt, mpg)) + geom_point(aes(colour = qsec)) 

È possibile che questo produce:

enter image description here

Ora, vorrei modificare questo modo i valori che qseq < 17 sono neri, valori compresi tra 17 e 19 sono di colore giallo e di valori di cui sopra 19 sono rossi. Ho provato vari approcci, ma nessuno di loro sembra funzionare:

  • Tratto da here

    ggplot(mtcars, aes(wt, mpg)) + geom_point(aes(fill = qsec)) + 
    scale_fill_gradientn(colours=c("black","yellow","red"), 
    breaks=c(0,17,19), labels=format(c("0","17","19"))) 
    

    Questo produce:

    enter image description here

    Così, il colorbar sembra corretto ma i colori non sono effettivamente applicati.

  • Le soluzioni fornite in ggplot2 heatmap with colors for ranged values sembrano promettenti ma non riesco a farle funzionare con geom_point().

  • Lo stesso vale per vari post simili, come quelli elencati nella barra laterale.

mi rendo conto probabilmente avrò bisogno di utilizzare una sorta di scala discreta invece di scale_fill_gradientn ma i miei tentativi di utilizzare scale_color_manual() fallire:

ggplot(mtcars, aes(wt, mpg)) + geom_point(aes(color = factor(qsec))) + 
scale_color_manual(values=c("black", "yellow","red") 
Error: Insufficient values in manual scale. 30 needed but only 4 provided. 

Sono indovinando io in qualche modo necessario utilizzare cut() o factor() ma non riesco a capire come. Eventuali suggerimenti?

risposta

22

È necessario cut i valori in intervalli:

library(ggplot2) 
ggplot(mtcars, aes(wt, mpg)) + 
    geom_point(aes(colour = cut(qsec, c(-Inf, 17, 19, Inf))), 
      size = 5) + 
    scale_color_manual(name = "qsec", 
        values = c("(-Inf,17]" = "black", 
            "(17,19]" = "yellow", 
            "(19, Inf]" = "red"), 
        labels = c("<= 17", "17 < qsec <= 19", "> 19")) 

resulting plot

+0

Hi @roland Sarebbe questo scale_color_manual impostazione corsa con geom_line? – pacomet

+0

Una scala di colori viene applicata a tutte le aree geografiche per le quali viene mappato un colore. – Roland

+0

Ho provato ad adattare il codice ai miei dati ma non ci sono riuscito. Quello di cui ho bisogno è colorare una singola geom_line() a seconda dei valori di y. Questa immagine (https://www.dropbox.com/s/du6fjvr71vybhuu/Rplot.png?dl=0) mostra ciò che sto cercando. Forse dovrei aprire una domanda. – pacomet

Problemi correlati