使用计数和累积计数在 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()

输出: