R ggplot и сетка фасетов: как управлять перерывами по оси x

Я пытаюсь построить изменение в временном ряду для каждого календарного года с помощью ggplot, и у меня возникают проблемы с тонким контролем оси x. Если я не использую scale="free_x", тогда я получаю ось x, которая показывает несколько лет, а также год, о котором идет речь, например:

Facet grid plot with common x-axis

Если я использую scale="free_x", то, как и следовало ожидать, в итоге я получаю метки меток для каждого графика и в некоторых случаях изменяются по сюжету, чего я не хочу:

Facet grid plot with free x-axis

Я сделал различные попытки определить ось x, используя scale_x_date и т.д., но без каких-либо успехов. Поэтому мой вопрос:

Q. Как я могу управлять разрывами и метками оси x в сетке грантов ggplot так, чтобы ось x (временной ряд) была одинаковой для каждой грани, отображается только в нижней части панели и представлена ​​в виде отформатированных месяцев 1, 2, 3 и т.д. Или "Ян", "Фев", "Мар"?

Код следует:

require(lubridate)
require(ggplot2)
require(plyr)

# generate data
df <- data.frame(date=seq(as.Date("2009/1/1"), by="day", length.out=1115),price=runif(1115, min=100, max=200))
# remove weekend days
df <- df[!(weekdays(as.Date(df$date)) %in% c('Saturday','Sunday')),]
# add some columns for later
df$year <- as.numeric(format(as.Date(df$date), format="%Y"))
df$month <- as.numeric(format(as.Date(df$date), format="%m"))
df$day <- as.numeric(format(as.Date(df$date), format="%d"))

# calculate change in price since the start of the calendar year
df <- ddply(df, .(year), transform, pctchg = ((price/price[1])-1))

p <- ggplot(df, aes(date, pctchg)) +
  geom_line( aes(group = 1, colour = pctchg),size=0.75) + 
  facet_wrap( ~ year, ncol = 2,scale="free_x") +
  scale_y_continuous(formatter = "percent") +
  opts(legend.position = "none")

print(p)

Ответы

Ответ 1

вот пример:

df <- transform(df, doy = as.Date(paste(2000, month, day, sep="/")))

p <- ggplot(df, aes(doy, pctchg)) +
 geom_line( aes(group = 1, colour = pctchg),size=0.75) + 
 facet_wrap( ~ year, ncol = 2) +
 scale_x_date(format = "%b") +
 scale_y_continuous(formatter = "percent") +
 opts(legend.position = "none")
p

enter image description here

Вам нужен этот?

Фокус в том, чтобы генерировать день года одного и того же фиктивного года.

ОБНОВЛЕНО

вот пример для dev-версии (т.е. ggplot2 0.9)

p <- ggplot(df, aes(doy, pctchg)) +
  geom_line( aes(group = 1, colour = pctchg), size=0.75) + 
  facet_wrap( ~ year, ncol = 2) +
  scale_x_date(label = date_format("%b"), breaks = seq(min(df$doy), max(df$doy), "month")) +
  scale_y_continuous(label = percent_format()) +
  opts(legend.position = "none")
p

enter image description here