ggplot绘制空月份

时间:2020-07-01 17:34:41

标签: r ggplot2

我对R还是很陌生,一直在努力寻找解决方案。

我有一个列表,该列表由对应于每个月的12个数据帧组成。 (Data $ January,Data $ February等)。

每个数据框都包含年份范围内月份的时间序列数据。我想可视化这些数据,但是当我尝试使用ggplot

ggplot(Data$January, aes(x = `Date`, y = `WaterLevel`)) +  
   geom_point()   

显示1月数据,但是该图显示了年份跨度,但包括2月至12月的空月份。反正有没有只显示一月的情节?

数据的结构为:

“ data.frame”:15412磅。 13个变量中:

$ Date:日期,格式:“ 2006-01-01”“ 2006-01-02”“ 2006-01-03”“ 2006-01-04” ...

$站:chr“ NBS01”“ NBS01”“ NBS01”“ NBS01” ...

$ Station.Id:数字324324324324324324324324324324324324 ...

$ Water_level:num 201203203203203203206206206208208208 ...

等价$:num NA NA NA NA NA NA NA NA NA NA NA NA ...

$ site_id:数字324324324324324324324324324324324324 ...

$ POSIXct:POSIXct,格式:“ 2006-01-01”“ 2006-01-02”“ 2006-01-03”“ 2006-01-04” ...

$ wtr_lvlp:num 186190191191191 ......

$ equiv_p:num 0.683 0.711 0.699 0.691 0.681 ...

$ wtrlvl_Diff:编号14.8 12.9 12.3 11.8 11.6 ...

$ equiv_Diff:num 0.683 0.711 0.699 0.691 0.681 ...

$ wtrlvl_RMSE:编号84.1 84.1 84.1 84.1 84.1 ...

$ equiv_RMSE:num NA NA NA NA NA NA NA NA NA NA NA NA ...

编辑3:dp(head(data $ January))

structure(list(Date = structure(c(13149, 13150, 13151, 13152, 
13153, 13154), class = "Date"), Station = c("NBS01", 
"NBS01", "NBS01", "NBS01", "NBS01", "NBS01"
), Station.Id = c(324, 324, 324, 324, 324, 324), Water_level = c(201, 
203, 203, 203, 203, 206), Equivalent = c(NA_real_, 
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), site_id = c(324, 
324, 324, 324, 324, 324), POSIXct = structure(c(1136073600, 1136160000, 
1136246400, 1136332800, 1136419200, 1136505600), class = c("POSIXct", 
"POSIXt"), tzone = "UTC"), wtr_lvlp = c(186.2000028, 190.1000028, 
190.7000028, 191.2000028, 191.4000029, 191.6000029), equiv_p = c(0.682899983, 
0.711299982, 0.699199982, 0.690699983, 0.681199983, 0.672699983
), wtrlvl_Diff = c(14.79999723, 12.89999717, 12.29999716, 11.79999715, 
11.59999715, 14.39999714), equiv_Diff = c(0.682899983, 0.711299982, 
0.699199982, 0.690699983, 0.681199983, 0.672699983), wtrlvl_RMSE = c(84.1300149026027, 
84.1300149026027, 84.1300149026027, 84.1300149026027, 84.1300149026027, 
84.1300149026027), equiv_RMSE = c(NA_real_, NA_real_, NA_real_, 
NA_real_, NA_real_, NA_real_)), row.names = 1097:1102, class = "data.frame")

2 个答案:

答案 0 :(得分:1)

在您的示例中,您仅提供了2006年的数据,因此我们无法观察到您的问题。我在2007年1月用虚拟数据扩展了数据框以包含值。我还只保留了绘图中使用的两列

df <- structure(list(Date = structure(c(13149, 13150, 13151, 13152, 13153, 13154,13514,13515,13516,13517,13518,13519), class = "Date"), 
                     Water_level = c(201, 203, 203, 203, 203, 206, 211,213,213,213,213,216)), row.names = 1:12, class = "data.frame")

由于您的Date列采用日期格式,因此ggplot将该列中的数据解释为日期,并将考虑到它们之间的实际时差来绘制点。也就是说,如果您在日期“ 2006-01-01”处有一个点,而在日期“ 2007-01-01”处有一个点,则在绘图中它们将相隔365天(应如此),并且之间的日期将出现在xlabel。

ggplot(df, aes(x = Date, y = Water_level)) + geom_point()   

enter image description here

从您的问题看来,您似乎希望将不同年份的一月月份的数据进行视觉级联,因此“ 2007-01-01”紧跟在“ 2006-01-31”之后。

快速而肮脏的解决方案

一种完成此操作的快速方法是将日期列转换为一个因子(分类变量)。执行此操作时,第一个日期将是类别变量中的第一级,第二个日期将是第二级,依此类推。由于您只有一月的日期,因此将直接在“ 2006-01-31”之后显示“ 2007-01-01”。

# transform Date column to categorical variable
df$Date <- as.factor(df$Date) 

# plot again
ggplot(df, aes(x = Date, y = Water_level)) + geom_point()   

enter image description here

此解决方案很快,但有一些陷阱。首先,有人看到这些不同的日期可能会让人感到困惑。另外,如果您的数据集跳过了几天(例如,从“ 2006-01-05”到“ 2006-01-15”),则这些点将连续出现在您的绘图中(因为它们将是连续的“类别”)。而且,您可能需要使用x轴上的标签,因为它们最终会彼此重叠。

更好的解决方案(在我看来)

一个更好的解决方案是用数据的年份创建另一列(使用带日期的原始数据框),然后每年在不同的方面进行绘制。

# this package helps to do manipulations with dates
library(lubridate)

#create column with year
df$year <- year(df$Date)

#create plots separating each year in a different facet (scales = "free_x" is important!)
ggplot(df, aes(x = Date, y = Water_level)) + geom_point() + facet_wrap(vars(year), scales="free_x")  

enter image description here

希望这会有所帮助!

答案 1 :(得分:1)

我认为我们可以像这样重现相关的数据结构:

set.seed(69)

df <- data.frame(Date = as.Date("2006-01-01") + lubridate::days(0:3651),
                 Water_level = cumsum(runif(3652, -0.2, 0.2)) + 200)

Data <- split(df, month.name[lubridate::month(df$Date)])

现在,列表中有12个数据帧。每个数据框都以一个月命名,但跨越数年。

所以您的情节大概是这样的:

library(ggplot2)

ggplot(Data$January, aes(x = Date, y = Water_level)) +  
  geom_point()   

但是我们可以通过在每个帧中添加月份和年份列,然后进行分面来解决此问题:

library(lubridate)

Data <- lapply(Data, function(x) { x$month <- month.name[month(x$Date)]; x})
Data <- lapply(Data, function(x) { x$year  <- year(x$Date); x})

ggplot(Data$January, aes(x = Date, y = Water_level)) +  
  geom_point() +
  facet_grid(cols = vars(year), scales = "free")

reprex package(v0.3.0)于2020-07-01创建

相关问题