首页 > 解决方案 > 强制 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()

在此处输入图像描述

现在它正确标记了类别,但颜色与第二个图不匹配。

我该怎么做?

真正的问题有更多的类别和许多价值。

标签: rggplot2legend

解决方案


您可以使用命名向量 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()


推荐阅读