首页 > 解决方案 > R中ggplot中的图例

问题描述

我对 R 和 ggplot 很陌生,完全是自学的。我正在尝试重新创建出现在英国政府冠状病毒网站上的图表。

我似乎根本无法让 ggplot 创建一个传奇。我希望图例显示 3 件事:(灰色)最近 5 天(不完整)、(steelblue)案例数和(蓝线)案例(7 天平均值)。

我相信我可以使轴看起来不错,格式化日期等,我一直在努力做传奇。

感谢您的关注。

# Libraries
library(tidyverse)

#Data
England_Rates <- read.csv("https://api.coronavirus.data.gov.uk/v2/data?areaType=nation&areaCode=E92000001&metric=newCasesBySpecimenDate&format=csv")


England_Rates$AveragenewCasesBySpecimenDate <- rollapply(England_Rates$newCasesBySpecimenDate, 7, mean, align = "right", fill=NA)
England_Rates$data_colour <- "steelblue"
England_Rates$data_colour[1] <- NA
England_Rates$data_colour[2] <- "grey"
England_Rates$data_colour[3] <- "grey"
England_Rates$data_colour[4] <- "grey"
England_Rates$data_colour[5] <- "grey"
England_Rates$data_colour[6] <- "grey"

ggplot() +
  geom_col(aes(x = England_Rates$date, y = England_Rates$newCasesBySpecimenDate),colour=England_Rates$data_colour) +
  geom_line(aes(x = England_Rates$date, y = England_Rates$AveragenewCasesBySpecimenDate), size=1.2, colour="blue", group=1)

https://coronavirus.data.gov.uk/details/cases

工作代码

library(tidyverse)

#Data
England_Rates <- read.csv("https://api.coronavirus.data.gov.uk/v2/data?areaType=nation&areaCode=E92000001&metric=newCasesBySpecimenDate&format=csv")


England_Rates$AveragenewCasesBySpecimenDate <- rollapply(England_Rates$newCasesBySpecimenDate, 7, mean, align = "right", fill=NA)
England_Rates$data_colour <- "Number of cases"
England_Rates$data_colour[1] <- NA
England_Rates$data_colour[2] <- "Most recent 5 days (incomplete)"
England_Rates$data_colour[3] <- "Most recent 5 days (incomplete)"
England_Rates$data_colour[4] <- "Most recent 5 days (incomplete)"
England_Rates$data_colour[5] <- "Most recent 5 days (incomplete)"
England_Rates$data_colour[6] <- "Most recent 5 days (incomplete)"

data <- data.frame (Date = as.Date(England_Rates_3$date),
                    Cases = England_Rates$newCasesBySpecimenDate.x,
                    "Cases (7-day Average)" = England_Rates$AveragenewCasesBySpecimenDate,
                    BlueorGrey = England_Rates$data_type)

group.colors <- c("Number of cases" = "#5694ca", "Most recent 5 days (incomplete)"="dark grey","Cases 7 day (Average)"="dark blue" )
ggplot(data,
       aes(x=Date, y=Cases, fill=BlueorGrey))+
  theme(
    text = element_text(color = "black"),
    axis.text=element_text(colour="black"),
    panel.background = element_rect(fill = "white",
                                    colour = "white",
                                    size = 0.5, linetype = "solid"),
    panel.grid.major = element_line(size = 0.5, linetype = 'twodash',
                                    colour = "light grey"), 
    panel.grid.minor = element_line(size = 0.25, linetype = 'twodash',
                                    colour = "light grey"),
    legend.title = element_blank(),
    legend.position = "bottom",
    legend.box = "vertical",
    axis.title=element_blank())+
  geom_bar(stat = "identity", width=1) + 
  scale_fill_manual(values=group.colors) +
  geom_line(aes(y=Cases..7.day.Average., fill="Cases 7 day (Average)"), colour="dark blue", size=0.8)

标签: rggplot2

解决方案


您无需事先手动为绘图分配颜色,使用映射美学为您生成比例。您可以在比例级别指定调色板。在下面的示例中,我们只是将文本放在我们想要显示为图例标签的图层中。

# Libraries
library(tidyverse)
library(zoo)

#Data
England_Rates <- read.csv("https://api.coronavirus.data.gov.uk/v2/data?areaType=nation&areaCode=E92000001&metric=newCasesBySpecimenDate&format=csv")


England_Rates$AveragenewCasesBySpecimenDate <- rollapply(
  England_Rates$newCasesBySpecimenDate, 7, mean, align = "right", fill=NA
)
# as.Date() makes the axis nicer
# We declare the x-variable globally in the main ggplot call,
# so you don't need to repeat it in the geom-layers.
ggplot(England_Rates, aes(x = as.Date(date))) +
  geom_col(aes(y = newCasesBySpecimenDate)) +
  geom_line(aes(y = AveragenewCasesBySpecimenDate, 
                colour = "7 Day Rolling Average"), # Just fill in text or choose a column from data
            size=1.2, group=1) +
  scale_colour_manual(
    values = "blue" # Choose as many colours as you have legend items
  )
#> Warning: Removed 6 row(s) containing missing values (geom_path).

reprex 包于 2021-04-07 创建(v1.0.0)

类似的东西适用于geom_col(),但我想你想要那个的fill审美/比例。scale_colour/fill_*()可以在函数中调整图例标题和其他调整。


推荐阅读