R 如何绘制因子的每个级别

R 如何绘制因子的每个级别,r,ggplot2,R,Ggplot2,我试着做一个情节,在这个情节中,一个因素的每一个层次都有它自己的系列。虽然我是R的长期用户,但我并没有跟上一些最新的改进。例如,我还没有学会ggplot,它在一些相关的问题中起作用,但我还不能把我想做的事情翻译成ggplot。下面是一个简单的例子: #library(tidyverse) # uncomment if not loaded in_data <- read_csv("http://www.nfgarland.ca/National_Custom_Data.csv") in_

我试着做一个情节,在这个情节中,一个因素的每一个层次都有它自己的系列。虽然我是R的长期用户,但我并没有跟上一些最新的改进。例如,我还没有学会ggplot,它在一些相关的问题中起作用,但我还不能把我想做的事情翻译成ggplot。下面是一个简单的例子:

#library(tidyverse) # uncomment if not loaded

in_data <- read_csv("http://www.nfgarland.ca/National_Custom_Data.csv")
in_data <- in_data %>% 
  mutate(Tot = in_data$`NUM INFLUENZA DEATHS`+in_data$`NUM PNEUMONIA DEATHS`) %>% 
  arrange(SEASON) %>%
  mutate(SEASON = factor(SEASON,ordered=TRUE)) 

filter(in_data,SEASON == "2015-16")$Tot %>% plot((1:length(.)),
                                             ., 
                                             type = "l",
                                             col = "red",
                                             xlab ="Flu Season Week",
                                             ylab = "Deaths",
                                             ylim = c(2000,7500))
filter(in_data,SEASON == "2016-17")$Tot %>% lines((1:length(.)),., col="orange")
filter(in_data,SEASON == "2017-18")$Tot %>% lines((1:length(.)),. ,col="blue")
filter(in_data,SEASON == "2018-19")$Tot %>% lines((1:length(.)),. ,col="green")
filter(in_data,SEASON == "2019-20")$Tot %>% lines((1:length(.)),., ,col="black")
#库(tidyverse)#如果未加载,请取消注释
单位内数据%
安排(季节)%>%
突变(季节=因子(季节,有序=真))
过滤器(季内数据==“2015-16”)$Tot%>%图((1:长度(),
., 
type=“l”,
col=“红色”,
xlab=“流感季节周”,
ylab=“死亡”,
ylim=c(20007500))
过滤器(在U数据中,季节==“2016-17”)$Tot%>%行((1:长度(.),,col=“橙色”)
过滤器(在U数据中,季节==“2017-18”)$Tot%>%行((1:长度(.),,col=“蓝色”)
过滤器(在U数据中,季节==“2018-19”)$Tot%>%行((1:长度(.),,col=“绿色”)
过滤器(在U数据中,季节==“2019-20”)$Tot%>%行((1:长度(.),,col=“黑色”)
` 正如您所看到的,我已经学习了许多tidyverse概念,这段代码运行良好。但我认为,应该有一种方法可以在tidyverse中自动完成这项工作,而不必单独定义每一行(),我无法识别它。我知道如何处理调色板,所以颜色的变化是没有问题的。还要注意的是,虽然有52周的前几个季节的数据,但在这个文件中,今年流感季节只剩下24周了。

这样怎么样

library(ggplot2)
ggplot(in_data, aes(x=WEEK,y=Tot, color = SEASON)) + 
  geom_line() + 
  labs(x = "Flu Season Week", y = "Deaths") +
  ylim(2000,7500) + 
  scale_color_manual(values = c("red","goldenrod","blue","orange","green"))

编辑:针对OP关于想要打破2019-20年数据的评论,我们可以使用快速轴心来填补缺失的值

in_data %>% dplyr::select(SEASON,Tot,WEEK) %>%
  tidyr::pivot_wider(names_from = SEASON, values_from = Tot) %>%
  pivot_longer(cols = (-WEEK), names_to = "SEASON", values_to = "Tot") %>%
ggplot(aes(x=WEEK,y=Tot, color = SEASON)) + 
  geom_line() + 
  labs(x = "Flu Season Week", y = "Deaths") +
  ylim(2000,7500) + 
  scale_color_manual(values = c("red","goldenrod","blue","orange","green"))

您需要使用for循环,当然,与ggplot2不同,您还需要指定图例。以下是base R(过去的好日子)中的建议,您可以这样做:

library(readr)
library(dplyr)

COLS = c("red","goldenrod","blue","orange","green")
names(COLS) = levels(in_data$SEASON)

plot(NULL,xlim=range(in_data$WEEK),ylim=range(in_data$Tot),
xlab="time",ylab="Tot")
for(nu in levels(in_data$SEASON)){
lines(1:sum(in_data$SEASON == nu),
in_data$Tot[in_data$SEASON == nu],
col = COLS[nu])
}

legend("topright",fill=COLS,names(COLS))


如果您需要指定周数,因为正如您在评论中提到的,从第40周开始到明年。。这可能是一个多一点的代码(也许是痛苦)

谢谢……我想我真的需要坐下来学习ggplot了,毕竟这么多年了!不管怎样,离这里很近,也许我可以自己去。但有一个问题:流感季节的几周从一年的第40周到下一年的第39周。以这种方式绘制图表也很好。这个情节从第一周一直持续到第52周。这意味着2019-2020年生产线在第12周至第39周期间应无数据,而不是一条彩色直线。Thx。无可辩驳!这两个答案都是正确的。不再需要了。