r - ggplot2如何使散点图上的水平和垂直误差条具有相同大小且具有不同比例的轴

标签 r ggplot2 scatter-plot errorbar

我正在尝试制作在 x 轴和 y 轴上都有误差条的汇总散点图。我希望错误栏哈希大小相同。然而,因为我有不同比例的轴(例如海胆丰度与珊瑚生长率),所以我的误差条散列大小不同。

我已经利用 geom_errorbar()geom_errorbarh() 的“宽度”和“高度”参数来手动更改宽度和高度。但是,因为我有很多图形,所以我想看看是否有一种方法可以将误差条哈希编码为通常大小相同,以便我可以在具有不同轴的其他图形上使用此代码。

数据库

urchin_vs_growth_summary_data <- structure(list(Site_long = c("Waikiki", "Waikiki", "Hanauma Bay", 
"Hanauma Bay"), Treatment_long = c("Closed", "Open", "Closed", 
"Open"), growth_mean = c(1.60941173649527, 1.40241172055135, 
0.977166214960325, 1.99458408579477), growth_sd = c(0.685274483494003, 
0.7123570094737, 0.303273008779028, 1.00414981259471), growth_lower = c(1.41159003273825, 
1.18762800080554, 0.853355527582455, 1.58464164143337), growth_upper = c(1.80723344025229, 
1.61719544029716, 1.1009769023382, 2.40452653015617), urchin_mean = c(0.166666666666667, 
0.375, 3.66666666666667, 22.75), urchin_sd = c(0.372677996249965, 
0.414578098794425, 2.73353657780945, 17.3066701977398), urchin_lower = c(0.0590837959386828, 
0.255321611530458, 2.87756262714768, 17.7539946512794), urchin_upper = c(0.27424953739465, 
0.494678388469542, 4.45577070618566, 27.7460053487206), Shelter = structure(c(1L, 
2L, 1L, 2L), .Label = c("Low", "High"), class = "factor")), row.names = c(NA, 
-4L), groups = structure(list(Site_long = c("Hanauma Bay", "Waikiki"
), .rows = list(3:4, 1:2)), row.names = c(NA, -2L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))

海胆丰度与珊瑚生长图代码

urchin_vs_growth_plot <- ggplot(data = urchin_vs_growth_summary_data, 
                                aes(x = urchin_mean, y = growth_mean, 
                                    fill = interaction(Site_long, Shelter), 
                                    shape = interaction(Site_long, Shelter))) + 
  geom_point(aes(size = 5)) +
  ggtitle("Urchin Abundance vs. Coral Growth") +
  scale_x_continuous(breaks = seq(0,24,3)) +
  scale_y_continuous(breaks = seq(0, 3, 0.5)) +
  scale_shape_manual(name = 'Site x Shelter', values = c(21, 24, 21, 24), 
                     labels = c("Hanauma Bay - Low", "Waikiki - Low", 
                                "Hanauma Bay - High", "Waikiki - High")) +
  scale_fill_manual(name = "Site x Shelter", values = c(NA, NA, 1, 1), 
                    labels = c("Hanauma Bay - Low", "Waikiki - Low", 
                               "Hanauma Bay - High", "Waikiki - High")) +
  geom_smooth(aes(group = 1), method ="lm", show.legend = FALSE) +
  guides(size = FALSE, linetype = FALSE, 
         shape = guide_legend(override.aes = list(size = 4.5)), 
         color = guide_legend(override.aes = list(fill = NA))) +
  theme(text = element_text(size = 15)) +
  geom_errorbar(aes(ymin = growth_lower, ymax = growth_upper), width = 0.5) + 
  geom_errorbarh(aes(xmin = urchin_lower, xmax = urchin_upper), height = 0.5) +
  labs(x = "Mean urchin abundance ± SEM", 
       y = expression(paste("Mean coral growth (cm"^"2","/quarter) ± 95% SEM"))) +
  theme_bw() + 
  theme(panel.border = element_blank(), 
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(), 
        axis.line = element_line(colour = "black"), 
        axis.title = element_text(size = rel(1.5)), 
        axis.title.y = element_text(size = rel(1)), 
        axis.text = element_text(size = rel(1.5)), 
        axis.text.y = element_text(angle = 90), 
        legend.text = element_text(size = rel(1)), 
        legend.title = element_text(size = rel(1), face = "bold"), 
        legend.position = "none", 
        plot.title = element_text(size = 20, hjust = 0.5, vjust = -1.5)) 

enter image description here

我希望创建通用代码,使我能够将误差条散列缩放到我所有图形中的相同大小(大多数(如果不是全部)具有不同单位或比例的 x 和 y 轴)。感谢您的意见!

最佳答案

一种方法是创建绘图,提取 x 和 y 范围(如 here 所述),并根据这些范围缩放误差条散列。这将产生与图的整体纵横比成正比的散列;只有当情节本身是完全正方形时,水平和垂直散列才会完全相等。但是,如果您只是在寻找一种使散列看起来大致相似的方法,那可能就足够了。

创建绘图(没有误差线):

urchin_vs_growth_plot <- ggplot(data = urchin_vs_growth_summary_data, 
                                aes(x = urchin_mean, y = growth_mean, 
                                    fill = interaction(Site_long, Shelter), 
                                    shape = interaction(Site_long, Shelter))) + 
  geom_point(size = 5) +
  ggtitle("Urchin Abundance vs. Coral Growth") +
  scale_x_continuous(breaks = seq(0,24,3)) +
  scale_y_continuous(breaks = seq(0, 3, 0.5)) +
  scale_shape_manual(name = 'Site x Shelter', values = c(21, 24, 21, 24), 
                     labels = c("Hanauma Bay - Low", "Waikiki - Low", 
                                "Hanauma Bay - High", "Waikiki - High")) +
  scale_fill_manual(name = "Site x Shelter", values = c(NA, NA, 1, 1), 
                    labels = c("Hanauma Bay - Low", "Waikiki - Low", 
                               "Hanauma Bay - High", "Waikiki - High")) +
  geom_smooth(aes(group = 1), method ="lm", show.legend = FALSE) +
  guides(size = FALSE, linetype = FALSE, 
         shape = guide_legend(override.aes = list(size = 4.5)), 
         color = guide_legend(override.aes = list(fill = NA))) +
  theme(text = element_text(size = 15)) +
  labs(x = "Mean urchin abundance ± SEM", 
       y = expression(paste("Mean coral growth (cm"^"2","/quarter) ± 95% SEM"))) +
  theme_bw() + 
  theme(panel.border = element_blank(), 
        panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(), 
        axis.line = element_line(colour = "black"), 
        axis.title = element_text(size = rel(1.5)), 
        axis.title.y = element_text(size = rel(1)), 
        axis.text = element_text(size = rel(1.5)), 
        axis.text.y = element_text(angle = 90), 
        legend.text = element_text(size = rel(1)), 
        legend.title = element_text(size = rel(1), face = "bold"), 
        legend.position = "none", 
        plot.title = element_text(size = 20, hjust = 0.5, vjust = -1.5))

将散列宽度设置为 x 轴和 y 轴大小的二十分之一(当然可以根据需要调整实际值):

hash.width.x = diff(layer_scales(urchin_vs_growth_plot)$x$range$range) / 20
hash.width.y = diff(layer_scales(urchin_vs_growth_plot)$y$range$range) / 20

添加误差线:

urchin_vs_growth_plot = urchin_vs_growth_plot +
  geom_errorbar(aes(ymin = growth_lower, ymax = growth_upper), width = hash.width.x) +
  geom_errorbarh(aes(xmin = urchin_lower, xmax = urchin_upper), height = hash.width.y)

结果:

enter image description here

要对许多绘图执行此操作,您可以创建一个小函数来获取第一个绘图(没有误差线)、获取轴范围并适当添加误差线;然后将所有绘图包装在该函数中。

关于r - ggplot2如何使散点图上的水平和垂直误差条具有相同大小且具有不同比例的轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57583536/

相关文章:

javascript - 如何将 R 包 (DT) 中的数据表包含到另一个 HTML 文件中

r - 增加 ggplot2 中的绘图大小(宽度)

r - 使用 dplyr 计算 group_by 中的子组

r - 如何标准化面板数据框中选定的列

r - 在 ggplot2 中订购饼图切片

r - facet_grid问题: input string 1 is invalid in this locale?

r - 在 R ggplot 中将多边形对齐在一起

python - matplotlib的散点图改变了另一个图的轴

javascript - 带标签的 React Native 散点图

python - matplotlib - 如何指定 x 轴的比例