R sec.axis(),每个方面具有不同的变换

R sec.axis(),每个方面具有不同的变换,r,ggplot2,R,Ggplot2,我想建立一个按区域分面的图,其中y轴是该区域的病例数,第二个y轴是每100k人口的病例数 由于每个地区都有不同的人口,因此每个地区的转型情况也会有所不同 我可以用sec.axis()来做吗 基本上是这样,但我想添加一个第二个y轴,显示每10万人中的病例数,考虑到安大略省的人口为1200万,魁北克省的人口为800万(所以将病例除以人口,然后乘以10万) 案例% 变更(日期报告=截止日期(日期报告)) ggplot(病例,不良事件(x=日期报告,y=平均病例数7))+ geom_线()+ 面_包裹(

我想建立一个按区域分面的图,其中y轴是该区域的病例数,第二个y轴是每100k人口的病例数

由于每个地区都有不同的人口,因此每个地区的转型情况也会有所不同

我可以用sec.axis()来做吗

基本上是这样,但我想添加一个第二个y轴,显示每10万人中的病例数,考虑到安大略省的人口为1200万,魁北克省的人口为800万(所以将病例除以人口,然后乘以10万)

案例%
变更(日期报告=截止日期(日期报告))
ggplot(病例,不良事件(x=日期报告,y=平均病例数7))+
geom_线()+
面_包裹(~province,scales=“free”)

不确定是否有一种方法可以使用简单的刻面来实现这一点。相反,我会选择使用
补丁

  • 按省划分数据
  • 为每个省画一幅图
  • 使用
    patchwork
  • 我下面的方法使用一个辅助函数进行绘图,并利用
    purr::pmap
    在各省进行循环。helper函数有三个参数,1。该省的数据为2。该省人口3。为了模拟刻面扭曲的行为,逻辑上需要指示是否应标记y轴

    <!-- language-all: lang-r -->
    
    
    library(ggplot2)
    library(dplyr)
    library(patchwork)
    
    cases <- tibble::tribble(
      ~province, ~date_report, ~avg_cases_last7,
      "Ontario", "2020-08-26",              111,
      "Quebec", "2020-08-26", 89.8571428571429,
      "Ontario", "2020-08-27", 116.857142857143,
      "Quebec", "2020-08-27", 93.4285714285714,
      "Ontario", "2020-08-28", 113.142857142857,
      "Quebec", "2020-08-28", 89.8571428571429,
      "Ontario", "2020-08-29", 118.285714285714,
      "Quebec", "2020-08-29", 90.4285714285714,
      "Ontario", "2020-08-30", 117.714285714286,
      "Quebec", "2020-08-30",               97,
      "Ontario", "2020-08-31", 117.571428571429,
      "Quebec", "2020-08-31", 107.285714285714,
      "Ontario", "2020-09-01", 124.571428571429,
      "Quebec", "2020-09-01", 115.857142857143,
      "Ontario", "2020-09-02", 126.714285714286,
      "Quebec", "2020-09-02", 114.428571428571,
      "Ontario", "2020-09-03", 128.428571428571,
      "Quebec", "2020-09-03", 125.285714285714,
      "Ontario", "2020-09-04", 130.142857142857,
      "Quebec", "2020-09-04", 141.857142857143,
      "Ontario", "2020-09-05", 136.285714285714,
      "Quebec", "2020-09-05", 151.428571428571
    ) %>%
      mutate(date_report = as.Date(date_report))
    
    cases_split <- cases %>% 
      split(.$province)
    
    make_plot <- function(d, pop, axis_label) {
      labs <- if (!axis_label) labs(y = NULL)
      name <- if (!axis_label) "cases per 100k"
      
      ggplot(d, aes(x = date_report, y = avg_cases_last7)) + 
        geom_line() +
        scale_y_continuous(sec.axis = sec_axis(trans = ~ . / pop * 1e6, name = name)) +
        facet_wrap(~province,  scales = "free") +
        labs
    }
    
    purrr::pmap(list(d = cases_split, pop = list(12 * 1e6, 8 * 1e6), axis_label = c(TRUE, FALSE)), make_plot) %>% 
      patchwork::wrap_plots() 
    
    
    图书馆(GG2)
    图书馆(dplyr)
    图书馆(拼凑)
    案例%
    变更(日期报告=截止日期(日期报告))
    个案(单位)
    拆分(.$省)
    绘制图

    下面是一个解决方案,它创建两个绘图,并使用
    gridExtra::grid.arrange
    对它们进行排列

    library(ggplot2)
    library(gridExtra)
    p1= ggplot() + 
      geom_line(data = cases[cases$province == 'Ontario', ], aes(x= date_report, y = avg_cases_last7)) +
      facet_wrap(~province,  scales = "free")+ 
      scale_y_continuous(sec.axis = sec_axis(
        trans =  ~ . / 12000000*100000))+
      theme(axis.title = element_blank(),
            plot.margin = margin(t = 0, r = 5, b = 0, l = 0))
    
    p2= ggplot() + 
      geom_line(data = cases[cases$province == 'Quebec', ], aes(x= date_report, y = avg_cases_last7)) +
      facet_wrap(~province)+ 
      scale_y_continuous(sec.axis = sec_axis(
        trans =  ~ . / 8000000*100000))+
      theme(axis.title = element_blank(),
            plot.margin = margin(t = 0, r = 0, b = 0, l = 5))
    
    p = grid.arrange(p1, p2, ncol=2,
                 left = 'avg_cases_last7', right = 'Number of cases per 100k ?', bottom = 'date_report')
    
    ggsave(p, filename = 'plot.png', device = 'png', width = 6.75, height = 3)
    

    你能分享你的一些数据吗?添加了快速示例谢谢回答!我几乎同时收到了两个好答案。我不确定礼节,我想我会接受第一个吗?@Zoltan,我同意你的看法!我认为公认的答案似乎更一般!
    library(ggplot2)
    library(gridExtra)
    p1= ggplot() + 
      geom_line(data = cases[cases$province == 'Ontario', ], aes(x= date_report, y = avg_cases_last7)) +
      facet_wrap(~province,  scales = "free")+ 
      scale_y_continuous(sec.axis = sec_axis(
        trans =  ~ . / 12000000*100000))+
      theme(axis.title = element_blank(),
            plot.margin = margin(t = 0, r = 5, b = 0, l = 0))
    
    p2= ggplot() + 
      geom_line(data = cases[cases$province == 'Quebec', ], aes(x= date_report, y = avg_cases_last7)) +
      facet_wrap(~province)+ 
      scale_y_continuous(sec.axis = sec_axis(
        trans =  ~ . / 8000000*100000))+
      theme(axis.title = element_blank(),
            plot.margin = margin(t = 0, r = 0, b = 0, l = 5))
    
    p = grid.arrange(p1, p2, ncol=2,
                 left = 'avg_cases_last7', right = 'Number of cases per 100k ?', bottom = 'date_report')
    
    ggsave(p, filename = 'plot.png', device = 'png', width = 6.75, height = 3)