R 如何在ggplot图表中自动生成图例?

R 如何在ggplot图表中自动生成图例?,r,ggplot2,forcats,R,Ggplot2,Forcats,考虑这个简单的例子 library(dplyr) library(forcats) library(ggplot2) mydata <- data_frame(cat1 = c(1,1,2,2), cat2 = c('a','b','a','b'), value = c(10,20,-10,-20), time = c(1,2,1,2)) mydata <- mydata %>% mutate(cat1 =

考虑这个简单的例子

library(dplyr)
library(forcats)
library(ggplot2)

mydata <- data_frame(cat1 = c(1,1,2,2),
           cat2 = c('a','b','a','b'),
           value = c(10,20,-10,-20),
           time = c(1,2,1,2))

mydata <- mydata %>% mutate(cat1 = factor(cat1),
                 cat2 = factor(cat2))

> mydata
# A tibble: 4 x 4
  cat1  cat2  value  time
  <fct> <fct> <dbl> <dbl>
1 1     a      10.0  1.00
2 1     b      20.0  2.00
3 2     a     -10.0  1.00
4 2     b     -20.0  2.00
显示:

因为我(自愿)在
scale\u color\u manual()
中犯了一个错误,所以标签是错误的。事实上,明亮的红点是
1-a
,而不是
1-b
(注意标签是如何简单地连接变量名的)。这个想法是,如果有更多的因素水平,猜测正确的顺序可能会很棘手

有没有一种方法可以使这种标记自动化(甚至更好:标记和着色)?可能使用猫的
?也许可以事先在数据帧中将标签创建为字符串


谢谢

如果cat1/cat2的系数级别数量不固定(但可能远大于2),我将尝试使用
hsv()
计算适当的颜色,而不是手动分配它们

颜色备忘表相当准确地总结了HSV颜色模型:

色调(h)本质上是你的彩虹色轮,饱和度(s)决定颜色的强度,值(v)决定颜色的暗度。每个参数都接受[0,1]范围内的值

下面是我将如何使其适应此用例:

mydata2 <- mydata %>%

  # use "-" instead of the default "." since we are using that for the labels anyway
  mutate(interacted.variable = interaction(cat1, cat2, sep = "-")) %>%

  # cat1: assign hue evenly across the whole wheel,
  # cat2: restrict both saturation & value to the [0.3, 1], as it can look too
  #       faint / dark otherwise
  mutate(colour = hsv(h = as.integer(cat1) / length(levels(cat1)),
                      s = 0.3 + 0.7 * as.integer(cat2) / length(levels(cat2)),
                      v = 0.3 + 0.7 * as.integer(cat2) / length(levels(cat2))))

# create the vector of colours for scale_colour_manual()
manual.colour <- mydata2 %>% select(interacted.variable, colour) %>% unique()
colour.vector <- manual.colour$colour
names(colour.vector) <- manual.colour$interacted.variable
rm(manual.colour)

> colour.vector
      1-a       1-b       2-a       2-b 
"#3AA6A6" "#00FFFF" "#A63A3A" "#FF0000" 

具有更多因子级别的图示(代码相同,除了在色标中添加了指定
guide\u图例(byrow=TRUE)

mydata3 <- data.frame(
  cat1 = factor(rep(1:3, times = 5)),
  cat2 = rep(LETTERS[1:5], each = 3),
  value = 1:15,
  time = 15:1
) %>%
  mutate(interacted.variable = interaction(cat1, cat2, sep = "-"),
         colour = hsv(h = as.integer(cat1) / length(levels(cat1)),
                      s = 0.3 + 0.7 * as.integer(cat2) / length(levels(cat2)),
                      v = 0.3 + 0.7 * as.integer(cat2) / length(levels(cat2))))

manual.colour <- mydata3 %>% arrange(cat1, cat2) %>%
  select(interacted.variable, colour) %>% unique()
colour.vector <- manual.colour$colour
names(colour.vector) <- manual.colour$interacted.variable
rm(manual.colour)

ggplot(mydata3,
       aes(x = time, y = value, colour = interacted.variable)) +
  geom_point(size = 15) +
  scale_colour_manual(name = "",
                      values = colour.vector,
                      breaks = names(colour.vector),
                      guide = guide_legend(byrow = TRUE)) +
  theme(legend.position = "bottom")
mydata3%
突变(interactive.variable=交互作用(cat1、cat2、sep=“-”,
颜色=hsv(h=整数(cat1)/长度(电平(cat1)),
s=0.3+0.7*作为整数(cat2)/长度(级别(cat2)),
v=0.3+0.7*作为整数(cat2)/长度(级别(cat2)))
手动.颜色%排列(cat1、cat2)%>%
选择(interactive.variable,color)%>%unique()

color.vector你到底想改变什么:标签,分配给因子级别的颜色,或者两者都改变?你在寻找什么样的图案---颜色基于cat1?嗨@Camille,理想情况下我想同时改变颜色和标签。但是如果这太难,标签在这里是优先考虑的,因为它们实际上表明了 interaction@Camille例如,如示例所示,
cat1
控制颜色,
cat2
控制hueI,但它还没有真正使用过,但是
munsell
包应该使这些计算更容易。它专门用于颜色操纵,适合
ggplot2
世界。@Camille,有趣的是ting.你有一个例子吗?Z.Lin这确实是一个改进你已经很好的答案的方法不是我自己的,但是
munsell
在CRAN和上有文档记录。还有一个可以与
colorspace
包一起使用的方法,它实际上可能更适合这个问题。@Camille如果你能提供一个有效的那就拿那个包举例吧。我敢肯定你的答案也会被提高
ggplot(mydata2,
       aes(x = time, y = value, colour = interacted.variable)) +
  geom_point(size = 15) +
  scale_colour_manual(name = "",
                      values = colour.vector,
                      breaks = names(colour.vector)) +
  theme(legend.position = "bottom")
mydata3 <- data.frame(
  cat1 = factor(rep(1:3, times = 5)),
  cat2 = rep(LETTERS[1:5], each = 3),
  value = 1:15,
  time = 15:1
) %>%
  mutate(interacted.variable = interaction(cat1, cat2, sep = "-"),
         colour = hsv(h = as.integer(cat1) / length(levels(cat1)),
                      s = 0.3 + 0.7 * as.integer(cat2) / length(levels(cat2)),
                      v = 0.3 + 0.7 * as.integer(cat2) / length(levels(cat2))))

manual.colour <- mydata3 %>% arrange(cat1, cat2) %>%
  select(interacted.variable, colour) %>% unique()
colour.vector <- manual.colour$colour
names(colour.vector) <- manual.colour$interacted.variable
rm(manual.colour)

ggplot(mydata3,
       aes(x = time, y = value, colour = interacted.variable)) +
  geom_point(size = 15) +
  scale_colour_manual(name = "",
                      values = colour.vector,
                      breaks = names(colour.vector),
                      guide = guide_legend(byrow = TRUE)) +
  theme(legend.position = "bottom")