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