我的数据(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种颜色。
答案 0 :(得分:4)
通过将f
变量与变量交叉可以得到4种颜色-如果值来自y1
或y2
列:
dt1 %>%
gather(key, value, y1:y2) %>%
unite('f', f:key, sep = '_') %>%
ggplot(aes(
x = date,
y = value,
color = f
)) +
geom_line()
答案 1 :(得分:1)
答案 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)))