R中按因子着色图

Posted

技术标签:

【中文标题】R中按因子着色图【英文标题】:Colouring plot by factor in R 【发布时间】:2011-12-04 23:54:04 【问题描述】:

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

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

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

【问题讨论】:

也许library(ggplot2); qplot(Sepal.Length, Sepal.Width, data=iris, colour=Species) 会有所帮助 哎呀,回答的时候没看到你的评论。 没问题,我太懒了/急于正确回答 【参考方案1】:

和 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/

【讨论】:

如下所述,原始数据有重叠点,所以使用stat_sum很方便,例如:ggplot(iris,aes(Sepal.Length,Sepal.Width,colour=Species))+ stat_sum(alpha=0.5,aes(size=factor(..n..)))【参考方案2】:

plot 函数中的 col 参数自动将颜色分配给整数向量。如果您将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)])

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

【讨论】:

【参考方案3】:

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

    使用 ggplot2(通常更容易) 结合使用 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)
)

您的输出应如下所示:

使用 R 的内置绘图功能

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

首先,我们将创建一个colorRampPallete 函数。 colorRampPallete() 返回一个将生成颜色列表的新函数。在下面的 sn-p 中,调用 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
)

您的输出应如下所示:

很漂亮,对吧?

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

+1 表示lattice。当被问到这样的问题时,我常常过于自动 = ggplot。【参考方案6】:
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 中使用更好的图形。

【讨论】:

建议 ggplot2 用于“R 中更好的图形”是错误的。标准的 R 绘图函数具有更大的潜力。 您好,我想指出的是,这种为图例设置颜色的方法会混淆它们。最好在约翰的评论中使用下面的方法。调用“levels”而不是“unique”来从因子中获取可能的值。 您的回答对我有用,但是您如何使用 ggplot2 获得相同的结果? 使用此方法时要非常小心,因为使用此代码的颜色通常不是正确的种类。您确实需要首先为物种编号添加一列,然后根据感兴趣的变量对数据框进行排序,然后绘制并引用该物种编号的颜色。或者像其他人提到的那样使用levels(),如果它是一个因素的话。 有人可以提供一个示例,说明答案中的代码何时混合了图例的颜色,以便我更好地理解这个问题?我尝试创建一个但失败了。我真正想知道的是在这种情况下使用 levels() 如何帮助我们。我应该将我的请求作为一个单独的问题发布,参考这个问题吗?

以上是关于R中按因子着色图的主要内容,如果未能解决你的问题,请参考以下文章

R语言ggplot2可视化多因子分组条形图使用position_dodge2函数配置所有的条形宽度相同不管分组是否只有一个因子

R:ggplot 中的因子水平被视为连续数据集

R语言ggplot2可视化柱状图(条形图)可视化中保留没有用到的因子水平(占位保留)

很想弄清楚 R 中的条形图上哪个因子级别已映射到哪个填充颜色?

R语言可视化包ggplot2绘制排序条形图实战:按照分类因子排序按照数值排序

在 Python 中按 K 因子缩放图像的最简单算法