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")
我正在尝试使用 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
.
到目前为止,回答这个问题最难的部分是试图对您的数据集进行逆向工程。以下数据集在结构和命名上应该足够接近,以允许代码 运行 在您自己的数据上。
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")