不能使用 geom_col 来绘制 POSIXct 对象?
Can't use geom_col to plot POSIXct object?
我有数据集:
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")
我做错了什么?
问题是 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
我终于明白了:
我有数据集:
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")
我做错了什么?
问题是 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
我终于明白了: