web-dev-qa-db-fra.com

Tracer plusieurs lignes (séries de données) avec chacune une couleur unique en R

Je suis assez nouveau pour R et j'ai les requêtes suivantes:

J'essaie de générer un tracé en R qui comporte plusieurs lignes (séries de données). Chacune de ces lignes est une catégorie et je veux qu’elle ait une couleur unique.

Actuellement, mon code est configuré de la manière suivante:

Tout d'abord, je crée un terrain vide:

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

Ensuite, pour chacune de mes catégories, je trace des lignes dans ce tracé vide en utilisant une boucle "pour" comme ceci:

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

Il y a 8 catégories ici, et donc il y a 8 lignes produites dans l'intrigue. Comme vous pouvez le constater, j'essaie d'échantillonner une couleur de la fonction rainbows () pour générer une couleur pour chaque ligne.

Cependant, lorsque l'intrigue est générée, je constate qu'il y a plusieurs lignes qui ont la même couleur. Par exemple, 3 de ces 8 lignes ont une couleur verte.

Comment faire pour que chacune de ces 8 lignes ait une couleur unique?

Aussi, comment puis-je refléter cette unicité dans la légende de l'intrigue? J'essayais de rechercher la fonction legend(), mais il n'était pas clair quel paramètre utiliser pour refléter cette couleur unique pour chaque catégorie?

Toute aide ou suggestion serait très appréciée.

59
user1418321

Si vos données sont en format largematplot est fait pour cela et est souvent oublié:

 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

Il y a aussi le bonus supplémentaire pour ceux qui ne sont pas familiers avec des choses comme ggplot que la plupart des paramètres de traçage tels que pch etc. sont les mêmes en utilisant matplot() comme plot()enter image description here

65
user1317221_G

Si vous souhaitez une solution ggplot2, vous pouvez le faire si vous pouvez mettre en forme vos données selon ce format (voir l'exemple ci-dessous).

# 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

46
Arun

Vous avez la bonne stratégie générale pour ce faire en utilisant des graphiques de base, mais comme il a été souligné, vous dites essentiellement à R de choisir une couleur aléatoire parmi un ensemble de 10 pour chaque ligne. Cela dit, il n’est pas surprenant que vous obteniez parfois deux lignes de la même couleur. Voici un exemple utilisant des graphiques de 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')
}

enter image description here

Notez l'utilisation de type = "n" pour supprimer tout tracé dans l'appel d'origine pour configurer la fenêtre, ainsi que l'indexation de cl à l'intérieur de la boucle for.

26
joran

Plusieurs lignes peuvent être tracées sur le même graphique à l’aide de la fonction 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()

SORTIE enter image description here

12
Shafiq

Utiliser les données factices @Arun :) voici une solution lattice:

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

enter image description here

8
agstudy

Je sais, c’est un vieux message à répondre, mais comme je suis tombé sur le même poste, quelqu'un d’autre pourrait aussi se tourner vers nous.

En ajoutant: couleur dans la fonction ggplot, je pouvais obtenir des lignes de couleurs différentes liées au groupe présent dans le tracé.

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

et

geom_line() 

Line Graph with Multiple colors

5
Sweta

En plus de @ (joran) réponse en utilisant la fonction base plot avec une boucle for, vous pouvez également utiliser la base plot avec 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')))
  • Ici, la fonction invisible sert simplement à empêcher lapply de générer une sortie de liste dans votre console (puisque tout ce que nous voulons, c'est la récursion fournie par la fonction, pas une liste).

enter image description here

Comme vous pouvez le constater, le résultat obtenu est identique à celui obtenu avec l’approche en boucle for.

Alors, pourquoi utiliser lapply?

Bien que lapply ait montré des performances plus rapides/meilleures que for dans R (par exemple, voir ici ; bien voir ici pour un exemple où il est non), dans ce cas, les performances sont à peu près les mêmes:

Monter le nombre de lignes à 50000 pour les deux approches lapply et for a pris mon système 46.3 et 46.55 secondes, respectivement.

  • Donc, bien que lapply soit juste un peu plus rapide, il était négligeable. Cette différence de vitesse peut être utile avec des graphiques plus grands/plus complexes, mais soyons honnêtes, 50000 lignes est probablement un très bon plafond ...

Donc, la réponse à "pourquoi lapply?": C'est simplement une approche alternative qui fonctionne tout aussi bien. :)

5

Voici un exemple de code contenant une légende si cela vous intéresse.

# First create an empty plot.
plot(1, type = 'n', xlim = c(xminp, xmaxp), ylim = c(0, 1), 
     xlab = "log transformed 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)
3
Elizabeth Crowell

Voici un autre moyen d'ajouter des lignes en utilisant plot():

Tout d'abord, utilisez la fonction par(new=T)

option:

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

Pour les colorer différemment, vous aurez besoin de col().

Pour éviter les descriptions d'axes superflues, utilisez xaxt="n" et yaxt="n" pour le deuxième tracé et les autres tracés.

2
boczniak767