R ggplot-具有相同颜色变量的多行仅显示第一行的图例

时间:2019-01-16 05:57:48

标签: r ggplot2 legend

我的数据(dt1)如下:

dt1 <- structure(list(date = structure(c(NA, 17179, 17180, 17181, 17182, 
17183, 17178, 17179, 17180, 17181, 17182, 17183), class = "Date"), 
    f = c(0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L), y1 = c(68L, 
    43L, 99L, 53L, 12L, 20L, 29L, 49L, 68L, 15L, 71L, 88L), y2 = c(15L, 
    15L, 66L, 53L, 63L, 37L, 91L, 17L, 87L, 87L, 43L, 77L)), row.names = c(NA, 
-12L), class = "data.frame")

       date f y1 y2
1  12-01-17 0 68 15
2  13-01-17 0 43 15
3  14-01-17 0 99 66
4  15-01-17 0 53 53
5  16-01-17 0 12 63
6  17-01-17 0 20 37
7  12-01-17 1 29 91
8  13-01-17 1 49 17
9  14-01-17 1 68 87
10 15-01-17 1 15 87
11 16-01-17 1 71 43
12 17-01-17 1 88 77

我现在想绘制一个多折线图,在x轴上显示日期,在y上分别显示y1和y2,但用2条不同的线表示。但是我还有变量“ f”,我想将其用作两行的颜色变量。我编写以下代码:

ggplot(data = dt1) +
geom_line(aes(x = date, y = y1, color = factor(f))) +
geom_line(aes(x = date, y = y2, color = factor(f)))

但是除了4种颜色外,我还得到4条线的2种颜色,即2条线为蓝色和2条线为红色,并且在图例中我仅具有与y1相关的图例。我想为图例框中的所有4行和4项获得4种颜色。

3 个答案:

答案 0 :(得分:4)

通过将f变量与变量交叉可以得到4种颜色-如果值来自y1y2列:

dt1 %>%
  gather(key, value, y1:y2) %>%
  unite('f', f:key, sep = '_') %>%
  ggplot(aes(
    x = date,
    y = value,
    color = f
  )) +
  geom_line()

enter image description here

答案 1 :(得分:1)

您不应将两种颜色用于两组。而是使用两种颜色和两种线型:

MAIL_ENCRYPTION=NULL

enter image description here

答案 2 :(得分:0)

您将获得预期的行为-首先为颜色取决于每个行的因子(0,1)的y1值绘制线,然后为颜色取决于每个行的因子(0,1)的y2值绘制线行。

例如,将大小写简化为前两个记录:对给f值为零的y1和y2分配颜色有什么要求?您是否要将颜色0分配给一种颜色,将颜色1分配给另一种颜色(在这种情况下,您无需在每一行中都使用此信息),或者是否要使用某种颜色的线来替代颜色(因此这两条线都是前两行的颜色为0,那么如果一行的因子为1,则两行的颜色都为1)?

如果您想每行使用一种颜色,请在color参数中进行硬编码,而不要使用行因子

dt1 <- data.frame(x = c("01/01/19","01/02/19","01/03/19"), f = as.factor(c(1,1,0)), y1 = c(6,8,7), y2 = c(10,12,14))
dt1$x <- as.Date(dt1$x, "%m/%d/%y")

ggplot(data = dt1) +
  geom_line(aes(x = x, y = y2, color = "red"))  + 
               geom_line(aes(x = x, y = y1, color = "blue"))

如果您想在y1和y2上交替显示颜色,这就是使用点的样子(线条看起来比较棘手)

dt1 <- data.frame(x = c("01/01/19","01/02/19","01/03/19"), f = as.factor(c(1,1,0)), y1 = c(6,8,7), y2 = c(10,12,14))
dt1$x <- as.Date(dt1$x, "%m/%d/%y")

ggplot(data = dt1) +
  geom_point(aes(x = x, y = y2, color = factor(f)))  + 
  geom_point(aes(x = x, y = y1, color = factor(f)))