首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ggforce/ggplus在多个页面上保存facet_wrap()

使用ggforce/ggplus在多个页面上保存facet_wrap()
EN

Stack Overflow用户
提问于 2017-08-03 05:05:06
回答 1查看 4.8K关注 0票数 1

我用下面的代码得到了这幅图

代码语言:javascript
复制
library(tidyverse)
ggplot(df2, aes(x =Date, y = Sales, color = id))+ 
  geom_line(size = 0.01, alpha = 0.3)+
  +facet_wrap(~id)
  scale_x_date(breaks = seq(as.Date("2001-01-01"),
                            as.Date("2007-01-01"), by="1 year"),
               labels = date_format("%Y"))

在我的原始数据中,我有30个级别的id。如果我把所有的面都画在一页上,就会很乱,也很难读懂。因此,我希望有一个情节类似于上面的情节,但只有4个方面在每一页,以便它将是可读的。

我是用ggplus软件包来这么做的。

代码语言:javascript
复制
#devtools::install_github("guiastrennec/ggplus")
library(ggplus)
p <- ggplot(df2, aes(x =Date, y = Sales))+ 
  geom_line(size = 0.01, alpha = 0.3)+
  scale_x_date(breaks = seq(as.Date("2001-01-01"),
                            as.Date("2007-01-01"), by="1 year"),
               labels = date_format("%Y"))

facet_multiple(plot = p, 
               facets = "id", 
               ncol = 2, 
               nrow = 2)

如果没有NA,它可以正常工作,我得到了两页的情节。但是,由于我的数据有NAs,所以我得到了这个错误。

在if (zero_range(范围)){:在需要TRUE/FALSE时丢失值时出错

如果有任何建议来纠正这个错误,我将不胜感激。

数据

代码语言:javascript
复制
Date <- as.Date(c(seq(as.Date("2001-01-03"), as.Date("2006-10-17"), by = 1), 
                  seq(as.Date("2001-05-10"), as.Date("2006-12-17"), by = 1),  
                  seq(as.Date("2001-04-12"), as.Date("2006-11-17"), by = 1),
                  seq(as.Date("2001-03-12"), as.Date("2006-10-12"), by = 1),
                  seq(as.Date("2001-01-12"), as.Date("2006-11-03"), by = 1),
                  seq(as.Date("2001-03-11"), as.Date("2006-10-21"), by = 1),
                  seq(as.Date("2001-02-14"), as.Date("2006-11-25"), by = 1),
                  seq(as.Date("2001-04-22"), as.Date("2006-12-27"), by = 1)))
id  <- c(rep("AAA", 2114), rep("BBB", 2048), rep("CCC", 2046), rep ("DDD", 2041), rep ("EEE", 2122), rep ("FFF", 2051), rep ("GGG", 2111) , rep ("HHH", 2076))
Sales <- c(sample(10:20, 2114, replace = T), sample(50:60, 2048, replace = T), sample(80:90, 2046, replace = T), sample(80:90, 2041, replace = T),
           sample(12:70, 2122, replace = T), sample(30:90, 2051, replace = T), sample(15:70, 2111, replace = T), sample(100:120, 2076, replace = T))
df <- data.frame(id , Date, Sales)

df1 <- df[c(1:50, 1050:2000, 3000:3600, 4000:4350, 6000:6400, 9000:9700, 10456:11254, 12000:12850, 14500:15200),] %>% 
  tidyr::spread(id, Sales)

df2 <- data.frame(Date = seq(as.Date("2001-01-01"), as.Date("2006-12-31"), by = 1)) %>% 
  dplyr::left_join(., df1, by ="Date") %>% 
  tidyr::gather("id", "Sales", 2:9) 

更新

我尝试使用ggforce::facet_wrap_paginate在许多页面上绘制方面。

下面的部分代码是从ggforce手册 (第5页)和这个问题获得的。

代码语言:javascript
复制
n_pages_needed_df2 <- ceiling(
  length(levels(df2$id)) * length(levels(df2$id)) / 4
)


for (i in seq_len(n_pages_needed_df2)) {
  pl<-ggplot(df2, aes(x =Date, y = Sales , color = id))+ 
    geom_line(size = 0.2, alpha = 0.3)+
    scale_x_date(breaks = seq(as.Date("2001-01-01"),
                              as.Date("2007-01-01"), by="1 year"),
                 labels = date_format("%Y"))+
    facet_wrap_paginate(~id, ncol = 2, nrow = 2, page = i,
                        strip.position="top", scales="free_y")
  ggsave(paste("fig-", i, ".png", sep=""), height = 5.8, width = 10.04 , dpi = 600)
}

它运行得很好,我得到了以下两个.png图(我宁愿将它保存为.png,因为将它导入Microsoft将更容易/更快)。

第一地块

第二地块

然而,它导致了第三个空白的地块和这些错误。

矩阵中的错误(list(zeroGrob()),nrow = nrow,ncol = ncol): 无效的'nrow‘值(太大或NA),此外:警告消息: 1:删除了包含缺失值的6681行(geom_path)。2:删除了包含缺失值的6681行(geom_path)。3:删除了包含缺失值的6681行(geom_path)。4: In min(布局$ROW):不丢失参数给min;返回Inf 5: In max(布局$COL):不丢失参数到max;返回-Inf 6: In max(布局$行):不丢失参数到max;返回-Inf 7: In矩阵(列表(zeroGrob()),nrow =nrow= nrow,ncol = ncol):NAs被强制到整数范围。

我对如何纠正这些错误有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2017-08-03 05:39:16

移除NAs效果很好:

代码语言:javascript
复制
library(ggplus)
df2 <- df2[!is.na(df2$Sales),]
pdf("C:\\1\\test.pdf", 7, 5)
p <- ggplot(df2, aes(x =Date, y = Sales)) +
  geom_line(aes(colour=id),size = 0.01)+
  scale_x_date(breaks = seq(as.Date("2001-01-01"),
                            as.Date("2007-01-01"), by="1 year"),
               labels = date_format("%Y"))
facet_multiple(plot = p, facets = 'id', ncol = 2, nrow = 2)
dev.off()

PS:另一个选项是使用gridExtra包。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45475249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档