0

我有数据集:

vec=c("1960-01-01 06:39:00","1960-01-01 05:10:00","1960-01-01 04:30:00","1960-01-01 02:53:00")
vec=as.POSIXct(vec, origin="1960-01-01", tz = "GMT")
dum=data.frame(v1=c("a","b","c","d"),v2=vec)

如果我尝试用一​​条线构建一个情节,它会起作用:

ggplot(dum, aes(y=v2, x=v1, group=1)) + 
geom_line(colour="#59AA46")

在此处输入图像描述

但是我需要的是构建一个条形图,所以我使用了以下代码,但效果不太好:

ggplot(dum, aes(y=v2, x=v1)) + 
geom_col(fill="#59AA46")

在此处输入图像描述

我究竟做错了什么 ?

4

1 回答 1

3

问题是 ggplot 将使用 unix 时间作为轴(默认情况下是自 1970 年 1 月 1 日(午夜 UTC/GMT)以来经过的秒数)。

在您的数据中,日期可以追溯到 1960 年,这意味着值y-axis不仅是负数,而且都低于13e+6(一年中的秒数)。

由于 geom_linegeom_point将仅考虑这些值,因此在绘图时这一事实不会引起任何问题,但是geom_colgeom_bar将为每个条形编码开始和结束值,在您的情况下,它将始终从点 0 开始(即 1970-01-01 00:00:00)并在略低于 31e+6(即 1960-01-01 H:M:S)的某个时间点结束。

您可以做的一种解决方法是使用 unix 时间和布局,直到获得所需的输出

这就是我的意思:

# define the y-axis limits 
start_lim <- as.integer(as.POSIXct("1960-01-01 00:00:00", tz = "GMT"))
end_lim <- as.integer(as.POSIXct("1960-01-02 00:00:00", tz = "GMT"))

# plot
ggplot(dum, aes(x=v1, y=as.integer(v2))) +              # use v2 as integer
  geom_col(fill="#59AA46") +                      
  coord_cartesian(ylim = c(start_lim, end_lim)) +       # set the y limits
  scale_y_reverse(breaks = as.integer(vec),             # reverse the y axis 
                  labels = vec) +                       # set the labels and ticks as wanted
  ylab('Date-time')                                     # set the axis title

我最终得到了这个:

在此处输入图像描述

于 2019-01-02T15:31:29.313 回答