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语言数据可视化1—ggplot2画柱状图

在R中用ggplot和par绘制两个图

R语言ggplot2可视化:ggplot2可视化使用guide_axis(check.overlap=TRUE)选项删除重叠的轴文本跳过部分中间轴标签

R语言-ggplot初级

使用 ggmap 和 ggplotly

ggplot2的默认字体是啥