使用计数和累积计数在 ggplot 中创建 2 个 y 轴
Creating 2 y axes in ggplot with count and cumulative count
这是一些虚拟数据
dummy <- data.frame(numbers = 1:5,
symptomdate = as.Date(c("2012-08-30", "2012-08-30", "2012-08-31", "2012-09-01", "2012-09-01")),
reporteddate = as.Date(c("2012-09-02", "2012-09-03", "2012-09-05", "2012-09-07", "2012-09-08")),
dateofdeath = as.Date(c("2012-09-10", NA, NA, NA, "2012-09-31")),
gender = c("Female", "Male", "Male","Female", "Male"),
position = c("Resident", "Staff", "Resident", "Staff", "Staff"),
outbreakdate = as.Date(c("2012-08-31","2012-08-31","2012-08-31","2012-08-31","2012-08-31")))
每个观察都是 'case'。我想创建一个直方图,在 y 轴上显示病例数,还有一个辅助 y 轴显示病例的累计数,但我不知道如何使用 'sec.axis' .我需要先向我的数据框添加累积计数吗?
我目前拥有的:
ggplot(dummy, aes(x= symptomdate, group = position, fill = position)) + stat_bin(colour = "black", binwidth = 0.5, alpha = 1, position = "identity") + theme_bw() +
xlab("Symptom date") + ylab("Number of cases") + scale_x_date(breaks= date_breaks("1 day"), labels = date_format("%b-%d")) + theme(axis.text.x = element_text(angle = 90, hjust = 1)) + theme(legend.position="top") + scale_fill_manual(values = my_colours)
我知道这一定很简单,但我看了无数帖子,还是想不通。提前致谢!
试试这个。使用您的虚拟数据,您可以为案例和累积计数创建变量。计算比例因子后,您可以重新整形为 long 并绘制具有所需结构的绘图。这里的代码,其中 tidyverse
函数已在 dummy
数据帧上使用:
library(tidyverse)
#Code
newdf <- dummy %>% group_by(symptomdate) %>%
summarise(Count=n()) %>% ungroup() %>%
mutate(Cum=cumsum(Count))
#Scaling factor
sf <- max(newdf$Count)
newdf$Cum <- newdf$Cum/sf
#plot
newdf %>%
pivot_longer(-symptomdate) %>%
ggplot(aes(x=symptomdate)) +
geom_bar( aes(y = value, fill = name, group = name),
stat="identity", position=position_dodge(),
color="black", alpha=.6) +
scale_fill_manual(values = c("blue", "red")) +
scale_y_continuous(name = "Cases",sec.axis = sec_axis(~.*sf, name="Cum Cases"))+
labs(fill='Variable')+
theme_bw()
输出:
这是一些虚拟数据
dummy <- data.frame(numbers = 1:5,
symptomdate = as.Date(c("2012-08-30", "2012-08-30", "2012-08-31", "2012-09-01", "2012-09-01")),
reporteddate = as.Date(c("2012-09-02", "2012-09-03", "2012-09-05", "2012-09-07", "2012-09-08")),
dateofdeath = as.Date(c("2012-09-10", NA, NA, NA, "2012-09-31")),
gender = c("Female", "Male", "Male","Female", "Male"),
position = c("Resident", "Staff", "Resident", "Staff", "Staff"),
outbreakdate = as.Date(c("2012-08-31","2012-08-31","2012-08-31","2012-08-31","2012-08-31")))
每个观察都是 'case'。我想创建一个直方图,在 y 轴上显示病例数,还有一个辅助 y 轴显示病例的累计数,但我不知道如何使用 'sec.axis' .我需要先向我的数据框添加累积计数吗?
我目前拥有的:
ggplot(dummy, aes(x= symptomdate, group = position, fill = position)) + stat_bin(colour = "black", binwidth = 0.5, alpha = 1, position = "identity") + theme_bw() +
xlab("Symptom date") + ylab("Number of cases") + scale_x_date(breaks= date_breaks("1 day"), labels = date_format("%b-%d")) + theme(axis.text.x = element_text(angle = 90, hjust = 1)) + theme(legend.position="top") + scale_fill_manual(values = my_colours)
我知道这一定很简单,但我看了无数帖子,还是想不通。提前致谢!
试试这个。使用您的虚拟数据,您可以为案例和累积计数创建变量。计算比例因子后,您可以重新整形为 long 并绘制具有所需结构的绘图。这里的代码,其中 tidyverse
函数已在 dummy
数据帧上使用:
library(tidyverse)
#Code
newdf <- dummy %>% group_by(symptomdate) %>%
summarise(Count=n()) %>% ungroup() %>%
mutate(Cum=cumsum(Count))
#Scaling factor
sf <- max(newdf$Count)
newdf$Cum <- newdf$Cum/sf
#plot
newdf %>%
pivot_longer(-symptomdate) %>%
ggplot(aes(x=symptomdate)) +
geom_bar( aes(y = value, fill = name, group = name),
stat="identity", position=position_dodge(),
color="black", alpha=.6) +
scale_fill_manual(values = c("blue", "red")) +
scale_y_continuous(name = "Cases",sec.axis = sec_axis(~.*sf, name="Cum Cases"))+
labs(fill='Variable')+
theme_bw()
输出: