我想绘制属于群体的个人的一些数据。
library(dplyr)
library(ggplot2)
x <- rep(1:10, 10)
y <- c(1:10, 2:11, 3:12, 4:13, 5:14, 6:15, 7:16, 8:17, 9:18, 10:19)
z <- c(rep(1, 10), rep(2, 10), rep(3, 10), rep(4, 10), rep(5, 10), rep(6, 10), rep(7, 10), rep(8, 10), rep(9, 10), rep(10, 10)) %>%
as.factor()
z2 <- c(rep(1, 50), rep(2, 50))
tibble(x, y, z, z2) %>%
ggplot(aes(x = x,
y = y,
color = z)) +
geom_line()
简单的第一步是为 z 中的每个人分配不同的颜色。
然而,理想情况下,我还可以根据 z2 对个体进行分组,例如组 1 中的每个人都具有红色光谱中的单独颜色,组 2 中的每个人都具有蓝色光谱中的单独颜色(依此类推)。
有没有办法以编程方式执行此操作?
最佳答案
此解决方案只能根据每个组所需的不同颜色数量进行扩展,而不是根据您拥有的组数进行扩展(因此只有两个组):
首先我们提取 z
的唯一值的数量:
colornumbers <- sapply(split(df, df$z2), function(x) length(unique(x$z)))
> colornumbers
1 2
5 5
然后,我们从两个不同的调色板创建颜色样本向量(安装包 grDevices
和 colorRamps
):
mycolors <- as.vector(mapply(function(x, y){
x(y)
}, list(grDevices::heat.colors, colorRamps::blue2green), colornumbers))
> mycolors
[1] "#FF0000FF" "#FF5500FF" "#FFAA00FF" "#FFFF00FF" "#FFFF80FF" "#0000FF" "#0040BF" "#008080" "#00BF40" "#00FF00"
现在我们使用 scale_color_manual
进行绘图:
tibble(x, y, z, z2) %>%
ggplot(aes(x = x,
y = y,
color = z)) +
geom_line() +
scale_color_manual(breaks = z, values = mycolors)
该解决方案还要求这两个组按值排序,因此我不确定它在实际数据场景中的适用性如何。
关于r - 如何在ggplot中对颜色进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52310116/