用漂亮的标签绘制年度时间序列

时间:2013-07-22 11:16:45

标签: r ggplot2

我有来自“宾夕法尼亚世界表”的(宏观经济)年度数据。我的日期标签有问题。如下所示,日期以小数表示。我已多次尝试修复它,但反复失败:我求助于你。

enter image description here

我认为,这种情况会发生,因为“日期”(整数,如2000年,2001年等)被视为numeric而不是dates因此,我的主要问题是在数据框内修改日期格式以便于绘图。

如果pwt表示我的数据帧的名称,而year表示存储“日期”的列,那么这就是我尝试过的,但没有成功:

pwt$year <- strptime(pwt$year, format = "%Y")
pwt$year <- as.Date(as.character(pwt$year), format("%Y"), origin = "1970-01-01")
pwt$year <- as.Date(pwt$year, format='%Y-01-01', origin = "1970-01-01")
pwt$year <- as.yearmon(pwt$year) # requires zoo package

可重现代码

现在让我提供数据。我将向您展示应重新创建数据的步骤。

### Define directories
 if(.Platform$OS.type == "windows"){
   currentdir <- "c:/R/pwt"
 } else {
 currentdir <- "~/R/pwt"}
 setwd(currentdir)

# download and save data in current directory
download.file("http://www.rug.nl/research/GGDC/data/pwt/V80/pwt80.xlsx", "pwt80.xlsx", mode="wb")
# **Edit** binary mode "wb" needed!

# convert and save the data sheet in csv format
library(gdata)
installXLSXsupport() # support for xlsx format
DataSheet <- read.xls("pwt80.xlsx", sheet="Data") # load the Data sheet only
write.csv(DataSheet, file=paste("pwt80", "csv", sep="."), row.names=FALSE)

# read pwt80.csv data stored in current directory
pwt80 <- read.csv(paste(currentdir, "pwt80.csv", sep="/"))

# use -subset- to get specifc countries and variables.
countries <- c("ESP", "ITA")
variables <- c("country", "countrycode", "year", "rgdpo", "pop")
pwt <- subset(#
  pwt80
  , countrycode %in% countries
  , select = variables
)#

我现在有兴趣绘制上述国家子样本的人均国内生产总值。所以这里有一些打算这样做的代码。

# Plot data with qplot
library(ggplot2)
qp <- qplot(#
  year
  , rgdpo/pop
  , data = subset(pwt80, countrycode %in% countries)
  , geom = "line"
  , group = countrycode
  , color = as.factor(countrycode)
)#
qp <- qp + 
  xlab("") + 
  ylab("Real GDP Per Capita (international $, 2005 prices, chain)") + 
  theme(legend.title = element_blank()) + 
  coord_trans(y = "log10")

此时日期看起来还不错,但是当我用xlim和ylim“缩放”时,情况开始出错:

qp <- qp + xlim(2000,2010) + ylim(22000,35000)
qp

如果我使用ggplot而不是qplot,则存在同样的问题。

# Plot data with ggplot
ggp <- ggplot(pwt,aes(x=year,y=rgdpo/pop,color=as.factor(countrycode),group=countrycode)) + 
  geom_line()  
ggp <- ggp + 
  xlab("") + 
  ylab("Real GDP Per Capita (international $, 2005 prices, chain)") + 
  theme(legend.title = element_blank()) + 
  coord_trans(y = "log10")
ggp

ggp <- ggp + xlim(2000,2010) + ylim(22000,35000)
ggp

编辑:删除了与xts个对象相关的问题。删除dput()以缩短问题。

1 个答案:

答案 0 :(得分:2)

变量year不会被视为日期,因为它只有年份值。对于日期,您还需要月和日值。在这种情况下,最简单的方法是使用scale_x_continuous()并设置自己的breaks=

您还提到要缩放图表 - 然后您应该使用coord_cartesian()代替xlim(),因为xlim()会从计算中删除未使用的数据(范围之外的日期)。

qp+coord_cartesian(xlim=c(2000,2010),ylim=c(22000,35000))+
  scale_x_continuous(breaks=seq(2000,2010,2))

如果您确实需要year个值作为日期,那么您可以向这些值添加一些任意的月和日值,然后将其转换为日期对象。

pwt$year2<-as.Date(paste0(pwt$year,"-01-01"),format="%Y-%m-%d")

如果日期对象用于x轴,则coord_cartesion()用于xlim=,您还应提供限制作为日期对象。要控制x轴格式化,请使用scale_x_date()

library(scales)

qp+coord_cartesian(xlim=as.Date(c("2000-01-01","2010-01-01")),ylim=c(22000,35000))+
  scale_x_date(breaks=date_breaks("2 years"),labels=date_format("%Y"))