【发布时间】:2012-06-01 23:56:08
【问题描述】:
主要问题
在尝试使用 ggplot2 制作直方图时,我无法理解为什么日期、标签和中断的处理不像我在 R 中所期望的那样工作。
我正在寻找:
- 我的约会频率的直方图
- 在匹配栏下方居中的刻度线
-
%Y-b格式的日期标签 - 适当的限制;最小化网格空间边缘和最外层条之间的空白空间
我已经uploaded my data to 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))
产生this graph。不过,我想要%Y-%b 格式,所以我四处寻找并尝试了以下基于this 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.
这给了我this graph
- 正确的 x 轴标签格式
- 频率分布已改变形状(binwidth 问题?)
- 刻度线不会在条形下方居中显示
- xlim 也发生了变化
我研究了scale_x_date 部分的ggplot2 documentation 中的示例,当我将它与相同的x 轴数据一起使用时,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 方法的绘图:
基于高登方法的情节:
注意以下几点:
- gauden 2009 年 12 月和 2010 年 3 月的情节中的差距;
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 月结束。在计算了 bin 并阅读了月份标签之后,对于我的生活,我无法弄清楚哪个情节有额外的或缺少直方图的 bin!
对这里的差异有什么想法吗? edgester 的创建单独计数的方法
相关参考文献
顺便说一句,这里还有其他位置,其中包含有关日期和 ggplot2 的信息,供路人寻求帮助:
- Started here 在 learnr.wordpress,一个流行的 R 博客。它说我需要将我的数据转换为 POSIXct 格式,我现在认为这是错误的并且浪费了我的时间。
- Another learnr post 在 ggplot2 中重新创建了一个时间序列,但并不真正适用于我的情况。
-
r-bloggers has a post on this,但它似乎已经过时了。简单的
format=选项对我不起作用。 -
This SO question 正在玩弄休息和标签。我尝试将我的
Date向量视为连续的,但认为它效果不佳。看起来它一遍又一遍地覆盖相同的标签文本,所以这些字母看起来有点奇怪。分布是正确的,但有一些奇怪的休息。根据接受的答案,我的尝试是这样的 (result here)。
【问题讨论】:
-
查看
lubridate包。 -
@gsk3 我听说过它,但我的理解是它有助于格式化、间隔、递增等。你认为我的问题在于 lubridate 可以帮助解决的问题吗?我认为这是正确使用 ggplot2 的语法。
-
我不明白你的问题。您是否尝试过提出问题,然后在同一篇文章中回答?如果是这样,请将您的问题重新表述为问题,然后自己回答。 (在 SO 上积极鼓励这样做。)
-
请提出一个新问题,因为您刚刚切换了原始数据集。这个问题读起来非常混乱。请接受一个答案并为任何有帮助的答案投票。
-
@edgester:我可能会重写这个问题。很难保持简洁。问题是 ggplot2 与日期/时间混淆。我想说明有多少种理论方法可以尝试使这项工作发挥作用,以及每种方法存在的问题。
标签: r datetime ggplot2 histogram