r - 在循环的 ggplot 中定义 xlim 并可视化重叠变量
问题描述
我想循环我的数据两次以获得以下图集:
一种包括彼此相似且具有不同垂直误差线的背景值。在这种情况下,它们相互重叠,我无法区分它们,这在另一个图形程序中是可能的。geom_jitter
并position_dodge
没有帮助。我想清楚地看到所有背景值及其误差线。
另一个不包括背景值。我想为每个循环图应用一个变化的 x 限制。
一个 csv 的 dput 数据类似于我的实际数据:
structure(list(Al = c(14000, 23000, NA, 13400, 13400, 12000,
NA, NA, 0.005), Co = c(NA, 56.7, 34.2, 180, NA, NA, NA, 25, 0.005
), Mg = c(24, 200, 90, NA, NA, 123, 98, NA, 0.005), a1 = c(0.05,
0.12, 0.09, NA, 0.07, NA, NA, NA, NA), a2 = c(NA, NA, NA, 0.01,
0.07, 1.08, 0.05, NA, NA), a3 = c(0.4, 1.2, 0.3, 1.1, 0.7, 1.5,
0.25, 0.78, NA), bg_a1 = c(NA, NA, NA, NA, NA, NA, NA, NA, 0.002
), bg_a2 = c(NA, NA, NA, NA, NA, NA, NA, NA, 0.003), bg_a3 = c(NA,
NA, NA, NA, NA, NA, NA, NA, 0.002), err_a1 = c(NA, NA, NA, NA,
NA, NA, NA, NA, 0.0013), err_a2 = c(NA, NA, NA, NA, NA, NA, NA,
NA, 0.007), err_a3 = c(NA, NA, NA, NA, NA, NA, NA, NA, 0.003)), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -9L), spec = structure(list(
cols = list(Al = structure(list(), class = c("collector_double",
"collector")), Co = structure(list(), class = c("collector_double",
"collector")), Mg = structure(list(), class = c("collector_double",
"collector")), a1 = structure(list(), class = c("collector_double",
"collector")), a2 = structure(list(), class = c("collector_double",
"collector")), a3 = structure(list(), class = c("collector_double",
"collector")), bg_a1 = structure(list(), class = c("collector_double",
"collector")), bg_a2 = structure(list(), class = c("collector_double",
"collector")), bg_a3 = structure(list(), class = c("collector_double",
"collector")), err_a1 = structure(list(), class = c("collector_double",
"collector")), err_a2 = structure(list(), class = c("collector_double",
"collector")), err_a3 = structure(list(), class = c("collector_double",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1), class = "col_spec"))
示例数据:
~Al, ~Co, ~Mg, ~a1, ~a2, ~a3, ~bg_a1, ~bg_a2, ~bg_a3, ~err_a1, ~err_a2, ~err_a3,
14000, NA, 24, 0.05, NA, 0.4, NA, NA, NA, NA, NA, NA,
23000, 56.7, 200, 0.12, NA, 1.2, NA, NA, NA, NA, NA, NA,
NA, 34.2, 90, 0.09, NA, 0.3, NA, NA, NA, NA, NA, NA,
13400, 180, NA, NA, 0.01, 1.1, NA, NA, NA, NA, NA, NA,
13400, NA, NA, 0.07, 0.07, 0.7, NA, NA, NA, NA, NA, NA,
12000, NA, 123, NA, 1.08, 1.5, NA, NA, NA, NA, NA, NA,
NA, NA, 98, NA, 0.05, 0.25, NA, NA, NA, NA, NA, NA,
NA, 25, NA, NA, NA, 0.78, NA, NA, NA, NA, NA, NA,
0.005, 0.005, 0.005, NA, NA, NA, 0.002, 0.003, 0.002, 0.0013, 0.007, 0.003
还有我的代码,当我想要第二组具有可变 x 限制的图时,其中的背景值及其误差条被注释掉:
library(tidyverse)
library(ggpubr)
library(scales)
ref <- read_csv("test.csv")
ref1 <- ref %>%
gather(s_type,s_all,a1,a2,a3) %>%
gather(bg_type,bg_all,bg_a1,bg_a2,bg_a3) %>%
gather(err_type,err_all,err_a1,err_a2,err_a3)
acq <- select(ref1, Al:Mg)
lower <- ref1$bg_all-ref1$err_all
upper <- ref1$bg_all+ref1$err_all
label <- c('a1','a2','a3',
'a1 bg','a2 bg','a3 bg')
for (ii in seq_along(colnames(acq))) {
current_col <- colnames(acq)[ii]
print(paste0('Plot col: ', current_col))
## plot ##
g <- ggplot(ref1, aes_string(x=acq[[current_col]], y='s_all',
colour='s_type', group='s_type', shape='s_type'),
pseudo_log_trans(), ylim=c(0,1.5))+
geom_point(na.rm= FALSE)+
geom_smooth(aes_string(x=acq[[current_col]], y='s_all', colour='s_type'),
method='lm', formula= y ~ x, show.legend = FALSE, se=FALSE) +
stat_cor(method = "pearson", label.x = 3,show.legend = FALSE) +
# geom_point(aes_string(x=acq[[current_col]], y='bg_all',colour='bg_type',shape='bg_type'),
# na.rm = FALSE)+
# geom_errorbar(mapping=aes(ymin=lower,ymax=upper), show.legend = FALSE) +
scale_color_manual("", values = c('royalblue', 'seagreen','tomato',
'royalblue', 'seagreen','tomato'),
labels= label) +
scale_shape_manual("", values=c(16,16,16,
0,0,0),labels= label) +
scale_size_manual("", values = c(3,3,3,
3,3,3)) +
labs(y="a", x=paste(current_col,"(g)")) +
theme(axis.text.x = element_text( size = 12),
axis.text.y = element_text(size = 12),
axis.title.y = element_text(size = 15),
axis.title.x = element_text(size = 15))
ggsave(g,file=paste0("plot_",current_col,".pdf"))
print(g)
#dev.off()
}
谢谢你。
解决方案
这会做。我已将子集和 xlim 的代码添加到您的原始代码中。
for (ii in seq_along(colnames(acq))) {
ref2 <- ref1[complete.cases(ref1$s_all),]
current_col <- colnames(acq)[ii]
print(paste0('Plot col: ', current_col))
## plot ##
g <- ggplot(ref1, aes_string(x=acq[[current_col]], y='s_all',
colour='s_type', group='s_type', shape='s_type'),
pseudo_log_trans())+
ylim(c(0,1.5))+
xlim(min(ref2[[current_col]], na.rm = TRUE), max(ref2[[current_col]], na.rm = FALSE)) +
geom_point(na.rm= FALSE)+
geom_smooth(aes_string(x=acq[[current_col]], y='s_all', colour='s_type'),
method='lm', formula= y ~ x, show.legend = FALSE, se=FALSE) +
stat_cor(method = "pearson", show.legend = FALSE) +
# geom_point(aes_string(x=acq[[current_col]], y='bg_all',colour='bg_type',shape='bg_type'),
# na.rm = FALSE)+
# geom_errorbar(mapping=aes(ymin=lower,ymax=upper), show.legend = FALSE) +
scale_color_manual("", values = c('royalblue', 'seagreen','tomato',
'royalblue', 'seagreen','tomato'),
labels= label) +
scale_shape_manual("", values=c(16,16,16,
0,0,0),labels= label) +
scale_size_manual("", values = c(3,3,3,
3,3,3)) +
labs(y="a", x=paste(current_col,"(g)")) +
theme(axis.text.x = element_text( size = 12),
axis.text.y = element_text(size = 12),
axis.title.y = element_text(size = 15),
axis.title.x = element_text(size = 15))
ggsave(g,file=paste0("plot_",current_col,".pdf"))
print(g)
#dev.off()
}
推荐阅读
- java - 使用接口的客户端-服务器连接
- java - Java 11 Spring Boot java.lang.ClassNotFoundException:com.sun.xml.ws.api.server.SDDocumentSource$3
- javascript - 可以在 IF 语句中从函数声明变量吗?
- javascript - Firebase 身份验证错误“给定的登录提供程序已禁用”
- android - 如何使用编辑文本计算 Android 应用程序中的年龄
- css - 自定义具体化 CSS 样式
- java - 合并热通量源
- java - 如何在 ScalaFX/JavaFX 中有效地绘制连续函数
- django-models - 创建用户模型?form.is_valid 总是返回 false
- netlogo - 如何在 NetLogo 3D 中使用“pen-down”修复减速?