【问题标题】:stacked ggplot for data coverage over time堆叠 ggplot 用于随时间变化的数据覆盖率
【发布时间】:2023-04-01 15:20:01
【问题描述】:

我正在处理数据库中的数据,这些数据经常刷新,我希望有一个时间范围的图形表示,当有良好的数据覆盖率时,将滞后版本更新为数据的实际日期上次刷新。

# data example
name <- c("DATA1", "DATA2", "DATA3")
start <- c("1988-01-01","1994-01-01", "1988-01-01")
end <- c("2013-12-31","2013-05-31","2014-03-31")
refresh <- c("2014-02-28","2013-07-25","2014-05-20")
mydata <- data.frame(name, start, end, refresh)

# data preview
mydata
   name      start        end    refresh
1 DATA1 1988-01-01 2013-12-31 2014-02-28
2 DATA2 1994-01-01 2013-05-31 2013-07-25
3 DATA3 1988-01-01 2014-03-31 2014-05-20

然后我重塑数据(我不确定这是否是绝对必要的:

   library(ggplot2)
   library(reshape)   
   mdata <- melt(mydata, measure.vars = c("start", "end", "refresh"))

到目前为止,我只设法像这样绘制开始 - 刷新日期:

ggplot(mdata, aes(as.Date(value, "%Y-%m-%d"), factor(name, levels=name))) +
geom_line(size=6) +
xlab("") + ylab("") +
theme_bw()

问题:

1:我似乎收到了很多警告信息,即

Warning messages:
1: In `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels) else paste0(labels,  :
  duplicated levels in factors are deprecated
2: In `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels) else paste0(labels,  :
  duplicated levels in factors are deprecated
3: In `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels) else paste0(labels,  :
  duplicated levels in factors are deprecated
4: In `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels) else paste0(labels,  :
  duplicated levels in factors are deprecated

2:我真正想要的是从头到尾有一个黑条和一个用于刷新的红条

附:我只使用factor位,因为我希望数据按照我原始表的顺序排序,否则它们将按表名的字母顺序排列(我的真实表名与此示例不同)。

【问题讨论】:

  • 我也遇到过Removed 1 rows containing missing values (geom_path).。但是,表格中有该项目的数据,但最终在图中显示为空白。

标签: r ggplot2 reshape


【解决方案1】:

发生错误是因为在factor(name, levels=name)) 中有重复的names。你可能想要factor(name, levels=unique(name)))

如果您想使用geom_line,您需要复制一些数据。你可以改用geom_linerange

mydata[,2:4] <- lapply(mydata[,2:4], as.Date)

library(ggplot2)
ggplot(mydata, aes(x=factor(name, levels=unique(name)))) +
  geom_linerange(aes(ymin=start, ymax=end, colour="period1"), size=5) +
  geom_linerange(aes(ymin=end, ymax=refresh, colour="period2"), size=5) +
  coord_flip() +
  scale_colour_manual(name="period", values=c("period1"="black", "period2"="red")) +
  xlab("name")

【讨论】:

  • 这看起来不错,我只需要弄清楚如何附加句点位。
  • 我不明白你的评论。
  • 我显然必须创建一个额外的变量,其中包含“period1”和“period2”!?
  • 对不起,我现在明白了!
  • 我如何在此之上的某个日期获得一条垂直线? geom_vlinegeom_hline 似乎不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
  • 2016-06-22
  • 2018-05-12
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多