ggplot par new=TRUE 选项

ggplot par new=TRUE option

我正在尝试使用 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 个图形?

这不是在 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 编码,并在规范化 AI_ij 之前通过 Distance 在每个组中 arrange,因此无需将您的数据帧拆分为每行的新子集:一次处理所有数据并将数据帧保持在一起。

最后,您使用 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")