我正在尝试使用ggplot在一张图片中绘制400张ecdf图。据我所知,ggplot不支持par(new=T)选项。
因此,我想到的第一个解决方案是使用gridExtra包中的grid.arrange函数。但是,我生成的ecdf是for loop格式的。
下面是我的代码,但您可以忽略数据处理的步骤。
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个图表?
发布于 2020-11-27 18:39:53
这不是在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)因为您只希望在绘图中显示出现在df中的来自temp的前400个代码,所以可以使用dplyr::filter过滤掉code %in% test[[1]],而不是一次只迭代一个元素。
然后,您可以在标准化Distance之前在每个组中group_by代码和arrange by 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")

https://stackoverflow.com/questions/65035343
复制相似问题