r - 在 R ggplot 的每个方面生成一个插图,同时保留原始方面内容的颜色
问题描述
我想生成一个图形,将图形的四个方面与每个方面的插图相结合,显示相应图的详细信息。这是我尝试过的事情之一:
#create data frame
n_replicates <- c(rep(1:10,15),rep(seq(10,100,10),15),rep(seq(100,1000,100),15),rep(seq(1000,10000,1000),15))
sim_years <- rep(sort(rep((1:15),10)),4)
sd_data <- rep (NA,600)
for (i in 1:600) {
sd_data[i]<-rnorm(1,mean=exp(0.1 * sim_years[i]), sd= 1/n_replicates[i])
}
max_rep <- sort(rep(c(10,100,1000,10000),150))
data_frame <- cbind.data.frame(n_replicates,sim_years,sd_data,max_rep)
#do first basic plot
library(ggplot2)
plot1<-ggplot(data=data_frame, aes(x=sim_years,y=sd_data,group =n_replicates, col=n_replicates)) +
geom_line() + theme_bw() +
labs(title ="", x = "year", y = "sd")
plot1
#make four facets
my_breaks = c(2, 10, 100, 1000, 10000)
facet_names <- c(
`10` = "2, 3, ..., 10 replicates",
`100` = "10, 20, ..., 100 replicates",
`1000` = "100, 200, ..., 1000 replicates",
`10000` = "1000, 2000, ..., 10000 replicates"
)
plot2 <- plot1 +
facet_wrap( ~ max_rep, ncol=2, labeller = as_labeller(facet_names)) +
scale_colour_gradientn(name = "number of replicates", trans = "log",
breaks = my_breaks, labels = my_breaks, colours = rainbow(20))
plot2
#extract inlays (this is where it goes wrong I think)
library(ggpmisc)
library(tibble)
library(dplyr)
inset <- tibble(x = 0.01, y = 10.01,
plot = list(plot2 +
facet_wrap( ~ max_rep, ncol=2, labeller = as_labeller(facet_names)) +
coord_cartesian(xlim = c(13, 15),
ylim = c(3, 5)) +
labs(x = NULL, y = NULL, color = NULL) +
scale_colour_gradient(guide = FALSE) +
theme_bw(10)))
plot3 <- plot2 +
expand_limits(x = 0, y = 0) +
geom_plot_npc(data = inset, aes(npcx = x, npcy = y, label = plot)) +
annotate(geom = "rect",
xmin = 13, xmax = 15, ymin = 3, ymax = 5,
linetype = "dotted", fill = NA, colour = "black")
plot3
如您所见,插图中的颜色是错误的,尽管我当然只想要相应的插图,但它们都出现在每个方面。我在这里阅读了很多问题(甚至让我走到了这一步)以及 ggpmisc 用户指南中的一些示例,但不幸的是,我仍然对如何实现我想要的有点迷茫。除了可能通过手动提取四个插图然后将它们与 plot2 结合来完成。但我希望会有更好的方法来做到这一点。感谢您的帮助!
编辑:由于这个答案,现在更好的图形,但问题仍然部分未解决:
下面的代码做了很好的插图,但不幸的是颜色没有被保留。与上述版本一样,每个插图都重新生成自己的彩虹色,而不是从它所属的刻面继承部分彩虹比例。有谁知道为什么以及如何改变这一点?在评论中,我提出了另一个(不好的)尝试来解决这个问题,它保留了颜色,但存在将所有四个插图都放在每个方面的问题。
library(ggpmisc)
library(tibble)
library(dplyr)
# #extract inlays: good colours, but produces four insets.
# fourinsets <- tibble(#x = 0.01, y = 10.01,
# x = c(rep(0.01, 4)),
# y = c(rep(10.01, 4)),
# plot = list(plot2 +
# facet_wrap( ~ max_rep, ncol=2) +
# coord_cartesian(xlim = c(13, 15),
# ylim = c(3, 5)) +
# labs(x = NULL, y = NULL, color = NULL) +
# scale_colour_gradientn(name = "number of replicates", trans = "log", guide = FALSE,
# colours = rainbow(20)) +
# theme(
# strip.background = element_blank(),
# strip.text.x = element_blank()
# )
# ))
# fourinsets$plot
library(purrr)
pp <- map(unique(data_frame$max_rep), function(x) {
plot2$data <- plot2$data %>% filter(max_rep == x)
plot2 +
coord_cartesian(xlim = c(12, 14),
ylim = c(3, 4)) +
labs(x = NULL, y = NULL) +
theme(
strip.background = element_blank(),
strip.text.x = element_blank(),
legend.position = "none",
axis.text=element_blank(),
axis.ticks=element_blank()
)
})
#pp[[2]]
inset_new <- tibble(x = c(rep(0.01, 4)),
y = c(rep(10.01, 4)),
plot = pp,
max_rep = unique(data_frame$max_rep))
final_plot <- plot2 +
geom_plot_npc(data = inset_new, aes(npcx = x, npcy = y, label = plot, vp.width = 0.3, vp.height =0.6)) +
annotate(geom = "rect",
xmin = 12, xmax = 14, ymin = 3, ymax = 4,
linetype = "dotted", fill = NA, colour = "black")
#final_plot
final_plot 然后看起来像这样:
我希望这能稍微澄清一下这个问题。任何想法都非常受欢迎:)
解决方案
修改@user63230 的优秀答案:
pp <- map(unique(data_frame$max_rep), function(x) {
plot2 +
aes(alpha = ifelse(max_rep == x, 1, 0)) +
coord_cartesian(xlim = c(12, 14),
ylim = c(3, 4)) +
labs(x = NULL, y = NULL) +
scale_alpha_identity() +
facet_null() +
theme(
strip.background = element_blank(),
strip.text.x = element_blank(),
legend.position = "none",
axis.text=element_blank(),
axis.ticks=element_blank()
)
})
解释:
- 我们没有过滤传递给 plot2 的数据(这会影响颜色的映射),而是强加了一种新的审美
alpha
,其中属于其他复制编号的线条被分配为 0 以表示透明度; - 用于
scale_alpha_identity()
告诉 ggplot alpha 映射将按原样使用:即 1 表示 100%,0 表示 0%。 - 添加
facet_null()
以覆盖 plot2 的现有facet_wrap
,这将删除插图的刻面。
其他所有内容都与问题中的代码相同。
推荐阅读
- typescript - TypeScript 将接口映射到文字类型
- php - Exif 数据不旋转图像 php
- python - OpenCV - 如何在特征匹配后将搜索到的图像绘制在目标图像之上?
- laravel - Laravel 集合按小时分组
- iis - IIS 10 应用程序池在回收后初始化时间很慢
- docker - 在带有 docker 的 unfs3 中使用 mount 命令时出现问题
- cassandra - 最大限度地减少非规范化数据库(如 Cassandra)中表之间的不一致
- spring-boot - 我在 Spring Boot 中使用 websocket,但数据库没有读取数据库的当前状态
- jmeter - 即使响应状态代码为 200,Jmeter 断言也会失败
- javascript - ASYNC / AWAIT SyntaxError: await 仅在异步函数和模块的顶层主体中有效