r - 组织时间序列图的x轴比例
问题描述
在这里,我的数据如下所示:
# Data
df <- data.frame("Hospital" = c("Buge Hospital", "Buge Hospital", "Greta Hospital", "Greta Hospital",
"Makor Hospital", "Makor Hospital"),
"Period" = c("Jul-18","Aug-18", "Jul-19","Aug-19", "Jul-20","Aug-20"),
"Medical admissions" = c(12,56,0,40,5,56),
"Surgical admissions" = c(10,2,0,50,20,56),
"Inpatient admissions" = c(9,5,6,0,60,96))
现在这个数据有一个名为 period 的列,它是不同年份的月度数据,2018、2019 和 2020
如果我绘制这些数据,这就是它的样子
library(ggplot2
# Melt data into long format
df2 <- melt(data = df,
id.vars = c("Hospital","Period"),
measure.vars = names(df[3:5]))
# Stacked barplot
ggplot( df2, aes(x = Period, y = value, fill = variable, group = variable)) +
geom_bar(stat = "identity") +
theme(legend.position = "none") +
ggtitle(unique(df2$Hospital))+
scale_x_date(date_labels = %Y)+
labs(x = "Month", y = "Number of People", fill = "Type")
它绘图很好,但 x 轴没有按升序排列,我尝试使用scale_x_date函数,但绘图仍然相同。我想要的是 2018 年开始的几个月,然后是 2019 年和 2020 年的几个月。我的意思是 x 轴要根据像这样 Aug-18、Jul-18、Aug-19、Jul-这样的年份按升序排列19 日,8 月 20 日,7 月 20 日。
解决方案
要解决您的问题,您需要将 Period 转换为日期格式。
例如,您可以使用包中parse_date
的函数lubridate
:
library(lubridate)
library(tidyr)
library(dplyr)
df %>% mutate(Date = parse_date(as.character(Period), format = "%b-%y")) %>%
pivot_longer(cols = Medical.admissions:Inpatient.admissions, names_to = "Var", values_to = "Val")
# A tibble: 18 x 5
Hospital Period Date Var Val
<fct> <fct> <date> <chr> <dbl>
1 Buge Hospital Jul-18 2018-07-01 Medical.admissions 12
2 Buge Hospital Jul-18 2018-07-01 Surgical.admissions 10
3 Buge Hospital Jul-18 2018-07-01 Inpatient.admissions 9
4 Buge Hospital Aug-18 2018-08-01 Medical.admissions 56
5 Buge Hospital Aug-18 2018-08-01 Surgical.admissions 2
6 Buge Hospital Aug-18 2018-08-01 Inpatient.admissions 5
7 Greta Hospital Jul-19 2019-07-01 Medical.admissions 0
8 Greta Hospital Jul-19 2019-07-01 Surgical.admissions 0
9 Greta Hospital Jul-19 2019-07-01 Inpatient.admissions 6
10 Greta Hospital Aug-19 2019-08-01 Medical.admissions 40
11 Greta Hospital Aug-19 2019-08-01 Surgical.admissions 50
12 Greta Hospital Aug-19 2019-08-01 Inpatient.admissions 0
13 Makor Hospital Jul-20 2020-07-01 Medical.admissions 5
14 Makor Hospital Jul-20 2020-07-01 Surgical.admissions 20
15 Makor Hospital Jul-20 2020-07-01 Inpatient.admissions 60
16 Makor Hospital Aug-20 2020-08-01 Medical.admissions 56
17 Makor Hospital Aug-20 2020-08-01 Surgical.admissions 56
18 Makor Hospital Aug-20 2020-08-01 Inpatient.admissions 96
因此,您可以使用scale_x_date
在 x 轴上设置适当的标签选项:
library(lubridate)
library(tidyr)
library(dplyr)
library(ggplot2)
df %>% mutate(Date = parse_date(as.character(Period), format = "%b-%y")) %>%
pivot_longer(cols = Medical.admissions:Inpatient.admissions, names_to = "Var", values_to = "Val") %>%
ggplot(aes(x = Date, y = Val, fill= Var, group = Var))+
geom_col()+
scale_x_date(date_breaks = "month", date_labels = "%b %Y")+
labs(x = "Month", y = "Number of People", fill = "Type")+
theme(axis.text.x = element_text(angle = 45, hjust = 1))
它回答了你的问题吗?
编辑:使用`lubridate v1.7.8
在lubridate
1.7.8 版上,parse_date
不再存在。您必须按parse_date_time
以下方式替换它:
library(lubridate)
library(dplyr)
df %>% mutate(Date = ymd(parse_date_time2(as.character(Period), orders = "%b-%y"))) %>% ....
推荐阅读
- c++ - 如何检查字符串中的特殊字符?
- javascript - 在玩笑测试中使用 expect.assertions(x) 与使用 fail()
- google-maps - What is Google Maps Platform Transition Account
- asp.net-mvc - 将布尔列渲染为真/假
- c# - Send forget password to email Asp.net code error
- javascript - Mocha: how to assert a promise rejection?
- c# - Core.LargeFileUpload File Not Found 找不到文件夹
- selenium-webdriver - 我收到“无效的会话 ID”
- php - XMPP 从名册中解析名称
- json - 如何在MongoDB中查找与数组类型字段中的值匹配的文档