r - 强制 ggplot2 在两个绘图的图例上使用相同的标签和颜色
问题描述
我正在尝试使用 ggplot2 创建多个图,并且我希望它始终为每个因子类型分配相同的颜色。
这里有一个玩具示例。
mydata <- data.frame(from=rep(c("b","c"), each=15),
to=rep(c("a","b","c"), each=10),
value=c(rep(1:5,5:1),rep(1:5,1:5)) )
我首先将类别转换为因子,以便始终分配相同的值,并且因为它适用于我所做的其他图。
我想以两种方式从按类别分组的值创建两个密度图(或类似图),一种使用“从”列的类别,另一种使用“到”列的类别,使用相同的图例。
niv <- c("a", "b", "c")
colo <- c("black", "red", "blue")
mydata$from <- factor(mydata$from, levels=niv)
mydata$to <- factor(mydata$to, levels=niv)
现在我生成图。首先按“从”列分组。
ggplot(mydata) + stat_density(geom="line",size=0.8,
position = "identity", aes(x=value, color=from)) +
scale_colour_manual(name="Type",labels = niv,
values=colo) + theme_bw()
正如您所看到的,它不会产生所需的图,因为它显示了一个“a”因子,但它不存在于“from”列中。
现在按“到”列分组。
ggplot(mydata) + stat_density(geom="line",size=0.8,
position = "identity", aes(x=value, color=to)) +
scale_colour_manual(name="Type",labels = niv,
values=colo) + theme_bw()
它按预期工作。
现在我尝试再次生成没有标签参数的第一个图。
ggplot(mydata) + stat_density(geom="line",size=0.8,
position = "identity", aes(x=value, color=from)) +
scale_colour_manual(name="Type", values=colo) +
theme_bw()
现在它正确标记了类别,但颜色与第二个图不匹配。
我该怎么做?
真正的问题有更多的类别和许多价值。
解决方案
您可以使用命名向量 in显式scale_color_manual
映射Type
到颜色:
color_map <- c("a" = "black", "b" = "red", "c" = "blue")
scale_colour_manual(values=color_map)
来自help(scale_color_manual)
:
价值观
一组美学值来映射数据值。如果这是一个命名向量,则将根据名称匹配值。如果未命名,则值将按顺序(通常按字母顺序)与比例限制匹配。任何不匹配的数据值都将被赋予 na.value。
这是完整的代码,我相信它会产生你想要的输出:
library(tidyverse)
mydata <- data.frame(
from = rep(c("b", "c"), each = 15),
to = rep(c("a", "b", "c"), each = 10),
value = c(rep(1:5, 5:1), rep(1:5, 1:5))
)
niv <- c("a", "b", "c")
colo <- c("black", "red", "blue")
color_map <- set_names(colo, niv)
mydata$from <- factor(mydata$from, levels = niv)
mydata$to <- factor(mydata$to, levels = niv)
ggplot(mydata) + stat_density(
geom = "line", size = 0.8,
position = "identity", aes(x = value, color = from)
) +
scale_colour_manual(name = "Type", values = color_map) + theme_bw()
ggplot(mydata) + stat_density(
geom = "line", size = 0.8,
position = "identity", aes(x = value, color = to)
) +
scale_colour_manual(
name = "Type",
values = color_map
) + theme_bw()
推荐阅读
- javascript - 用什么代替推送?
- ios - 当文件名包含不规则字符时创建文档目录文件路径
- javascript - 将 JavaScript Map 值作为数组获取?
- amazon-web-services - 将 ACL 作为资源应用到部署存储桶
- javascript - 将两个数字相除的 JavaScript 函数
- youtube - Youtube 调试信息字段详细信息
- java - 如何在java中解析嵌套的JSON对象
- javascript - 在 React 中对同一数组进行过滤和映射
- mysql - sql order by not working with decimal(18,6)
- java - 在 Java 中将 HCURSOR 保存到 BufferedImage