3

我正在尝试使用 ggplot 和 R 来分析一些流行病学数据,并且我仍在努力使流行曲线正确显示。

数据在这里

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"))

给出了这张图。这很好,但 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提供有用的标签。

我觉得应该有一种更简单的方法来做到这一点,方法是对起始列进行操作。任何人都可以给我任何指示吗?

4

2 回答 2

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"))
于 2013-09-19T04:08:29.207 回答
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 的帮助,希望这会很有用!

于 2013-09-24T11:33:15.460 回答