首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图形绘制空月份

图形绘制空月份
EN

Stack Overflow用户
提问于 2020-07-01 17:34:41
回答 1查看 330关注 0票数 0

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

我有一个列表,它包含了每个月对应的12个数据。(数据$1,数据$2,等等)

每个dataframe包含多年内月份的timeseries数据。我想要可视化这些数据,但是当我尝试用

代码语言:javascript
复制
ggplot(Data$January, aes(x = `Date`, y = `WaterLevel`)) +  
   geom_point()   

一月份的数据显示出来,然而,这幅图显示了几年的时间跨度,但包含了2月至12月的空月。是否有这样的情节只显示一月?

这些数据的结构如下:

数据帧: 15412个。在13个变量中:

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

"NBS01“"NBS01”.

$ Station.Id : num 324 324 324 .

$ Water_level:编号: 201 203 203 203 206 206 208 208 208 .

等价物: num NA ..。

$ site_id : num 324 324 324 .

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

$ wtr_lvlp : num 186 190 191 191 191 .

$ equiv_p : 0.683 0.711 0.699 0.691 0.681 .

$ wtrlvl_Diff : 14.8 12.9 12.3 11.8 11.6 .

$ equiv_Diff : 0.683 0.711 0.699 0.691 0.681 .

wtrlvl_RMSE : num 84.1 84.1 84.1 .

$ equiv_RMSE : num ..。

编辑3: dp(总目(数据$1))

代码语言:javascript
复制
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")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-01 18:47:36

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

代码语言:javascript
复制
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中。

代码语言:javascript
复制
ggplot(df, aes(x = Date, y = Water_level)) + geom_point()   

从你提出的问题来看,你似乎希望将不同年份1月月份的数据在视觉上连在一起,以便"2007-01-01“直接跟随在"2006-01-31”之后。

快速而肮脏的溶液

实现这一目标的一种快速方法是将date列转换为一个因子(一个分类变量)。当您这样做时,您的第一次约会将是您的分类变量中的第一级,第二次约会是您的第二级,等等。由于您只有一月的日期,这将导致"2007-01-01“紧随其后的"2006-01-31”。

代码语言:javascript
复制
# transform Date column to categorical variable
df$Date <- as.factor(df$Date) 

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

这个解决方案是快速的,但也有一些缺陷。首先,如果看到这些不同的日期连在一起,可能会让人感到困惑。此外,如果您的数据集跳过了几天(例如从"2006-01-05“跳到"2006-01-15"),那么这些点将连续出现在您的情节中(因为它们将是连续的”类别“)。而且,您可能需要使用xaxis中的标签,因为它们最终会相互取代。

更好的解决办法(在我看来)

一个更好的解决方案是创建另一列,其中包含数据年(使用,原始数据框架,日期为),然后每年在不同的方面进行绘图。

代码语言:javascript
复制
# 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")  

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62682363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档