首页 > 解决方案 > 如何创建在 x 轴上考虑 2 个变量年和月并在 y 轴上考虑 2 个变量的条形图?

问题描述

我有一个名为“m”的数据框,有 4 列和大约 100 行。

如何创建一个条形图,其中我在 x 轴上获得正确的时间顺序,每年重复 1-12 个月?

标签: rggplot2plot

解决方案


OP 要求的更新(见评论):

  1. 我已经使用make_datefrom lubridatepackage 来改变一个新的 column date。此时间日期为上课日期 -> 日期设置为月初:

  2. 随着pivot_longer我们以正确的形状绘制数据来绘制我们的条形图。

  3. 然后我们使用scale_x_date每 4 个月显示一次。

library(lubridate)
library(tidyverse)
library(scales)
m1 <- m %>% 
  mutate(date = make_date(YEAR, MONTH)) %>% 
  pivot_longer(
    cols = c(AUTO, IMP),
    names_to = "names",
    values_to = "values"
  )
  
ggplot(m1, aes(x=date, y=values, fill=names)) +
  geom_bar(position='dodge', stat='identity') +
  scale_x_date(date_breaks = "4 months" , date_labels = "%b-%y")+
  theme_bw()

输出: 在此处输入图像描述

原始答案: 我们创建一个字符列Date。要成为日期,我们需要一天,因此我们将其保留为字符类。我们将sprintf()两列放在YEAR一起MONTH

library(ggplot2)
m$Date <- with(m, sprintf("%d-%02d", YEAR, MONTH))

ggplot(m, aes(fill=AUTO, y=IMP, x=Date)) +
  geom_bar(position='dodge', stat='identity')

数据:

m <- structure(list(YEAR = c(2009, 2009, 2009, 2009, 2009, 2009, 2009, 
2009, 2009, 2009, 2009, 2009, 2010, 2010, 2010, 2010, 2010, 2010, 
2010, 2010, 2010, 2010, 2010, 2010, 2011), MONTH = c(1, 2, 3, 
4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
11, 12, 1), AUTO = c(0, 0.003130344, 0.01565172, 0.338077161, 
0.01565172, 0, 0, 0.003130344, 0, 0, 0, 0, 0.012277821, 0.021486187, 
0.009208366, 0.009208366, 0, 0, 0, 0, 0, 0, 0, 0, 0), IMP = c(0, 
0, 0.037564129, 0.062606882, 0.006260688, 0, 0, 0, 0, 0, 0, 0, 
0, 0.006138911, 0, 0.003069455, 0, 0, 0, 0, 0, 0, 0, 0, 0)), class = c("spec_tbl_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -25L), spec = structure(list(
cols = list(YEAR = structure(list(), class = c("collector_double", 
"collector")), MONTH = structure(list(), class = c("collector_double", 
"collector")), AUTO = structure(list(), class = c("collector_double", 
"collector")), IMP = structure(list(), class = c("collector_double", 
"collector"))), default = structure(list(), class = c("collector_guess", 
"collector")), skip = 1L), class = "col_spec"))

在此处输入图像描述


推荐阅读