首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >R:创建一个时间日期y变量的ggplot2条形图。

R:创建一个时间日期y变量的ggplot2条形图。
EN

Stack Overflow用户
提问于 2015-08-16 13:49:52
回答 1查看 826关注 0票数 2

我在试图创建一个非常简单的y轴上的时间变量条形图时遇到了很多困难。它使用geom_pointgeom_line绘制得很好,但是一旦我用geom_bar替换了它们,R要么崩溃,要么给我一个空白的灰色图。

我的原始数据是格式的字符串:

代码语言:javascript
代码运行次数:0
运行
复制
day       time
1/1/2015  2:30:14
2/1/2015  15:10:40
3/1/2015  8:50:05

知道ggplot2对时间和日期类可能有点挑剔,我将变量格式化为POSIXct和date,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
library(ggplot2); library(scales)
datetime <- data.frame(date = c("1/1/2015", "2/1/2015", "3/1/2015"), 
                   time = c("2:30:14", "15:10:40", "8:50:05"))
datetime$date <- as.Date(datetime$date, format="%m/%d/%Y")
datetime$time <- as.POSIXct(datetime$time, format="%H:%M:%S")

然后,创建一个简单的数据散点图可以很好地工作:

代码语言:javascript
代码运行次数:0
运行
复制
ggplot(datetime, aes(date, time)) +
    geom_point() +
    xlab("Day") +
    ylab("Time") +
    scale_y_datetime(breaks = date_breaks("1 hour"), 
                     labels = date_format("%H:%M"))

但是,像我通常创建条形图一样,用geom_point()代替geom_bar(stat="identity")似乎会导致一个不断加载的过程,有时还会导致R的崩溃:

代码语言:javascript
代码运行次数:0
运行
复制
ggplot(datetime, aes(date, time)) +
    geom_bar(stat="identity") +
    xlab("Day") +
    ylab("Time") +
    scale_y_datetime(breaks = date_breaks("1 hour"), 
                     labels = date_format("%H:%M"))

我可能误解了ggplot2的功能,所以有人能告诉我到底是怎么回事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-16 14:52:38

在ggplot2中,条形图的y标度在默认情况下从零开始。或者,在日期和时间值的情况下,从起始值开始,即1/1/1970。这意味着你的酒吧长达45年(时间值R显然把今天设定为一个日期)。但在这段时间内,您强迫ggplot2使用非常精细的比例:您将间隔设置为1小时:

代码语言:javascript
代码运行次数:0
运行
复制
scale_y_datetime(breaks = date_breaks("1 hour"),
                     labels = date_format("%H:%M"))

这可能会导致R坠毁。如果你用的只是

代码语言:javascript
代码运行次数:0
运行
复制
ggplot(data, aes(day, time)) +
  geom_bar(stat = "identity")

它会工作,但酒吧将是无法区分的。要使条形图区分开来,您必须更改y-限制,例如,更改为0:00到23:59:59之间的时间段。这对我来说很管用:

代码语言:javascript
代码运行次数:0
运行
复制
ggplot(data, aes(day, time)) +
  geom_bar(stat = "identity") +
  xlab("Day") +
  ylab("Time") +
  coord_cartesian(ylim=c(as.POSIXct("0:0:0", format="%H:%M:%S"),
                         as.POSIXct("23:59:59", format="%H:%M:%S"))) +
  scale_y_datetime(breaks = date_breaks("1 hour"),
                 labels = date_format("%H:%M")) +
  scale_x_date(breaks = pretty_breaks(10))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32035795

复制
相关文章

相似问题

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