首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ggplot new=TRUE选项

ggplot new=TRUE选项
EN

Stack Overflow用户
提问于 2020-11-27 18:02:21
回答 1查看 191关注 0票数 0

我正在尝试使用ggplot在一张图片中绘制400张ecdf图。据我所知,ggplot不支持par(new=T)选项。

因此,我想到的第一个解决方案是使用gridExtra包中的grid.arrange函数。但是,我生成的ecdf是for loop格式的。

下面是我的代码,但您可以忽略数据处理的步骤。

代码语言:javascript
复制
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个图表?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-27 18:39:53

这不是在ggplot上放置多行的方法。要做到这一点,将所有数据一起传递,并将code映射到“组”美学,为每个code提供一条ecdf行,这要容易得多。

到目前为止,回答这个问题最困难的部分是试图对您的数据集进行逆向工程。下面的数据集应该在结构和命名上足够接近,以便允许代码在您自己的数据上运行。

代码语言:javascript
复制
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

因此,您可以摆脱循环并执行以下操作:

代码语言:javascript
复制
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")

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65035343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档