如何在R中将ggplot2 x轴可读性分为300个月分成60组

r ggplot2 split axis

74 观看

1回复

15 作者的声誉

我一直在搜索2或3天,试图为我的问题找到解决方案,但没有成功。如果这真的很容易或已经存在,我对此表示歉意,但我找不到它。我有3个数据帧,长度在1到300之间变化。它只能在ggplot x轴上显示约60个值,而不会变得不可读,并且我不想忽略这些值,因此,我尝试查找一种计算每个数据帧有多长时间并将其分成不超过60个的“ x”图的方法。

到目前为止,我已经尝试过:facet_grid,facet_wrap,transform和split。“拆分”可以很好地拆分数据,但是添加了“ X1”。“ X2。” ...“ Xn。” 到变量名的前面(其中n是将数据拆分为的分区数)。因此,当我调用ggplot2时,它找不到我的原始变量名(“ Cost”和“ Month”),因为它们看起来像X1.Cost X1.Month,X2.Cost等...如何解决此问题?

我乐于接受任何建议,尤其是如果我可以解决这两个问题(不要一次将代码硬编码为60行,也不能分解为具有较小x轴范围的图形)。在此先感谢您的耐心配合和帮助。

斯蒂芬妮(绝望的研究生)

这是一些存根代码:

```{r setup, include=FALSE}
xsz <- 60 # would like not to have to hardcode this
ix1 <- seq(1:102) # would like to break into 2 or 3 approx equal graphs #
fcost <- sample(0:200, 102)
f.df <- data.frame("Cost" = fcost, "Month" = ix1)
fn <- nrow(f.df)
fr  <- rep(1:ceiling(fn/xsz),each=xsz)[1:fn]
fd <- split(f.df,fr)
fc <- numeric(length(fd))
for (i in 1:length(fd)){
  print(ggplot(as.data.frame(fd[i]), aes(Month, Cost)) +
    geom_line(colour = "darkred", size = .5) +
    geom_point(colour = "red", size = 1) +
    labs(x = "Projected Future Costs (monthly)", y = "Dollars") +
    theme_bw() +
    theme(plot.title = element_text(hjust = 0.5)) +
    theme(axis.text.x = element_text(angle = 60, vjust = .6))) 
}
```

当我运行它时,我得到:eval(expr,envir,enclos)错误:找不到对象'Month'

当我这样做时:名称(as.data.frame(fd [1]))

我得到:[1]“ X1.Cost”“ X1.Month”

作者: Stephanie Moore 的来源 发布者: 2017 年 3 月 11 日

回应 1


0

12986 作者的声誉

决定

使用[[]]的列表。

  print(ggplot(as.data.frame(fd[[i]]), aes(Month, Cost)) +

要回答您的其他问题,您必须创建一个带有绘图编号的新变量。我在这里使用rep

f.df$plot_number <-rep(1:round(nrow(f.df)/60),each=60,len=nrow(f.df))

然后,您在循环中创建一个绘图列表

plots <- list()  # new empty list
for (i in unique(f.df$plot_number)) {
 p = ggplot(f.df[f.df$plot_number==i,], aes(Month, Cost))   +
 geom_line(colour = "darkred", size = .5) +
 geom_point(colour = "red", size = 1) +
 labs(x = "Projected Future Costs (monthly)", y = "Dollars") +
 theme_bw() +
 theme(plot.title = element_text(hjust = 0.5)) +
 theme(axis.text.x = element_text(angle = 60, vjust = .6))
 plots[[paste0("p",i)]] <- p  # add each plot into plot list
}

使用package gridExtra,您可以将地块布置成一个。

    library(gridExtra)
    do.call("grid.arrange", c(plots, ncol=1))

在此处输入图片说明

作者: Pierre Lapointe 发布者: 2017 年 3 月 11 日
32x32