r - ggplot中日期X轴标签的精细控制
问题描述
我有一个 R 脚本,它可以下载 covid 测试数据并进行一些操作,以得出在选定州测试的人口百分比和阳性测试率的每周总数,按周汇总。以下 R 脚本使用大 dput 代替下载和操作数据以实现可重复性
stateWeekly <- structure(list(Date = structure(c(1586044800, 1586649600, 1587254400,
1587859200, 1588464000, 1589068800, 1589673600, 1586044800, 1586649600,
1587254400, 1587859200, 1588464000, 1589068800, 1589673600, 1586044800,
1586649600, 1587254400, 1587859200, 1588464000, 1589068800, 1589673600,
1586044800, 1586649600, 1587254400, 1587859200, 1588464000, 1589068800,
1589673600, 1586044800, 1586649600, 1587254400, 1587859200, 1588464000,
1589068800, 1589673600, 1586044800, 1586649600, 1587254400, 1587859200,
1588464000, 1589068800, 1589673600, 1586044800, 1586649600, 1587254400,
1587859200, 1588464000, 1589068800, 1589673600, 1586044800, 1586649600,
1587254400, 1587859200, 1588464000, 1589068800, 1589673600, 1586044800,
1586649600, 1587254400, 1587859200, 1588464000, 1589068800, 1589673600
), class = c("POSIXct", "POSIXt"), tzone = "UTC"), positiveIncrease = c(306L,
631L, 624L, 862L, 1072L, 1046L, 1079L, 2096L, 1675L, 1762L, 2597L,
3510L, 1808L, 2403L, 7730L, 8356L, 8539L, 11831L, 11452L, 13064L,
12159L, 3996L, 5805L, 5849L, 5100L, 5201L, 4839L, 4260L, 823L,
718L, 629L, 654L, 719L, 617L, 721L, 886L, 698L, 766L, 1054L,
1052L, 1076L, 987L, 2390L, 2561L, 4998L, 4361L, 3951L, 4167L,
3842L, 7905L, 7204L, 6641L, 5532L, 4550L, 4518L, 4992L, 7546L,
12979L, 14439L, 15118L, 13149L, 9706L, 8217L), totalTestResultsIncrease = c(5822L,
11864L, 7940L, 17103L, 21209L, 22109L, 31531L, 24726L, 25377L,
26421L, 51123L, 56386L, 57262L, 63411L, 90276L, 73795L, 90572L,
245184L, 189667L, 239913L, 279579L, 15268L, 26621L, 25480L, 43290L,
51873L, 68451L, 107628L, 1019L, 20107L, 12805L, 17579L, 10632L,
32192L, 27504L, 16899L, 13342L, 19321L, 32147L, 26400L, 24408L,
24242L, 23091L, 19487L, 24056L, 29087L, 33780L, 54696L, 59600L,
70088L, 69349L, 73326L, 88534L, 83576L, 110759L, 112844L, 32877L,
44877L, 52271L, 66985L, 78546L, 73743L, 72437L), posRate = c(5.25592579869461,
5.3186109238031, 7.85894206549118, 5.04005145296147, 5.05445801310764,
4.73110497987245, 3.42202911420507, 8.47690689961983, 6.60046498798124,
6.66893758752507, 5.07990532636974, 6.22494945553861, 3.15741678600119,
3.78956332497516, 8.56263015640923, 11.3232603834948, 9.42785849931546,
4.82535565126599, 6.03795072416393, 5.44530725721407, 4.34903909091885,
26.1723866911187, 21.8060929341497, 22.9552590266876, 11.7810117810118,
10.0264106567964, 7.0692904413376, 3.95807782361467, 80.765456329735,
3.5708957079624, 4.91214369386958, 3.72034814267023, 6.76260346124906,
1.91662524850895, 2.62143688190809, 5.24291378188058, 5.23159946035077,
3.96459810568811, 3.27868852459016, 3.98484848484848, 4.40839069157653,
4.07144625030938, 10.3503529513663, 13.1420947298199, 20.7765214499501,
14.9929521779489, 11.696269982238, 7.61847301448003, 6.44630872483221,
11.2786782330784, 10.3880373184905, 9.05681477238633, 6.24844692434545,
5.44414664496985, 4.07912675267924, 4.42380631668498, 22.9522158347781,
28.9212737036789, 27.6233475540931, 22.5692319175935, 16.740508746467,
13.1619272337713, 11.3436503444372), dailyTest = c(0.138828678924223,
0.282903374571794, 0.189333512651723, 0.407830109179146, 0.505739857661259,
0.527200835165862, 0.751873424108499, 0.181032142393795, 0.185798458202998,
0.193442135168909, 0.374298560850844, 0.412831771455816, 0.419245431438707,
0.464265517323178, 0.114238067546845, 0.0933824958418563, 0.114612635183801,
0.310263484795578, 0.240010540535773, 0.303593396909103, 0.353787991123658,
0.0719006862588031, 0.125364695369112, 0.11999145178637, 0.203863027779905,
0.244282440287064, 0.32235223179862, 0.506846152781141, 0.0128760104635591,
0.254070600972309, 0.161803055923331, 0.222126975406188, 0.134345184738529,
0.406775788854657, 0.347538559165584, 0.263556166362753, 0.208081328576357,
0.30132958697525, 0.501363399021447, 0.411733403868672, 0.380666247031309,
0.378077317294862, 0.0987715050773798, 0.0833554336946386, 0.102899282237298,
0.124419330829576, 0.144493588043562, 0.233961553926307, 0.254938361379405,
0.163164303576303, 0.161443917485348, 0.170702341685253, 0.206106444082074,
0.194564259726246, 0.257846066370959, 0.262699929699297, 0.238498263983345,
0.325549368640101, 0.379187357626105, 0.48592652045273, 0.569793005530792,
0.534950800891926, 0.525476739001782), state = c("NM 3.28%",
"NM 3.28%", "NM 3.28%", "NM 3.28%", "NM 3.28%", "NM 3.28%", "NM 3.28%",
"TN 2.53%", "TN 2.53%", "TN 2.53%", "TN 2.53%", "TN 2.53%", "TN 2.53%",
"TN 2.53%", "CA 1.69%", "CA 1.69%", "CA 1.69%", "CA 1.69%", "CA 1.69%",
"CA 1.69%", "CA 1.69%", "GA 1.78%", "GA 1.78%", "GA 1.78%", "GA 1.78%",
"GA 1.78%", "GA 1.78%", "GA 1.78%", "OK 1.76%", "OK 1.76%", "OK 1.76%",
"OK 1.76%", "OK 1.76%", "OK 1.76%", "OK 1.76%", "UT 2.71%", "UT 2.71%",
"UT 2.71%", "UT 2.71%", "UT 2.71%", "UT 2.71%", "UT 2.71%", "OH 1.19%",
"OH 1.19%", "OH 1.19%", "OH 1.19%", "OH 1.19%", "OH 1.19%", "OH 1.19%",
"FL 1.67%", "FL 1.67%", "FL 1.67%", "FL 1.67%", "FL 1.67%", "FL 1.67%",
"FL 1.67%", "MA 3.46%", "MA 3.46%", "MA 3.46%", "MA 3.46%", "MA 3.46%",
"MA 3.46%", "MA 3.46%")), row.names = c(NA, -63L), class = "data.frame")
g <- stateWeekly %>% ggplot(aes(x = Date)) +
geom_col(aes(y=100*dailyTest), size=0.75, color="darkblue", fill="white") +
geom_line(aes(y=posRate), size = 0.75, color="red") +
scale_y_continuous(name = "Test Positivity Rate",
sec.axis = sec_axis(~./100, name="Percent of Pop Tested")) +
labs(x = "Week Ending",
title = "COVID-19 Testing",
subtitle = paste("Data as of", format(max(stateWeekly$Date), "%A, %B %e, %y")),
caption = "HQ AFMC/A9A \n Data: The COVID Tracking Project (https://covidtracking.com)") +
theme(plot.title = element_text(size = rel(1), face = "bold"),
plot.subtitle = element_text(size = rel(0.7)),
plot.caption = element_text(size = rel(1)),
axis.text.y = element_text(color='red'),
axis.title.y = element_text(color="red"),
axis.text.y.right = element_text(color="blue"),
axis.title.y.right = element_text(color="blue")) +
coord_cartesian(ylim=c(0,75)) +
facet_wrap(~ state)
print(g)
生成此图表
希望很明显,线图是测试阳性率,而列是测试人口的百分比。
如何将 X 轴上的日期与相应列的中心对齐?你会注意到现在它们看起来有些不规则。
解决方案
多好的情节啊!这是一个解决方案。1)as.Date()
用于告诉 R 该列包含日期。2)使用该scale_x_date()
功能微调x轴。3)调整x轴标签axis.text.x = element_text(angle = 45,hjust = 1))
以避免重叠。
代码:
stateWeekly %>% ggplot(aes(x = as.Date(Date))) +
geom_col(aes(y=100*dailyTest), size=0.75, color="darkblue", fill="white") +
geom_line(aes(y=posRate), size = 0.75, color="red") +
scale_y_continuous(name = "Test Positivity Rate",
sec.axis = sec_axis(~./100, name="Percent of Pop Tested")) +
scale_x_date(date_breaks = '1 week') +
labs(x = "Week Ending",
title = "COVID-19 Testing",
subtitle = paste("Data as of", format(max(stateWeekly$Date), "%A, %B %e, %y")),
caption = "HQ AFMC/A9A \n Data: The COVID Tracking Project (https://covidtracking.com)") +
theme(plot.title = element_text(size = rel(1), face = "bold"),
plot.subtitle = element_text(size = rel(0.7)),
plot.caption = element_text(size = rel(1)),
axis.text.y = element_text(color='red'),
axis.title.y = element_text(color="red"),
axis.text.y.right = element_text(color="blue"),
axis.title.y.right = element_text(color="blue"),
axis.text.x = element_text(angle = 45,hjust = 1)) +
coord_cartesian(ylim=c(0,75)) +
facet_wrap(~ state)
推荐阅读
- c++ - 调用 'unordered_set< 向量的隐式删除的默认构造函数
>' - jquery - 过滤表的总和
- node.js - 如何在 NodeJS SDK 中使用 transloadit addStream() 函数?
- node.js - mongoDB express-session中的所有活动会话
- php - PHP Web套接字未在SSL中连接
- java - 如何从 android Java 的改造中访问 arralist 响应的子数组列表?
- xcode - 如何调试 SwiftUI AttributeGraph 循环警告?
- php - 我想使用 PHP 和 mysql 禁用 html 日期选择器(输入类型 =“日期”)的某些未来日期
- javascript - 在导出的 pdf 中包含作为 html 或图像的 highcharts
- docker - 对 gRPC 架构的担忧(gRPC、nginx、docker)