我对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")
答案 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()
从您的问题看来,您似乎希望将不同年份的一月月份的数据进行视觉级联,因此“ 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()
此解决方案很快,但有一些陷阱。首先,有人看到这些不同的日期可能会让人感到困惑。另外,如果您的数据集跳过了几天(例如,从“ 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")
希望这会有所帮助!
答案 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创建