如何让 position_dodge 和 scale_x_date 一起工作?
How to make position_dodge and scale_x_date work together?
我在使用 ggplot2 时遇到了以下困难。我正在尝试创建一个带有时间序列数据集的条形图,该数据集在 x 轴下显示每个条形的值和一个漂亮的日期格式。问题是:
- 要设置在柱内或柱上方,必须使用 position_dodge 但此函数只允许非 POSIXct 变量
- x 轴上日期的首选函数是 scale_x_date,它需要一个 POSIXct 变量
如何解决这个问题?
df <- data.frame(period = c("2019-01-01", "2019-02-01","2019-01-01","2019-02-01"),
variable = c("A", "A", "B", "B"),
value = c(100,88, 99,77))
df$period_d <- as.POSIXct(df$period)
这很好用(但 x 轴上没有日期)。
ggplot(df, aes(x=period, y=value, group= variable, fill=variable))+
geom_col(position= "dodge")+
geom_text(aes(x=period, y=value,label=value),
position = position_dodge(1))
这很好用,但值在错误的地方
ggplot(df, aes(x=period_d, y=value, group= variable, fill=variable))+
geom_col(position= "dodge")+
scale_x_datetime(labels=date_format("%b-%y"),
breaks = date_breaks("1 month"))
但将两者混用是失败的。如果使用 POSIXct 变量,标签不在它们应在的位置,如果使用字符变量,您会收到此错误消息:"Invalid input: time_trans works with objects of class POSIXct only"
有什么想法吗?
datetimes 有 POSIXct,dates 有日期 class(没有时间戳)。后者是离散的,因此您可以将其与条形图和闪避一起使用;前者是连续的,所以你不能。
df$date = as.Date(df$period_d)
ggplot(df, aes(x=date, y=value, group= variable, fill=variable))+
geom_col(position= "dodge")+
geom_text(aes(x=date, y=value,label=value),
# you are drawing one set of bars for every 30 days
# and geom_col is using the whole space by default.
position = position_dodge(width = 30)) +
scale_x_date()
您可以通过绘制更细的条来使它看起来更漂亮:
ggplot(df, aes(x=date, y=value, group= variable, fill=variable))+
geom_col(position= "dodge", width = 5)+
geom_text(aes(x=date, y=value,label=value),
# you are drawing one set of bars for every 30 days
position = position_dodge(width = 5)) +
scale_x_date()
我在使用 ggplot2 时遇到了以下困难。我正在尝试创建一个带有时间序列数据集的条形图,该数据集在 x 轴下显示每个条形的值和一个漂亮的日期格式。问题是:
- 要设置在柱内或柱上方,必须使用 position_dodge 但此函数只允许非 POSIXct 变量
- x 轴上日期的首选函数是 scale_x_date,它需要一个 POSIXct 变量
如何解决这个问题?
df <- data.frame(period = c("2019-01-01", "2019-02-01","2019-01-01","2019-02-01"),
variable = c("A", "A", "B", "B"),
value = c(100,88, 99,77))
df$period_d <- as.POSIXct(df$period)
这很好用(但 x 轴上没有日期)。
ggplot(df, aes(x=period, y=value, group= variable, fill=variable))+
geom_col(position= "dodge")+
geom_text(aes(x=period, y=value,label=value),
position = position_dodge(1))
这很好用,但值在错误的地方
ggplot(df, aes(x=period_d, y=value, group= variable, fill=variable))+
geom_col(position= "dodge")+
scale_x_datetime(labels=date_format("%b-%y"),
breaks = date_breaks("1 month"))
但将两者混用是失败的。如果使用 POSIXct 变量,标签不在它们应在的位置,如果使用字符变量,您会收到此错误消息:"Invalid input: time_trans works with objects of class POSIXct only"
有什么想法吗?
datetimes 有 POSIXct,dates 有日期 class(没有时间戳)。后者是离散的,因此您可以将其与条形图和闪避一起使用;前者是连续的,所以你不能。
df$date = as.Date(df$period_d)
ggplot(df, aes(x=date, y=value, group= variable, fill=variable))+
geom_col(position= "dodge")+
geom_text(aes(x=date, y=value,label=value),
# you are drawing one set of bars for every 30 days
# and geom_col is using the whole space by default.
position = position_dodge(width = 30)) +
scale_x_date()
您可以通过绘制更细的条来使它看起来更漂亮:
ggplot(df, aes(x=date, y=value, group= variable, fill=variable))+
geom_col(position= "dodge", width = 5)+
geom_text(aes(x=date, y=value,label=value),
# you are drawing one set of bars for every 30 days
position = position_dodge(width = 5)) +
scale_x_date()