微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用两个不同的因素对包裹图进行分面

如何解决如何使用两个不同的因素对包裹图进行分面

例如,我有两个试验,每个试验都有年份和治疗的主要因素。 我想绘制对同一情节的反应,最好是试验一/治疗/年,试验 2 也是如此。 我能得到的最接近的显示在简单的示例图片中。基本上,我将两张图连接在一起,一张图显示试验 1 和试验 2 中的治疗效果,y 轴代表内容,另一张图显示试验 1 和试验 2 中年份的效果,y 轴代表相同的内容

Simple example of plot with Si content affected by treatments and year of sampling

是否可以将图形分面包装在一起,或者至少可以删除多余的 y 轴?

我使用的代码是:

a <- ggplot(I1,aes(x=fct_reorder(SIstem,ORDER),y=Si)) + geom_jitter(show.legend=FALSE,width=0.25,color="black",size=0.5) + stat_summary(fun.data = mean_cl_normal,show.legend=FALSE,color="red",size=0.3) + labs(x=NULL,y="Si (mg / 100 g)") + facet_wrap(~POSKUS,ncol=2,scales="free_x") + theme_classic(base_family = "Palatino Linotype") + theme(axis.text=element_text(colour="black",size=8),axis.title=element_text(colour="black",axis.text.x=element_text(angle=45,vjust = 1,hjust=1)) + theme(strip.background = element_blank()) + ggplot(I1,aes(x=Leto,size=0.5) + scale_x_continuous(breaks=c(2016,2017)) + stat_summary(fun.data = mean_cl_normal,y="") + facet_wrap(~POSKUS + Leto,ncol=4,hjust=1)) +  theme(strip.background = element_blank())`

下面给出的解决方案仍然需要一些小的调整。 使用提供的代码,并根据需要对其进行扩展以对处理进行排序,并更改 facet wrap 中变量的顺序,提供了如图 2 所示的图。但是,facet 标签现在仅显示 1 和 2,而不是试验 1 和试验 2。此外,对于 TREATMENT 和 YEAR 变量,是否可能只有一个试验 1 和试验 2 名称

Plot using the code as proposed

添加dput:

I2 <- structure(list(Leto = c("2016","2016","2017","2016"),POSKUS = structure(c(1L,1L,2L,2L),.Label = c("Trial 1","Trial 2"),class = "factor"),SIstem = structure(c(5L,5L,3L,4L,6L,7L,8L,9L),.Label = c("Manure-N0","Manure-N1","Manure-N2","Manure-N3","No.org-N0","No.org-N3","Straw-N0","Straw-N1","Straw-N2","Straw-N3"),ORDER = c(1,1,2,3,4,5,3),DUSIK = c(0,55,110,165,110),Si = c(9.35,11.6,9.71,8.96,6.13,7.08,3.74,3.72,4.75,1.3,1.82,3.41,5.13,3.68,7.67,7.48,6.21,5.02,9.46,7.79,8.11,3.59,8.28,7.36,9.69,9.08,6.46,5.48,7.9,5.27,4.06,4.22,5.6,5.92,6.9,3.26,4.45,3.09,4.38),P = c(2.62,2.26,2.33,2.57,3.06,2.99,1.71,2.06,2.18,1.48,2.66,2.24,2.38,2.55,2.49,2.48,3.9,2.65,1.79,2.88,2.54,3.22,2.93,2.09,3.03,2.56,2.43,2.72,2.59,2.58,3.71,2.5,2.45,3.49,3.31),S = c(1.24,0.95,1.07,1.17,1.15,0.81,1.08,0.89,0.85,1.12,1.22,1.24,1.16,0.98,1.32,1.29,1.04,0.9,1.19,1.03,1.14,1.05,1.1,1.13,1.25,0.92,0.84,1.27,1.02),Cl = c(0.39,0.31,0.32,0.3,0.39,0.38,0.24,0.26,0.35,0.28,0.27,0.29,0.25,0.34,0.33,0.28),K = c(4.47,4.05,4.18,4.07,4.43,3.12,3.79,4.63,4.52,4.49,4.64,4.21,4.38,4.27,4.08,5.23,3.66,3.39,4.14,3.99,3.83,4.19,4.95,5.11,3.44,4.6,4.99,4.54,4.12,3.82,5.55,4.48,3.7,3.8,5.08,4.47),Ca = c(0.78,0.68,0.66,0.69,0.77,0.73,0.46,0.6,0.59,0.61,0.71,0.58,0.7,0.79,0.87,0.62,0.67,0.8,0.72,0.56,0.63,0.65),Ti = c(78.5,73.7,74,69,68.9,52.3,33.7,35,26.6,41,50.7,42.2,33.6,38.7,41.5,56.9,64.6,60.1,69.4,65.7,52.6,46.1,50.8,44.1,35.6,47.3,39.2,47.7,39.6,40.3,38.2,67.9,63.1,43.4,35.1,37.2,27),Fe = c(56.2,52.9,57.1,48.8,46.7,45.8,48.6,49.6,71.5,66,85.7,45.6,70.2,58.8,75.6,85.2,93.9,68.7,70.1,61.2,60.6,76.8,113,68.5,74.9,91.9,44.4,104,62.1,55.3,78.5,75.7,51.7,53.2,49,74.4,51.9,57.6),Zn = c(31.3,29.9,28,27.4,27.9,27.7,19.6,22,20.6,23.1,25.1,22.6,22.7,32.5,35.5,31.1,28.6,29.2,29.6,21.8,29.5,25,26.1,24.7,20.1,23.9,20.3,24.6,21.1,32.6,30.4,19.9,20.7),Br = c(8.54,7.65,6.27,5.83,7.25,6.92,4.74,4.79,4.51,7.53,4.35,3.98,3.64,4.26,10,13.7,12.7,8.62,10.1,2.52,3.63,2.7,2.44,2.73,5.9,6.05,6.98,7.81,12.3,5.91,6.01,6.15,5.74),Rb = c(1.95,1.53,2.12,1.44,1.84,1.62,2.78,2.35,3.24,3.62,3.48,3.34,5.43,3.94,3.01,2.19,3.55,2.63,5.44,4.67,4.71,6.52,3.11,4.11,1.57,1.26,1.95,2.21,2.41),Sr = c(0.94,0.97,0.86,1.97,1.23,1.35,0.96,3.51,1.94,1.47,2.14,1.36,2.07,1.92,1.8,2.34,2.89,2.13,2.62,1.41,1.09,1.37,1.28),N = c(5.68,4.93,4.36,6.36,4.68,3.38,3.33,3.61,3.52,2.74,8.47,7.33,5.82,8.01,7.34,7.12,5.84,4.5,4.17,3.91,3.57,4.2,2.97,3.1,3.42,5.04,5.42,7.35,3.28,3.79),C = c(-29.04,-28.81,-29.12,-28.91,-29.07,-29.13,-29.16,-28.98,-28.74,-28.56,-28.58,-28.33,-28.51,-29.49,-30.45,-30.34,-29.91,-30.13,-30.86,-30.3,-30.23,-30.46,-29.69,-29.43,-29.74,-29.75,-29.92,-29.52,-28.44,-28.24,-28.01,-28.68,-28.77,-29.41,-29,-28.85)),row.names = c(NA,40L),class = "data.frame")

解决方法

使用分面实现所需结果的一种方法是将数据帧拆分为两个,如下所示:

  1. 第一个数据框包含处理数据,第二个数据框包含年份数据。
  2. 在这些数据框中的每一个中,将要绘制在 x 轴上的变量重命名为具有相同的名称(我选择了 ´x). Doing so allows use to have one x-axis for the two different variables. But make sure to convert year or ´Leto 作为字符。
  3. 向每个可用于分面的数据框添加一个标识符(除了您的变量 POSKUS)。
  4. 将数据拆分为两个 df,我们需要两个 geom_jitter 和两个 stat_summary 层。
  5. 最后,我向 facet_wrap 添加了一个自定义标记函数,以仅显示刻面条文本中的试验标签。
library(dplyr)
library(ggplot2)

d1 <- I2 %>% 
  select(x = SISTEM,Si,POSKUS) %>% 
  mutate(name = "SISTEM",name = factor(name,levels = c("SISTEM","Leto")))

d2 <- I2 %>% 
  select(x = Leto,POSKUS) %>% 
  mutate(name = "Leto","Leto")))

base <- ggplot(mapping = aes(x = x,y = Si)) +
  geom_jitter(data = d1,show.legend = FALSE,width = 0.25,color = "black",size = 0.5) +
  stat_summary(data = d1,fun.data = mean_cl_normal,color = "red",size = 0.3) +
  geom_jitter(data = d2,size = 0.5) +
  stat_summary(data = d2,size = 0.3) +
  labs(
    x = NULL,y = "Si (mg / 100 g)"
  ) +
  #theme_classic(base_family = "Palatino Linotype") +
  theme_classic() +
  theme(axis.text = element_text(colour = "black",size = 8),axis.title = element_text(colour = "black",axis.text.x = element_text(angle = 45,vjust = 1,hjust = 1)) +
  theme(strip.background = element_blank())

base +
  facet_wrap(~name+POSKUS,nrow = 1,scales = "free_x",labeller = function(d) list(as.character(d$POSKUS)))
#> Warning: Removed 1 rows containing missing values (geom_segment).

EDIT 要在更改变量顺序后每个试验只有一个标签,您可以使用 ggh4x:: facet_nested_wrap

base +
  ggh4x::facet_nested_wrap(~POSKUS+name,labeller = function(d) list(as.character(d$POSKUS)))
#> Warning: Removed 1 rows containing missing values (geom_segment).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。