首页 > 解决方案 > 线图产生不按时间顺序对应的图

问题描述

我得到了按字母顺序以月份开头的线图。有人可以帮我按时间顺序吗?

test<- structure(list(Month = c("Jan", "Feb", "Mar", "Apr", "May", "Jun"
), a = c(11, 10, 9, 8, 4, 8)), row.names = c(NA, -6L), class = c("tbl_df", 
                                                                 "tbl", "data.frame"))

library(tidyverse)

ggplot(data=test, aes(x=Month, y=a, group=1)) +
  geom_line(color="red")+
  geom_point()

# keep getting months arranged alphabetically

# tried Month= month(decision_date, abbr=FALSE

test <- test %>% 
  mutate(Month = month(decision_date, abbr=FALSE))

标签: rggplot2

解决方案


第一个切割是分配Month为 a factor,我们可以控制顺序:

test$Month <- factor(test$Month, c("Jan", "Feb", "Mar", "Apr", "May", "Jun",
                                   "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))
# or more succinctly (thanks @JonSpring)
test$Month <- factor(test$Month, month.abb)

校正图

(使用month.abb作品,因为它们恰好是您在示例数据中显示的内容。)

进一步的技术可能是使用实际日期而不是任意字符串。意识到虽然它们是你眼中“明显”的月份缩写,但对于 R,它们只是字符串。我建议如果您的数据真的以日期为中心,那么您应该使用Date-class 对象而不是字符串来定义您的时间线。即使Date变量看起来像2019-07-15,您也可以通过选项相当轻松地控制它在轴上的显示ggplot方式(不同的问题,并且在 SO 上已多次被问及回答)。


这是一个转换为Date而不是将它们保留为字符串的示例:

# starting with your original data
test$Month <- as.Date(paste0("2019-", test$Month, "-01"),
                      format = "%Y-%b-%d")
test
# # A tibble: 6 x 2
#   Month          a
#   <date>     <dbl>
# 1 2019-01-01    11
# 2 2019-02-01    10
# 3 2019-03-01     9
# 4 2019-04-01     8
# 5 2019-05-01     4
# 6 2019-07-01     8

您的情节仍然按原样工作,因此ggplot2实际上默认在这里仅显示月份缩写(正是您想要的)。(我假设这里的年份和日期......如果你不关心并且分析/显示不依赖于年份,那么这很好。如果年份在其他地方很重要,你不应该只是逐字复制此代码。警告购买者:-)


推荐阅读