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.
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()
.
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))
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')
}
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.
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()
Utiliser les données factices @Arun :) voici une solution lattice
:
xyplot(val~x,type=c('l','p'),groups= variable,data=df,auto.key=T)
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()
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')))
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).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.
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. :)
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)
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.