【问题标题】:How to add legend to R plot based on shade color如何根据阴影颜色将图例添加到 R 图
【发布时间】:2014-12-05 03:36:15
【问题描述】:

如何创建一个自定义图例,指示星期日是红色的(在“星期一”一词旁边有一个红色框,星期二是蓝色的?以下是我的 MWE。它只需要制作图例的代码。

library(ggplot2)
library(scales)
set.seed(1)
data <- data.frame(Date = seq(as.Date('2000-01-01'), 
               len= 23, by="1 day"), 
               Value = sample(1:50, 23, replace=TRUE))
sunday <- data.frame(date = seq(as.Date('2000-01-01 12:00:00'), len = 4, by="7 days"))
monday <- data.frame(date = seq(as.Date('2000-01-02 12:00:00'), len = 4, by="7 days"))
ggplot() + geom_line(data = data, aes(x = Date, y = Value)) +
    geom_rect(data = sunday, aes(xmin = date-.5, xmax = date+.5, ymin = -Inf, ymax = Inf), alpha = 0.4, fill="red") +
    geom_rect(data = monday, aes(xmin = date-.5, xmax = date+.5, ymin = -Inf, ymax = Inf), alpha = 0.4, fill="blue") +
    scale_x_date(breaks = date_breaks("1 day"), labels = date_format("%d")) 

【问题讨论】:

  • 使用“传奇”设施并没有真正的意义。您需要构建一个反映这些矩形颜色的注释结构。
  • 我有点困惑。 2000-01-01 实际上是星期六。我在这里错过了什么吗?
  • 是的,我的情节在这方面是不正确的。我只是把它作为一个假例子放在一起,以说明真正的问题是什么 - 如何获得图例(或注释结构可能也可以)。

标签: r plot ggplot2 legend


【解决方案1】:

鉴于上面的 cmets,我这里有周六和周日。我组合了两个数据框并创建了一个包含日期(即星期六和星期日)的列。我在geom_rect 中将此列用于fill。这样就可以看到图例了。

library(ggplot2)
library(scale)
library(dplyr)

set.seed(1)
data <- data.frame(Date = seq(as.Date('2000-01-01'), 
           len= 23, by="1 day"), 
           Value = sample(1:50, 23, replace=TRUE))

saturday <- data.frame(date = seq(as.Date('2000-01-01 12:00:00'), len = 4, by="7 days"))
sunday <- data.frame(date = seq(as.Date('2000-01-02 12:00:00'), len = 4, by="7 days"))

# Combine Saturday and Sunday data. If you use lubridate, there will be better way of
# doing this kind. But, for this demonstration, I chose this way.

combined <- mutate(rbind_list(saturday, sunday),
                   day = rep(c("Saturday", "Sunday"), each = 4))

ggplot() + geom_line(data = data, aes(x = Date, y = Value)) +
geom_rect(data = combined, aes(xmin = date-.5, xmax = date+.5,
          ymin = -Inf, ymax = Inf, fill = day), alpha = 0.4) +
scale_fill_manual(values = c("red", "blue")) +
scale_x_date(breaks = date_breaks("1 day"), labels = date_format("%d")) 

【讨论】:

  • 像魅力一样工作。非常感谢。
  • @bill999 很高兴,伙计。 :)
猜你喜欢
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多