Colorant par facteur en R

je fais un scatter plot de deux variables et je voudrais colorer les points par une variable de facteur. Voici du code reproductible:

data <- iris
plot(data$Sepal.Length, data$Sepal.Width, col=data$Species)

tout cela est très bien, mais comment savoir quel facteur a été coloré, quelle couleur??

18
demandé sur tonytonov 2011-10-11 08:02:50

6 réponses

data<-iris
plot(data$Sepal.Length, data$Sepal.Width, col=data$Species)
legend(7,4.3,unique(data$Species),col=1:length(data$Species),pch=1)

le faire pour vous. Mais je préfère ggplot2 et suggère que, pour de meilleurs graphismes dans R.

39
répondu Maiasaura 2011-10-11 05:05:18

La commande palette vous indique les couleurs et leur ordre lorsque col = somefactor. Il peut également être utilisé pour définir les couleurs.

palette()
[1] "black"   "red"     "green3"  "blue"    "cyan"    "magenta" "yellow"  "gray"   

afin de voir que dans votre graphique, vous pouvez utiliser une légende.

legend('topright', legend = levels(iris$Species), col = 1:3, cex = 0.8, pch = 1)

vous remarquerez que je n'ai spécifié les nouvelles couleurs qu'avec 3 numéros. Cela fonctionne comme utiliser un facteur. J'aurais pu aussi utiliser le facteur utilisé à l'origine pour colorer les points. Cela ferait logiquement couler tout ensemble... mais je viens de je voulais vous le montrer peut utiliser une variété de choses.

vous pouvez aussi être précis sur les couleurs. Essayez ?rainbow pour commencer et aller de là. Vous pouvez spécifier le vôtre ou le faire à votre place. Tant que vous utilisez la même méthode pour chacun, vous êtes OK.

32
répondu John 2011-10-11 14:20:01
ggplot2. La transparence manuel de référence est l'une des raisons. Cependant, c'est un moyen rapide de le faire.

require(ggplot2)
data(diamonds)
qplot(carat, price, data = diamonds, colour = color)
# example taken from Hadley's ggplot2 book

Et provoquer quelqu'un de célèbre a dit, l'intrigue related posts ne sont pas complètes sans la parcelle, voici le résultat:

enter image description here

voici quelques références: qplot.R exemple, remarque fondamentalement, cela utilise le même ensemble de données diamantées que j'utilise, mais les cultures de données avant d'obtenir une meilleure performance.

http://ggplot2.org/book/ le manuel: http://docs.ggplot2.org/current/

18
répondu Matt Bannert 2016-05-26 16:24:29

lattice bibliothèque est une autre bonne option. Ici j'ai ajouté une légende sur le côté droit et vacillant les points parce que certains d'entre eux se chevauchent.

xyplot(Sepal.Width ~ Sepal.Length, group=Species, data=iris, 
       auto.key=list(space="right"), 
       jitter.x=TRUE, jitter.y=TRUE)

example plot

10
répondu Aaron 2011-10-11 12:54:29

il y a deux façons que je connais pour marquer des points par facteur et puis avoir aussi une légende correspondante générée automatiquement. Je vais donner des exemples des deux:

  1. à l'Aide de ggplot2 (en général plus facile)
  2. en utilisant la fonctionnalité de pointage intégrée de R en combinaison avec le colorRampPallete fonction (délicat, mais beaucoup de gens préfèrent/besoin de R intégré dans le traçage des installations)

pour les deux exemples, j'utiliserai l'ensemble de données de diamants ggplot2. Nous allons utiliser les colonnes numériques diamond$carat et diamond$price, et le facteur/catégorique de la colonne diamond$color. Vous pouvez charger l'ensemble de données avec le code suivant si vous avez ggplot2 installé:

library(ggplot2)
data(diamonds)

en utilisant ggplot2 et qplot

C'est une doublure. Point clé ici est de donner qplot le facteur que vous voulez colorer par le color argument. qplot vous fera une légende par défaut.

qplot(
  x = carat,
  y = price,
  data = diamonds,
  color = diamonds$color # color by factor color (I know, confusing)
)

votre sortie devrait ressembler à ce: qplot output colored by factor "diamond$color"

utilisation de la fonctionnalité intégrée de la parcelle R

utiliser la fonctionnalité intégrée de la parcelle R pour obtenir une parcelle colorée par un facteur et une légende associée est un processus en 4 étapes, et c'est un peu plus technique que d'utiliser ggplot2.

tout d'Abord, nous allons faire un colorRampPallete fonction. colorRampPallete() renvoie une nouvelle fonction qui générera une liste de couleurs. Dans l'extrait ci-dessous, l'appel de color_pallet_function(5) retourne une liste de 5 couleurs sur un échelle de rouge à orange à bleu:

color_pallete_function <- colorRampPalette(
  colors = c("red", "orange", "blue"),
  space = "Lab" # Option used when colors do not represent a quantitative scale
  )

Deuxièmement, nous avons besoin de faire une liste de couleurs, avec exactement une couleur par couleur de diamant. C'est le mapping que nous utiliserons à la fois pour attribuer des couleurs à des points de tracé individuels, et pour créer notre légende.

num_colors <- nlevels(diamonds$color)
diamond_color_colors <- color_pallet_function(num_colors)

Troisièmement, nous créons notre complot. Ceci est fait comme n'importe quel autre complot que vous avez probablement fait, sauf que nous nous référons à la liste des couleurs que nous avons fait comme notre col argument. Aussi longtemps que nous utilisons cette même Liste, notre cartographie entre les couleurs et diamond$colors sera cohérent dans le script R.

plot(
  x = diamonds$carat,
  y = diamonds$price,
  xlab = "Carat",
  ylab = "Price",
  pch = 20, # solid dots increase the readability of this data plot
  col = diamond_color_colors[diamonds$color]
)

Quatrièmement et enfin, nous ajoutons notre légende pour que quelqu'un lisant notre graphique puisse voir clairement la correspondance entre les couleurs des points de l'intrigue et les couleurs réelles du diamant.

legend(
  x ="topleft",
  legend = paste("Color", levels(diamonds$color)), # for readability of legend
  col = diamond_color_colors,
  pch = 19, # same as pch=20, just smaller
  cex = .7 # scale the legend to look attractively sized
)

votre sortie devrait ressembler à ceci: standard R plot output colored by factor "diamond$color"

chic, Non?

9
répondu Toby 2015-10-15 22:11:11

col argument plot fonction attribuer automatiquement les couleurs à un vecteur d'entiers. Si vous convertissez iris$Species numérique, avis vous avez un vecteur de 1, 2 et 3, de Sorte que vous pouvez appliquer ce que:

plot(iris$Sepal.Length, iris$Sepal.Width, col=as.numeric(iris$Species))

supposons que vous voulez le rouge, le bleu et le vert au lieu des couleurs par défaut, alors vous pouvez simplement l'ajuster:

plot(iris$Sepal.Length, iris$Sepal.Width, col=c('red', 'blue', 'green')[as.numeric(iris$Species)])

Vous pouvez probablement voir comment modifier le code ci-dessus pour obtenir toute combinaison unique de couleurs.

7
répondu justin1.618 2016-02-19 17:23:12