我正在制作两个变量的散点图,并希望通过因子变量为点着色。这是一些可重现的代码:
data <- iris
plot(data$Sepal.Length, data$Sepal.Width, col=data$Species)
这一切都很好,但是我怎么知道什么因素被染成了什么颜色?
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 中获得更好的图形。
该命令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 为你做。只要您对每个使用相同的方法就可以了。
像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/
我知道有两种方法可以按因子为绘图点着色,然后自动生成相应的图例。我将举两个例子:
colorRampPallete
(更棘手,但许多人更喜欢/需要 R 的内置绘图工具)对于这两个示例,我将使用 ggplot2 diamonds 数据集。我们将使用数字列diamond$carat
和diamond$price
,以及因子/分类列diamond$color
。如果您安装了 ggplot2,则可以使用以下代码加载数据集:
library(ggplot2)
data(diamonds)
这是一个单线。这里的关键项目是给出qplot
你想要着色的因素作为color
参数。qplot
默认情况下会为您创建一个图例。
qplot(
x = carat,
y = price,
data = diamonds,
color = diamonds$color # color by factor color (I know, confusing)
)
使用 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
)
漂亮,对吧?
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)])
您可能会看到如何进一步修改上面的代码以获得任何独特的颜色组合。
图书馆lattice
是另一个不错的选择。在这里,我在右侧添加了一个图例并抖动了这些点,因为其中一些重叠。
xyplot(Sepal.Width ~ Sepal.Length, group=Species, data=iris,
auto.key=list(space="right"),
jitter.x=TRUE, jitter.y=TRUE)