Tracciare più linee (serie di dati) ciascuna con un colore unico in R

Sono abbastanza nuovo per R e ho le seguenti domande:

Sto provando a generare una trama in R che ha più linee (serie di dati). Ognuna di queste linee è una categoria e voglio che abbia un colore unico.

Attualmente il mio codice è configurato in questo modo:

In primo luogo, sto creando una trama vuota:

plot(1,type='n',xlim=c(1,10),ylim=c(0,max_y),xlab='ID', ylab='Frequency') 

Quindi per ciascuna delle mie categorie, sto tracciando delle linee in questa trama vuota usando un ciclo “for” in questo modo:

 for (category in categories){ lines(data.frame.for.this.category, type='o', col=sample(rainbow(10)), lwd=2) } 

Ci sono 8 categorie qui, e quindi ci sono 8 linee prodotte nella trama. Come puoi vedere, sto provando a campionare un colore dalla funzione di rainbows () per generare un colore per ogni riga.

Tuttavia, quando viene generata la trama, trovo che ci sono più righe che hanno lo stesso colore. Ad esempio, 3 di quelle 8 linee hanno il colore verde.

Come faccio a rendere ognuna di queste 8 linee un colore unico?

Inoltre, come posso riflettere questa unicità nella leggenda della trama? Stavo cercando di cercare la funzione legend() , tuttavia non era chiaro quale parametro dovrei usare per riflettere questo colore unico per ogni categoria?

Qualsiasi aiuto o suggerimento sarebbe molto apprezzato.

    Se i tuoi dati sono in formato largo, matplot è fatto per questo e spesso dimenticato di:

      dat < - matrix(runif(40,1,20),ncol=4) # make data matplot(dat, type = c("b"),pch=1,col = 1:4) #plot legend("topleft", legend = 1:4, col=1:4, pch=1) # optional legend 

    C'è anche il bonus aggiuntivo per chi non ha familiarità con cose come ggplot che la maggior parte dei parametri di ggplot come pch ecc. Sono gli stessi usando matplot() come plot() . inserisci la descrizione dell'immagine qui

    Se desideri una soluzione ggplot2 , puoi farlo se puoi modellare i tuoi dati in questo formato (vedi esempio sotto)

     # dummy data set.seed(45) df < - data.frame(x=rep(1:5, 9), val=sample(1:100, 45), variable=rep(paste0("category", 1:9), each=5)) # plot ggplot(data = df, aes(x=x, y=val)) + geom_line(aes(colour=variable)) 

    ggplot2_geom_line

    Hai la giusta strategia generale per fare ciò usando la grafica di base, ma come è stato sottolineato stai dicendo a R di scegliere un colore a caso da un set di 10 per ogni linea. Detto questo, non sorprende che occasionalmente otterrai due linee con lo stesso colore. Ecco un esempio utilizzando la grafica di base:

     plot(0,0,xlim = c(-10,10),ylim = c(-10,10),type = "n") cl < - rainbow(5) for (i in 1:5){ lines(-10:10,runif(21,-10,10),col = cl[i],type = 'b') } 

    inserisci la descrizione dell'immagine qui

    Notare l'uso di type = "n" per sopprimere tutto il plottaggio nella chiamata originale per impostare la finestra e l'indicizzazione di cl all'interno del ciclo for.

    Usando @Arun dummy data 🙂 ecco una soluzione latex :

     xyplot(val~x,type=c('l','p'),groups= variable,data=df,auto.key=T) 

    inserisci la descrizione dell'immagine qui

    Più di una linea può essere disegnata sullo stesso grafico usando la funzione lines()

     # Create the data for the chart. v < - c(7,12,28,3,41) t <- c(14,7,6,19,3) # Give the chart file a name. png(file = "line_chart_2_lines.jpg") # Plot the bar chart. plot(v,type = "o",col = "red", xlab = "Month", ylab = "Rain fall", main = "Rain fall chart") lines(t, type = "o", col = "blue") # Save the file. dev.off() 

    PRODUZIONE inserisci la descrizione dell'immagine qui

    Lo so, è il suo vecchio post a rispondere ma, come mi sono imbattuto nella ricerca dello stesso post, anche qualcun altro potrebbe girare qui

    Aggiungendo: colore nella funzione ggplot, potrei ottenere le linee con colors diversi relativi al gruppo presente nella trama.

     ggplot(data=Set6, aes(x=Semana, y=Net_Sales_in_pesos, group = Agencia_ID, colour = as.factor(Agencia_ID))) 

    e

     geom_line() 

    Grafico a linee con più colori

    Ecco un codice di esempio che include una legenda se è interessante.

     # First create an empty plot. plot(1, type = 'n', xlim = c(xminp, xmaxp), ylim = c(0, 1), xlab = "log transformsd coverage", ylab = "frequency") # Create a list of 22 colors to use for the lines. cl < - rainbow(22) # Now fill plot with the log transformed coverage data from the # files one by one. for(i in 1:length(data)) { lines(density(log(data[[i]]$coverage)), col = cl[i]) plotcol[i] <- cl[i] } legend("topright", legend = c(list.files()), col = plotcol, lwd = 1, cex = 0.5) 

    Ecco un altro modo per aggiungere linee usando plot() :

    Innanzitutto, usa la funzione par(new=T)

    opzione:

    http://cran.r-project.org/doc/contrib/Lemon-kickstart/kr_addat.html

    Per colorarli in modo diverso avrai bisogno di col() .

    Per evitare descrizioni di assi superflue utilizzare xaxt="n" e yaxt="n" per il secondo e ulteriori grafici.

    Oltre alla risposta di @ joran usando la funzione di plot base con un ciclo for , puoi anche usare il plot base con lapply :

     plot(0,0,xlim = c(-10,10),ylim = c(-10,10),type = "n") cl < - rainbow(5) invisible(lapply(1:5, function(i) lines(-10:10,runif(21,-10,10),col = cl[i],type = 'b'))) 
    • Qui, la funzione invisible serve semplicemente a prevenire lapply dal produrre un output di lista nella tua console (poiché tutto ciò che vogliamo è la ricorsione fornita dalla funzione, non una lista).

    inserisci la descrizione dell'immagine qui

    Come puoi vedere, produce lo stesso risultato dell'utilizzo dell'approccio ciclo for .

    Allora perché usare lapply ?

    Sebbene lapply abbia dimostrato di esibirsi più velocemente / meglio che in R (ad esempio, vedi qui , anche se vedi qui per un'istanza in cui non lo è), in questo caso si comporta all'incirca sullo stesso:

    Upping il numero di linee a 50000 sia per lapply che for approcci ha richiesto il mio sistema rispettivamente di 46.3 e 46.55 secondi.

    • Quindi, anche se lapply era leggermente più veloce, lo era in modo trascurabile. Questa differenza di velocità potrebbe rivelarsi utile con grafici più grandi / più complessi, ma siamo onesti, 50000 linee sono probabilmente un soffitto piuttosto buono ...

    Quindi la risposta a "perché lapply ?": È semplicemente un approccio alternativo che funziona allo stesso modo. 🙂