42

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

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

这一切都很好,但是我怎么知道什么因素被染成了什么颜色?

4

6 回答 6

56
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 中获得更好的图形。

于 2011-10-11T05:05:18.703 回答
42

该命令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 为你做。只要您对每个使用相同的方法就可以了。

于 2011-10-11T05:11:27.330 回答
21

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

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

因为有人说,没有剧情,剧情相关的帖子是不完整的,结果如下:

在此处输入图像描述

这里有几个参考: qplot.R example,注意基本上这使用了我使用的相同的菱形数据集,但之前裁剪了数据以获得更好的性能。

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

于 2011-10-11T07:49:05.380 回答
19

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

  1. 使用 ggplot2(通常更容易)
  2. 将 R 的内置绘图功能与函数结合使用colorRampPallete(更棘手,但许多人更喜欢/需要 R 的内置绘图工具)

对于这两个示例,我将使用 ggplot2 diamonds 数据集。我们将使用数字列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 输出按因子着色

使用 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论点。只要我们始终使用相同的列表,我们的颜色之间的映射diamond$colors就会在我们的 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]
)

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

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
)

您的输出应如下所示: 按因子着色的标准 R 绘图输出

漂亮,对吧?

于 2015-10-15T19:27:16.717 回答
16

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

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

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

于 2016-01-01T16:45:13.647 回答
12

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

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

示例图

于 2011-10-11T12:54:29.423 回答