ggplot par new=TRUE 选项
Posted
技术标签:
【中文标题】ggplot par new=TRUE 选项【英文标题】:ggplot par new=TRUE option 【发布时间】:2020-11-27 10:02:20 【问题描述】:我正在尝试使用 ggplot 在一张图像中绘制 400 个 ecdf 图。 据我所知,ggplot 不支持 par(new=T) 选项。
所以我想到的第一个解决方案是使用 gridExtra 包中的 grid.arrange 函数。 但是,我生成的 ecdfs 是 for 循环格式。
以下是我的代码,但你可以忽略数据处理的步骤。
i=1
for(i in 1:400)
test<-subset(df,code==temp[i,])
test<-test[c(order(test$Distance)),]
test$AI_ij<-normalize(test$AI_ij)
AI = test$AI_ij
ggplot(test, aes(AI)) +
stat_ecdf(geom = "step") +
scale_y_continuous(labels = scales::percent) +
theme_bw() +
new_theme +
xlab("Calculated Accessibility Value") +
ylab("Percent")
所以我将值存储在 for 循环中的“AI”中。
在这种情况下,我应该如何在同一张图表中绘制 400 个图表?
【问题讨论】:
嗨云。你的意思是你想要 400 条线在同一个图上,还是你想要 400 条不同的图? @Allan Cameron 对于简短的解释,我深表歉意。我希望他们在同一个情节 【参考方案1】:这不是在 ggplot 上放置多行的方法。为此,将所有数据一起传递并将code
映射到“组”美学,为每个code
提供一个ecdf 行要容易得多。
到目前为止,回答这个问题最难的部分是尝试对您的数据集进行逆向工程。以下数据集在结构和命名上应该足够接近,以允许代码在您自己的数据上运行。
library(dplyr)
library(BBmisc)
library(ggplot2)
set.seed(1)
all_codes <- apply(expand.grid(1:16, LETTERS), 1, paste0, collapse = "")
temp <- data.frame(sample(all_codes, 400), stringsAsFactors = FALSE)
df <- data.frame(code = rep(all_codes, 100),
Distance = sqrt(rnorm(41600)^2 + rnorm(41600)^2),
AI_ij = rnorm(41600),
stringsAsFactors = FALSE)
由于您只希望 temp
中出现在 df
中的前 400 个代码显示在绘图上,因此您可以使用 dplyr::filter
过滤掉 code %in% test[[1]]
而不是遍历整个事物一次。
然后你可以group_by
编码,arrange
在每个组中 Distance
在规范化 AI_ij
之前,所以没有必要为每一行将你的数据框分割成一个新的子集:数据被处理一次完成,数据框保持在一起。
最后,您使用group
美学进行绘制。请注意,因为您在一个绘图上有 400 条线,所以您需要使每条线变暗以便更清楚地看到整体模式。我们通过在stat_ecdf
中将alpha
的值设置为0.05 来做到这一点
还要注意,有多个包带有一个名为normalize
的函数,我不知道您使用的是哪个包。我猜你在用BBmisc
所以你可以摆脱循环并做:
df %>%
filter(code %in% temp[[1]]) %>%
group_by(code) %>%
arrange(Distance, by_group = TRUE) %>%
mutate(AI = normalize(AI_ij)) %>%
ggplot(aes(AI, group = code)) +
stat_ecdf(geom = "step", alpha = 0.05) +
scale_y_continuous(labels = scales::percent) +
theme_bw() +
xlab("Calculated Accessibility Value") +
ylab("Percent")
【讨论】:
以上是关于ggplot par new=TRUE 选项的主要内容,如果未能解决你的问题,请参考以下文章
R语言ggplot2可视化:ggplot2可视化使用guide_axis(check.overlap=TRUE)选项删除重叠的轴文本跳过部分中间轴标签