按R中的因子着色图

时间:2011-10-11 04:02:51

标签: r colors plot r-factor

我正在制作两个变量的散点图,并希望通过因子变量为点着色。这是一些可重现的代码:

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

这一切都很好但我怎么知道什么因素被涂上了什么颜色?

6 个答案:

答案 0 :(得分:49)

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)

应该为你做。但我更喜欢ggplot2,并建议在R中获得更好的图形。

答案 1 :(得分:36)

命令palette会在col = somefactor时告诉您颜色及其顺序。它也可以用来设置颜色。

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

为了在图表中看到您可以使用图例。

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

你会注意到我只用3个数字指定了新颜色。这将像使用因素一样工作。我本可以使用最初用于为点着色的因子。这会让一切都在逻辑上流动......但我只想告诉你可以使用各种各样的东西。

你也可以具体说明颜色。首先尝试?rainbow,然后从那里开始。您可以指定自己的或让R为您做。只要你为每个方法使用相同的方法就可以了。

答案 2 :(得分:19)

像Maiasaura一样,我更喜欢ggplot2。透明参考手册是其中一个原因。 但是,这是完成它的一种快速方法。

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

并且引起有名人士说,情节相关的帖子没有完整没有情节,这里是结果:

enter image description here

以下是一些参考资料: qplot.R example, 请注意,这基本上使用了我使用的相同的钻石数据集,但之前裁剪数据以获得更好的性能。

http://ggplot2.org/book/ 手册:http://docs.ggplot2.org/current/

答案 3 :(得分:16)

我知道有两种方法可以按因子对绘图点进行着色,然后自动生成相应的图例。我将举两个例子:

  1. 使用ggplot2(通常更容易)
  2. 将R&#39}内置的绘图功能与colorRampPallete功能结合使用(比较棘手,但很多人更喜欢/需要R&#39的内置绘图功能)
  3. 对于这两个例子,我将使用ggplot2钻石数据集。我们将使用数字列diamond$caratdiamond$price以及因子/分类列diamond$color。如果安装了ggplot2,则可以使用以下代码加载数据集:

    library(ggplot2)
    data(diamonds)
    

    使用ggplot2和qplot

    这是一个班轮。这里的关键项是将要qplot的因子作为color参数给出。 qplot默认为您制作图例。

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

    您的输出应如下所示: qplot output colored by factor "diamond$color"

    使用R内置的绘图功能

    使用R的内置绘图功能来获取由因子和相关图例着色的绘图是一个分为4个步骤的过程,它比使用ggplot2更具技术性。

    首先,我们将创建一个colorRampPallete函数。 colorRampPallete()返回一个生成颜色列表的新函数。在下面的代码段中,调用color_pallet_function(5)将返回从红色到橙色到蓝色的5种颜色的列表:

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

    其次,我们需要制作一个颜色列表,每种钻石颜色只有一种颜色。这是我们将用于为各个绘图点指定颜色以及创建我们的图例的映射。

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

    第三,我们创造了我们的情节。这与您可能完成的任何其他绘图一样,除了我们引用我们作为col参数的颜色列表。只要我们总是使用相同的列表,我们在R脚本中的颜色和diamond$colors之间的映射就会保持一致。

    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]
    )
    

    第四,最后,我们添加了我们的图例,以便有人阅读我们的图表可以清楚地看到绘图点颜色和实际钻石颜色之间的映射。

    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
    )
    

    您的输出应如下所示: standard R plot output colored by factor "diamond$color"

    漂亮,对吧?

答案 4 :(得分:11)

lattice库是另一个不错的选择。在这里,我在右侧添加了一个图例,并因为其中一些重叠而抖动了这些点。

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

example plot

答案 5 :(得分:8)

col函数中的plot参数自动将颜色分配给整数向量。如果您将iris$Species转换为数字,请注意您有1,2和3的向量因此您可以将其应用为:

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

假设你需要红色,蓝色和绿色而不是默认颜色,那么你可以简单地调整它:

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

您可以看到如何进一步修改上面的代码以获得任何独特的颜色组合。