主要问题
在尝试使用 ggplot2 制作直方图时,我无法理解为什么日期、标签和中断的处理不像我在 R 中所期望的那样工作。
我在找:
- 我的约会频率的直方图
- 在匹配栏下方居中的刻度线
- 日期标签
%Y-b
格式 - 适当的限制;最小化网格空间边缘和最外层条之间的空白空间
我已将我的数据上传到 pastebin以使其可重现。我创建了几列,因为我不确定最好的方法:
> dates <- read.csv("http://pastebin.com/raw.php?i=sDzXKFxJ", sep=",", header=T)
> head(dates)
YM Date Year Month
1 2008-Apr 2008-04-01 2008 4
2 2009-Apr 2009-04-01 2009 4
3 2009-Apr 2009-04-01 2009 4
4 2009-Apr 2009-04-01 2009 4
5 2009-Apr 2009-04-01 2009 4
6 2009-Apr 2009-04-01 2009 4
这是我尝试过的:
library(ggplot2)
library(scales)
dates$converted <- as.Date(dates$Date, format="%Y-%m-%d")
ggplot(dates, aes(x=converted)) + geom_histogram()
+ opts(axis.text.x = theme_text(angle=90))
这产生了这张图。不过,我想要%Y-%b
格式化,所以我四处寻找并尝试了以下内容,基于这个 SO:
ggplot(dates, aes(x=converted)) + geom_histogram()
+ scale_x_date(labels=date_format("%Y-%b"),
+ breaks = "1 month")
+ opts(axis.text.x = theme_text(angle=90))
stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.
这给了我这张图
- 正确的 x 轴标签格式
- 频率分布已改变形状(binwidth 问题?)
- 刻度线未在条形下方居中显示
- xlims 也发生了变化
我在该部分的ggplot2 文档中完成了示例,当我将它与相同的 x 轴数据一起使用时,它似乎正确地中断、标记和居中刻度。我不明白为什么直方图不同。scale_x_date
geom_line()
根据 edgester 和 gauden 的回答进行更新
我最初认为gauden的回答帮助我解决了我的问题,但现在仔细观察后感到困惑。请注意代码后两个答案的结果图之间的差异。
假设两者:
library(ggplot2)
library(scales)
dates <- read.csv("http://pastebin.com/raw.php?i=sDzXKFxJ", sep=",", header=T)
根据@edgester 下面的回答,我能够做到以下几点:
freqs <- aggregate(dates$Date, by=list(dates$Date), FUN=length)
freqs$names <- as.Date(freqs$Group.1, format="%Y-%m-%d")
ggplot(freqs, aes(x=names, y=x)) + geom_bar(stat="identity") +
scale_x_date(breaks="1 month", labels=date_format("%Y-%b"),
limits=c(as.Date("2008-04-30"),as.Date("2012-04-01"))) +
ylab("Frequency") + xlab("Year and Month") +
theme_bw() + opts(axis.text.x = theme_text(angle=90))
这是我根据高登回答的尝试:
dates$Date <- as.Date(dates$Date)
ggplot(dates, aes(x=Date)) + geom_histogram(binwidth=30, colour="white") +
scale_x_date(labels = date_format("%Y-%b"),
breaks = seq(min(dates$Date)-5, max(dates$Date)+5, 30),
limits = c(as.Date("2008-05-01"), as.Date("2012-04-01"))) +
ylab("Frequency") + xlab("Year and Month") +
theme_bw() + opts(axis.text.x = theme_text(angle=90))
基于 edgester 方法的绘图:
基于高登方法的绘图:
请注意以下事项:
- 2009 年 12 月和 2010 年 3 月 gauden 图中的差距;显示数据
table(dates$Date)
中有 19 个实例2009-12-01
和 26 个实例2010-03-01
- edgester 的情节从 2008 年 4 月开始,到 2012 年 5 月结束。根据 2008 年 4 月 1 日数据中的最小值和 2012 年 5 月 1 日的最大值,这是正确的。由于某种原因,高登的情节从 2008 年 3 月开始,但不知何故仍设法在 2012 年 5 月结束。在计算垃圾箱并阅读月份标签之后,对于我的生活,我无法弄清楚哪个情节有额外的或缺少直方图的垃圾箱!
对这里的差异有什么想法吗?edgester 的创建单独计数的方法
相关参考
顺便说一句,这里还有其他位置,其中包含有关日期和 ggplot2 的信息,供路人寻求帮助:
- 从learnr.wordpress 开始,这是一个流行的 R 博客。它说我需要将我的数据转换为 POSIXct 格式,我现在认为这是错误的并且浪费了我的时间。
- 另一个学习者帖子在 ggplot2 中重新创建了一个时间序列,但并不真正适用于我的情况。
- r-bloggers 对此有一个帖子,但它似乎已经过时了。简单的
format=
选项对我不起作用。 - 这个 SO 问题正在使用中断和标签。我尝试将我的
Date
向量视为连续的,但认为它效果不佳。看起来它一遍又一遍地覆盖相同的标签文本,所以这些字母看起来有点奇怪。分布是正确的,但有一些奇怪的休息。我基于接受的答案的尝试是这样的(结果here)。