R:ensuring 图例颜色与定义的颜色匹配

R:ensuring legend colors match the defined colors

我正在使用 R 编程语言。使用著名的 Iris 数据集,我创建了以下图:

require(MASS)
cols = c('red', 'green', 'blue')
parcoord(iris[ ,-5], col = cols[iris$Species])

从这里开始,我尝试添加一个图例:

legend("topright", c("setosa", "versicolor", "virginica"), lwd = 2, col = iris$Species, bty = "n")

如何确保图例颜色与图表上的颜色实际匹配? R 会自动执行此操作吗?

谢谢

这里,irisSpecies列是一个因子(试试运行宁class(iris$Species))。如果你然后 运行 levels(iris$Species),你会看到级别的顺序是 setosa versicolor virginica.

如果将此因子转换为整数值(尝试 as.integer(iris$Species)),您将看到 setosa = 1、versicolor = 2 和 virginica = 3. 当您将 cols[iris$Species] 作为参数传递给 parcoord() 时,您正在使用该因子作为索引,R 会自动将其转换为整数向量。因此,setosa 将映射到 cols 的第一个元素,即 'red',依此类推。

请看下面:

require(MASS)
cols = c('red', 'green', 'blue')
parcoord(iris[ ,-5], col = cols[iris$Species])
legend("topright", levels(iris$Species), lwd = 2, col = cols, inset = 0.05)

这将产生以下情节:

虽然基本 R 图形可能足以满足您的用例,但我强烈建议探索 ggplot2 包以获得更高级和可自定义的图形。

iris$Species 是一个具有 3 个(整数)级别和关联名称的因子:

require(MASS)
str(iris$Species)
#>  Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

因此,使用 cols[iris$Species] 根据因子水平分配颜色,setosa 是第一个(红色),依此类推。

您可以重新调整因子,这会影响颜色与物种的关联并更改颜色(setosa 为 2,因此为绿色),以证明此效果:

iris$Species <- relevel(iris$Species, "versicolor")
str(iris$Species)
#>  Factor w/ 3 levels "versicolor","setosa",..: 2 2 2 2 2 2 2 2 2 2 ...

图例仅显示 3 个名称和颜色,因此您可以使用因子水平和相关名称来确保它们匹配。由于我们在这里更改了顺序,因此我们得到了:

require(MASS)
cols = c('red', 'green', 'blue')
iris$Species <- relevel(iris$Species, "versicolor")
parcoord(iris[ ,-5], col = cols[iris$Species])
legend("top", levels(iris$Species), lwd = 2, col = cols, bty = "n")

reprex package (v0.3.0)

于 2021 年 1 月 22 日创建