2013-07-22 2 views
0

У меня есть (макроэкономические) годовые данные из «Penn World Tables». У меня проблемы с метками даты. Как вы можете видеть ниже, даты выражаются в виде десятичных знаков. Я предпринял несколько попыток исправить это, но не повторил: я обращаюсь к вам за помощью.график ежегодных временных рядов с красивыми надписями

enter image description here

Это происходит, я думаю, потому что "финики" (целые числа, как 2000, 2001 и т.д.) рассматриваются как numeric, а не как dates. Моя основная проблема заключается в том, чтобы зафиксировать формат даты внутри фрейма данных для удобства построения графика.

Если ПОЛ указует имя моего dataframe и год указует на столбец, который хранит «дату», это то, что я пытался, но безуспешно:

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 

EDIT: Убран вопрос, связанный с xts объектов. Убрал dput(), чтобы укоротить вопрос.

ответ

1

Переменная 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") 

Если объект даты используются для оси х, то в 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")) 
+0

Thanks Didzis. Вы пишете «Для даты, в которой вам нужно также значение месяца и дня». Как вы можете сделать что-то вроде 'pwt $ year <- strptime (pwt $ year, format ="% Y ")' work?Он создает даты типа 1950-07-22, используя сегодняшний день и месяц, тогда как вместо этого я хотел бы использовать 1950-01-01. Кроме того, знаете ли вы, как сделать объект xts из фреймворка данных? Благодаря! – PatrickT

+0

Ты ответил мне еще до того, как я спросил !! Как насчет объекта xts, есть ли для этого простой код? Благодаря! – PatrickT

+0

Не беспокойтесь о xts! Но еще один вопрос, если я использую 'as.Date (paste0 (pwt $ year," - 01-01 "), format ="% Y-% m-% d ")', а затем 'coord_cartesian (xlim = c (2000,2010), ylim = c (22000,35000)) + + scale_x_continuous (breaks = seq (2000,2010,2)) ', я получаю' Ошибка: дискретное значение, предоставленное для непрерывного масштабирования' Спасибо! – PatrickT

Смежные вопросы