我正在尝试使用ggplot和R来分析一些流行病学数据,而且我仍在努力让流行曲线正确显示。
数据为here
attach(epicurve)
head(epicurve)
onset age
1 21/12/2012 18
2 14/06/2013 8
3 10/06/2013 64
4 28/05/2013 79
5 14/04/2013 56
6 9/04/2013 66
epicurve$onset <- as.Date(epicurve$onset, format="%d/%m/%Y")
ggplot(epicurve, aes(onset)) + geom_histogram() + scale_x_date(breaks=date_breaks("1 year"), minor_breaks=date_breaks("1 month"), labels = date_format("%b-%Y"))
给出this graph。这很好,但是binwidth与任何时间段都没有关系,调整它们有点试错。
对于这个特定的数据集,我想按发病月份显示病例。
我解决了如何做到这一点的一种方法是:
epicurve$monyr <- format(epicurve$onset, "%b-%Y")
epicurve$monyr <- as.factor(epicurve$monyr)
ggplot(epicurve, aes(monyr)) + geom_histogram()
输出由于信誉系统而无法发布的图表。条形代表有意义的东西,但轴标签是炸弹网站。我无法使用scale_x_date
格式化轴,因为它们不是日期,我无法确定要传递给scale_x_discrete
的参数以提供有用的标签。
我觉得应该通过在起始列上执行操作来更简单地执行此操作。有人可以给我任何指示吗?
答案 0 :(得分:1)
一种选择是在ggplot之外聚合数据,然后使用geom_bar
。这将按月生成计数。
2013年9月21日编辑。改变情节以显示没有计数的月份。
epicurve <- read.csv("epicurve.csv", sep=",", header=T)
# initial formatting
epicurve$onset <- as.Date(epicurve$onset, format="%d/%m/%Y") # convert to Date class
epicurve$onset <- strftime(epicurve$onset, format="%Y/%m") # convert to Year-month
epicurve$onset <- paste(epicurve$onset, "/01", sep = "") # add arbitrary day on to end to make compatible w/ ggplot2
# aggregate by month
onset_counts <- aggregate(epicurve$onset, by = list(date = epicurve$onset), length) # aggregate by month
onset_counts$date = as.Date(onset_counts$date, format = "%Y/%m/%d") # covert to Date class
# plot
library(ggplot2)
library(scales)
ggplot(onset_counts, aes(x=date, y=x)) + geom_bar(stat="identity") + theme_bw() + theme(axis.text.x = element_text(angle=90, hjust = 1, vjust = 1)) +
ylab("Frequency") + xlab(NULL) + scale_x_date(breaks="month", labels=date_format("%Y-%m"))
答案 1 :(得分:1)
我也发生了另一种让它看起来很漂亮的方式,虽然它感觉像是一块混合物。
#read data
epicurve <- read.csv("epicurve.csv", sep=",", header=T)
epicurve$onset <- as.Date(epicurve$onset, format="%d/%m/%Y")
#load libraries
library(ggplot2)
library(scales)
#plot
ggplot(epicurve, aes(onset)) + geom_histogram(colour="white", binwidth=30.4375) +
scale_x_date(breaks=date_breaks("1 year"), minor_breaks=("1 month"), labels=date_format("%b-%Y")) +
scale_y_continuous(breaks=0:10, minor_breaks=NULL) +
theme(axis.text.x = element_text(angle=45, vjust=0.5))
# binwidth = (365.25/12) = 30.4375 - which nicely makes the bins fit the scale nicely
这给了这个(注意箱子的美丽对齐!):
非常感谢Nate的帮助,希望这会有用!