Сохраните facet_wrap() на нескольких страницах, используя ggforce/ggplus
Я получил этот участок, используя код ниже
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 для этого.
#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, он работает нормально, и я получил сюжет на двух страницах. Однако, поскольку у моих данных есть NA, я получил эту ошибку
Ошибка в if (zero_range(range)) {: отсутствует значение там, где требуется TRUE/FALSE
Я буду признателен за любые предложения, чтобы исправить эту ошибку.
ДАННЫЕ
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) и этого вопроса.
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 Office).
первый сюжет
второй сюжет
Тем не менее, это привело к третьему пустому графику и эти ошибки
Ошибка в матрице (список (zeroGrob ()), nrow = nrow, ncol = ncol):
недопустимое значение 'nrow' (слишком большое или NA). Дополнительно: Предупреждающие сообщения: 1: удалено 6681 строка, содержащая пропущенные значения (geom_path). 2: Удалено 6681 строка, содержащая пропущенные значения (geom_path). 3: Удалено 6681 строка, содержащая пропущенные значения (geom_path). 4: в мин (макет $ROW): нет не пропущенных аргументов мин; возврат Inf 5: в max(макет $COL): нет не пропущенных аргументов для max; возвращение -Inf 6: в max(макет $ROW): нет не пропущенных аргументов для max; return -Inf 7: в матрице (list(zeroGrob()), nrow = nrow, ncol = ncol): NA введены путем принуждения к целочисленному диапазону
Любые предложения, как я могу исправить эти ошибки?
1 ответ
Удаление NA работает хорошо:
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.