不仅仅是一个解决方案,我想了解为什么应该很容易的事情,实际上并非如此。
[我从另一篇触及该问题的帖子中借用了部分代码,但最终得到了一个我不喜欢的解决方案]
library(ggplot2)
library(xts)
library(dplyr)
library(scales)
csvData <- "dt,status
2015-12-03,1
2015-12-05,1
2015-12-05,0
2015-11-24,1
2015-10-17,0
2015-12-18,0
2016-06-30,0
2016-05-21,1
2016-03-31,0
2015-12-31,0"
tmp <- read.csv(textConnection(csvData))
tmp$dt <- as.Date(tmp$dt)
tmp$yearmon <- as.yearmon(tmp$dt)
tmp$status <- as.factor(tmp$status)
### Not good. Why?
ggplot(tmp, aes(x = yearmon, fill = status)) +
geom_bar() +
scale_x_yearmon()
### Almost good but long-winded and ticks not great
chartData <- tmp %>%
group_by(yearmon, status) %>%
summarise(count = n()) %>%
as.data.frame()
ggplot(chartData, aes(x = yearmon, y = count, fill = status)) +
geom_col() + …Run Code Online (Sandbox Code Playgroud) 很少有线程处理类似的问题,但我确实没有设法让这个线程像我期望的那样工作。
我有这个数据集:
Item AssetClass variable value
89 F/EER Hybrids 2016-09-15 5.0014
103 F/SOLG MA 2016-09-15 1.5829
104 F/SOP MA 2016-09-15 -5.4365
105 F/SRV MA 2016-09-15 6.1000
49 F/EER Hybrids 2016-06-15 0.7179
63 F/SOLG MA 2016-06-15 0.0000
64 F/SOP MA 2016-06-15 4.7124
65 F/SRV MA 2016-06-15 13.5132
9 F/EER Hybrids 2016-03-15 0.9599
23 F/SOLG MA 2016-03-15 0.0000
24 F/SOP MA 2016-03-15 6.6873
25 F/SRV MA 2016-03-15 9.9191
Run Code Online (Sandbox Code Playgroud)
具有以下结构:
'data.frame': 12 obs. of 4 variables:
$ Item : Factor w/ 40 levels …Run Code Online (Sandbox Code Playgroud) 我确信这是一个简单的,但我找不到其他帖子的解决方案.
如果我运行这个:
test <- data.frame(dates = as.Date(c("2016-10-31","2016-11-30", "2016-12-31", "2017-01-31")),
values = c(1, 2, 3, 4))
ggplot(test, aes(x = dates, y = values)) +
geom_bar(position="stack", stat = "identity") +
scale_x_date(breaks = date_breaks("1 months"),labels = date_format("%b-%y"))
Run Code Online (Sandbox Code Playgroud)
我明白了:
如您所知,X轴上的所有日期都会向前移动到下个月.我尝试使用其他地方建议的scale包,但它没有改变一件事.
我可以通过使用以下方法调整日期来避免这种情况:
test$dates <- as.Date(format(test$dates, "%Y-%m-1"))
Run Code Online (Sandbox Code Playgroud)
提供这个(不使用scale_x_date位):
但我确信有一种优雅的方法来规避这个问题.