强制ggplot2对两个图使用图例上的相同标签和颜色

时间:2018-11-05 17:40:45

标签: r ggplot2 legend

我正在尝试使用ggplot2创建多个图,我希望它为每种因子类型始终分配相同的颜色。

这里有一个玩具示例。

is_lvalue_reference<...>

我首先将类别转换为因子,以便始终分配相同的值,因为它在我做过的其他绘图中都起作用。

我想以两种方式根据类别分组的值创建两个密度图(或类似的图),一种使用“ from”列的类别,另一种使用“ to”列的类别,使用相同的方法传说。

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)

enter image description here

如您所见,由于它显示了一个“ a”因子,但它并不产生所需的图,但是在“ from”列中却不存在。

现在按“收件人”列进行分组。

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()

enter image description here

它按预期工作。

现在,我尝试再次生成没有标签参数的第一个情节。

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()

enter image description here

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

我该怎么办?

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

1 个答案:

答案 0 :(得分:1)

您可以在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()