首页 > 解决方案 > ggplot:一张图上有两条线,日期中断(y轴)

问题描述

好的,这是一个后续问题: 如何将 x 轴上的日期格式化为 R 中的月份和年份

我知道在一张图上绘制两条线有很多问题,但我似乎无法用我的数据制作一条线。我有 11 年的 5 月至 11 月的数据。我正在尝试在同一图表上绘制两个区域的数据,同时仍显示每年几个月的中断/差距。

我可以让它绘制两条线,但这看起来像是我拥有所有 12 个月的数据并且没有显示差距。

使用此代码:


ggplot(Rainmean, aes(x= Date , y= mean_rain, group = Zone, color = Zone))+
  geom_line()+
  geom_point()+
  labs(title = "Average Monthly Rainfall", y = "Rainfall (in)", x = "Date") +
  theme_bw() + 
  theme(panel.border = element_blank(), panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"),
        axis.text.x = element_text(angle = 0)) +
  scale_x_date(date_breaks = '1 year', date_labels = "%Y") 

我明白了:

在此处输入图像描述

使用相同的代码并添加group= year(Date)以尝试使用以下代码分解 y 轴:

ggplot(Rainmean, aes(x= Date , y= mean_rain, group = year(Date), group = Zone, color = Zone))+
  geom_line()+
  geom_point()+
  labs(title = "Average Monthly Rainfall", y = "Rainfall (in)", x = "Date") +
  theme_bw() + 
  theme(panel.border = element_blank(), panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"),
        axis.text.x = element_text(angle = 0)) +
  scale_x_date(date_breaks = '1 year', date_labels = "%Y") 

这个更接近一点,但看起来它只是合并我的区域的线条,而不是显示两条不同的线条。

在此处输入图像描述

因此,为了清楚起见,我试图将这两个图合并成一个带有两条线的图形。一个用于 B 区,一个用于 D 区。

在此处输入图像描述

在此处输入图像描述

我有这个数据:

structure(list(Date = structure(c(14000, 14000, 14031, 14031, 
14061, 14061, 14092, 14092, 14123, 14123, 14153, 14153, 14184, 
14184, 14365, 14365, 14396, 14396, 14426, 14426, 14457, 14457, 
14488, 14488, 14518, 14518, 14549, 14549, 14730, 14730, 14761, 
14761, 14791, 14791, 14822, 14822, 14853, 14853, 14883, 14883, 
14914, 14914, 15095, 15095, 15126, 15126, 15156, 15156, 15187, 
15187, 15218, 15218, 15248, 15248, 15279, 15279, 15461, 15461, 
15492, 15492, 15522, 15522, 15553, 15553, 15584, 15584, 15614, 
15614, 15645, 15645, 15826, 15826, 15857, 15857, 15887, 15887, 
15918, 15918, 15949, 15949, 15979, 15979, 16010, 16010, 16191, 
16191, 16222, 16222, 16252, 16252, 16283, 16283, 16314, 16314, 
16344, 16344, 16375, 16375, 16556, 16556, 16587, 16587, 16617, 
16617, 16648, 16648, 16679, 16679, 16709, 16709, 16740, 16740, 
16953, 16953, 16983, 16983, 17014, 17014, 17045, 17045, 17075, 
17075, 17106, 17106, 17318, 17318, 17348, 17348, 17379, 17379, 
17410, 17410, 17440, 17440, 17471, 17471, 17683, 17683, 17713, 
17713, 17744, 17744, 17775, 17775, 17805, 17805, 17836, 17836
), class = "Date"), Zone = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("B", 
"D"), class = "factor"), mean_rain = c(0.0287096774193548, 0.0464516129032258, 
0.182333333333333, 0.206333333333333, 0.175806451612903, 0.112258064516129, 
0.529354838709677, 0.431612903225806, 0.0463333333333333, 0.104333333333333, 
0.077741935483871, 0.0570967741935484, 0.0816666666666667, 0.0483333333333333, 
0.143225806451613, 0.143225806451613, 0.126666666666667, 0.219, 
0.197741935483871, 0.253548387096774, 0.221290322580645, 0.231290322580645, 
0.254, 0.105, 0.0609677419354839, 0.0629032258064516, 0.0556666666666667, 
0.0573333333333333, 0.16258064516129, 0.211935483870968, 0.213666666666667, 
0.297333333333333, 0.106129032258065, 0.18, 0.180967741935484, 
0.252903225806452, 0.162333333333333, 0.104666666666667, 0.00548387096774194, 
0.00483870967741936, 0.0316666666666667, 0.051, 0.0196774193548387, 
0.0167741935483871, 0.300666666666667, 0.0813333333333333, 0.160967741935484, 
0.12, 0.111612903225806, 0.10741935483871, 0.180666666666667, 
0.171, 0.0793548387096774, 0.087741935483871, 0.0383333333333333, 
0.0803333333333333, 0.271935483870968, 0.31258064516129, 0.579333333333333, 
0.754, 0.369677419354839, 0.351612903225806, 0.344193548387097, 
0.368064516129032, 0.136666666666667, 0.233666666666667, 0.08, 
0.082258064516129, 0.008, 0.00766666666666667, 0.0774193548387097, 
0.05, 0.315333333333333, 0.277, 0.41258064516129, 0.49, 0.4, 
0.364193548387097, 0.140666666666667, 0.120666666666667, 0.0190322580645161, 
0.0158064516129032, 0.15, 0.137333333333333, 0.224516129032258, 
0.294838709677419, 0.113666666666667, 0.189, 0.119677419354839, 
0.105483870967742, 0.234193548387097, 0.205806451612903, 0.421666666666667, 
0.262, 0.0370967741935484, 0.0338709677419355, 0.127, 0.0933333333333333, 
0.118064516129032, 0.151612903225806, 0.127333333333333, 0.237666666666667, 
0.233548387096774, 0.325161290322581, 0.203548387096774, 0.255161290322581, 
0.118333333333333, 0.132, 0.150967741935484, 0.0667741935483871, 
0.114333333333333, 0.0746666666666667, 0.207333333333333, 0.153666666666667, 
0.121935483870968, 0.2, 0.360645161290323, 0.543548387096774, 
0.220666666666667, 0.258333333333333, 0.105161290322581, 0.00258064516129032, 
0.00333333333333333, 0.00166666666666667, 0.328666666666667, 
0.345666666666667, 0.0787096774193548, 0.249677419354839, 0.211612903225806, 
0.179677419354839, 0.169666666666667, 0.135333333333333, 0.0796774193548387, 
0.0441935483870968, 0.0343333333333333, 0.0603333333333333, 0.338333333333333, 
0.223, 0.311612903225806, 0.350645161290323, 0.491935483870968, 
0.239032258064516, 0.083, 0.088, 0.107741935483871, 0.105161290322581, 
0.215, 0.131666666666667)), row.names = c(NA, -148L), class = c("tbl_df", 
"tbl", "data.frame"))

任何人都可以帮我指出正确的方向吗?

标签: rdateggplot2

解决方案


year(Date)您可以通过映射和Zone的交互来实现您想要的结果group

library(ggplot2)
library(lubridate)

ggplot(Rainmean, aes(x= Date , y= mean_rain, group = interaction(lubridate::year(Date), Zone), color = Zone))+
  geom_line()+
  geom_point()+
  labs(title = "Average Monthly Rainfall", y = "Rainfall (in)", x = "Date") +
  theme_bw() + 
  theme(panel.border = element_blank(), panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"),
        axis.text.x = element_text(angle = 0)) +
  scale_x_date(date_breaks = '1 year', date_labels = "%Y") 


推荐阅读