我有数据集:
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")
但是我需要建立一个barplot,所以我使用下面的代码效果不佳:
ggplot(dum, aes(y=v2, x=v1)) +
geom_col(fill="#59AA46")
我在做什么错了?
答案 0 :(得分:3)
问题是ggplot将对轴使用unix时间(默认情况下,这是自1970年1月1日(UTC / GMT午夜)以来经过的秒数)。
在您的数据中,日期可以追溯到1960年,这意味着y-axis
上的值不仅为负值,而且都低于13e+6
(一年中的秒数)。
由于geom_line
或geom_point
仅考虑这些值,因此在绘制时不会引起任何问题,但是geom_col
或geom_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
我最终得到了这个: