R:ggplot和for循环,scale_x_date先覆盖一个

时间:2015-12-28 13:36:51

标签: r ggplot2

我正在使用一个简单的ggplot函数,但是scales_x_date工作正常。为什么会这样?

这是我的代码

out <- list(NULL)
datess <- seq(as.Date("1984-01-01"), as.Date("2014-01-01"), by="year")
for(i in 1:5){
  tokyosunt <- sunt[(1+2190*(i-1)):(2190*i), 8]
  dates <- c(datess[(1+6*(i-1)):(6*i)], datess[6*i+1]-1)
  out[[i]] <- ggplot(tokyosunt, aes(x=index(tokyosunt), y=Tokyo)) +
    xlab("") +
    scale_x_date(breaks=dates, labels=date_format("%Y/%m/%d")) +
    ylab("") + 
    geom_line()
}  

png(filename="[3]dailytokyo.png", width = 750, height = 1000, units = "px", pointsize = 12)
grid.arrange(out[[1]],out[[2]],out[[3]],out[[4]],out[[5]],
             ncol=1, nrow=5, left="daily")

dev.off()

“sunt”是xts型数据框,形式为“1984-01-01”到“2014-12-31”。

此代码有效,但未显示out[[1]]out[[2]]out[[3]]的比例。在out[[4]]中,只显示了第一个scale(2007-12-31)。通常显示out[[5]]的比例。

我认为scales_x_date会覆盖之前的out[[2]]覆盖out[[1]]覆盖out[[3]]out[[2]]覆盖multiSelectParticipant = $("#select_multi_participant").kendoMultiSelect({ autoBind: true, dataTextField: "details", dataValueField: "resource_id", filter: "contains", dataSource: resources, itemTemplate: '#= details #', tagTemplate: '#= resource_name #', select: onSelect, change: function (e) { multiParticipants = this.value(); isMultiParticipantsChange = true; }, }).data("kendoMultiSelect"); $("#txtGroupCapicity").change(function () { groupCapicity = $("#txtGroupCapicity").val(); $("#select_multi").data("kendoMultiSelect").options.maxSelectedItems = (groupCapicity - 1); }); function onSelect(e) { resourceTooltip = e.sender.wrapper.kendoTooltip({ position: "top", content: e.item.text(), autoHide: true, width: 250, height: 20, animation: { duration: 0 } } ); } ,依此类推。我错过了什么?我该如何纠正呢?

2 个答案:

答案 0 :(得分:2)

我喜欢弄清楚人们在做什么,但这个问题很艰难。我玩你的代码得到了:

library(ggplot2)
library(scales)
library(gridExtra)
library(zoo)

ncol <- 8
nrow <- 5*2190
sunt <- data.frame(matrix(rnorm(ncol*nrow),nrow,ncol))

out <- list(NULL)
datess <- seq(as.Date("1984-01-01"), as.Date("2014-01-01"), by="year")
for(i in 1:5){
  tokyosunt <- data.frame(sunt[(1+2190*(i-1)):(2190*i), 8])
  names(tokyosunt) <- "Tokyo"
  tokyosunt$x <- as.Date(index(tokyosunt)*5,origin=as.Date("1984-01-01"))
  dates <- c(datess[(1+6*(i-1)):(6*i)], datess[6*i+1]-1)
  out[[i]] <- ggplot(tokyosunt, aes(x=x, y=Tokyo)) +
    xlab("") +
    scale_x_date(breaks=dates, labels=date_format("%Y/%m/%d")) +
    ylab("") + 
    geom_line() +
    theme(axis.text.x = element_text(angle=-45,hjust=-0.1))
}  

#png(filename="[3]dailytokyo.png", width = 750, height = 1000, units = "px",
                                                               pointsize = 12)
grid.arrange(out[[1]],out[[2]],out[[3]],out[[4]],out[[5]],
             ncol=1, nrow=5, left="daily")

#dev.off()

这给了我这个。哪个没有错误,可能是也可能不是你想要的:

enter image description here

答案 1 :(得分:1)

似乎你想要将6年的时间序列绘制在彼此之下。如果对先前计算的timespans因子使用facet_wrap,则代码会减少到几行:

library(ggplot2)
library(scales)
library(xts)

set.seed(123)
sunt <- as.xts(rnorm(10958), seq(as.Date("1984-01-01"), as.Date("2014-01-01")-1,by="days"))
names(sunt) <- "Tokyo"

# Divide the time-series into 6 year periods
sunt$period <- cut(x = time(sunt), breaks = "6 years")

ggplot(sunt, aes(x = index(sunt), y = Tokyo)) + xlab("") + ylab("") + geom_line() +
  scale_x_date(labels = date_format("%Y/%m/%d")) +
  facet_wrap(~period, scales = "free_x", ncol = 1) +
  theme(strip.background = element_blank(), strip.text = element_blank())

enter image description here

如果您使用cut对时间序列进行细分,那么您可以从闰年中获益,这似乎是您错过的事情(1984年至2014年间有8个闰年)。