繁体   English   中英

如何使用2个y轴绘制一个数据框,该数据框具有7个变量,其值的范围很广?

[英]How can I plot using 2 y-axes using a single data frame with 7 variables having a wide range of values?

我在一个时间序列中有7个变量(浮游生物官能团的密度),我想将它们放在一个图中以比较它们随时间的趋势。 我使用了ggplot,geom_point和geom_line。 由于每个变量的范围都在变化,因此,将较小值的变量与较大值的变量绘制成几乎平坦的线。 由于我只关注趋势,而不关注密度,因此,我希望在一个图中查看所有线条。 我考虑过使用sec.axis函数,但无法弄清楚如何将变量分配给任何一个y轴。

以下是我的示例数据:

seq=1:6

fgrp: 

Cop<-c(4.166667,4.722222,3.055556,4.444444,2.777778,2.222222)

Cyan<-c(7.222222,3.888889,1.388889,0.555556,6.944444,3.611111)

Dia<-c(96.66667,43.88889,34.44444,111.8056,163.0556,94.16667)

Dino<-c(126.9444,71.11111,50,55.97222,65,38.33333)

Naup<-c(271.9444,225.5556,207.7778,229.8611,139.7222,92.5)

OT<-c(22.5,19.16667,10.27778,18.61111,18.88889,8.055556)

Prot<-c(141.9444,108.8889,99.16667,113.8889,84.44444,71.94444)

还有没有sec.axis的ggplot脚本,因为我还无法使它工作:

ggplot(data=df,aes(x=seq,y=mean,shape=fgrp,linetype=fgrp))+geom_point(size=2.5)+geom_line(size=0.5)+scale_shape_manual(values=c(16,17,15,18,8,1,0),
                 guide=guide_legend(title="Functional\nGroups"))+scale_linetype_manual(values=c("solid","longdash","dotted","dotdash","dashed","twodash","12345678"),guide=F)+scale_y_continuous(sec.axis = sec_axis(~./3)) +geom_errorbar(mapping=aes(ymax=mean+se,ymin=mean-se), width=0.04,linetype="longdash",color="gray30")+theme_minimal()+labs(list(title="Control",x="time",y="density"),size=12)+theme(plot.title = element_text(size = 12,hjust = 0.5 ))

这些行看起来并不可怕,但是下面是一个示例, facet_wrap使用带有scales = "free_y" ,可以使您朝正确的方向前进:

library(tidyverse)

seq  <- 1:6
Cop  <- c(4.166667,4.722222,3.055556,4.444444,2.777778,2.222222)
Cyan <- c(7.222222,3.888889,1.388889,0.555556,6.944444,3.611111)
Dia  <- c(96.66667,43.88889,34.44444,111.8056,163.0556,94.16667)
Dino <- c(126.9444,71.11111,50,55.97222,65,38.33333)
Naup <- c(271.9444,225.5556,207.7778,229.8611,139.7222,92.5)
OT   <- c(22.5,19.16667,10.27778,18.61111,18.88889,8.055556)
Prot <- c(141.9444,108.8889,99.16667,113.8889,84.44444,71.94444)

df <- tibble(
  seq  = seq,
  cop  = Cop,
  cyan = Cyan,
  dia  = Dia,
  dino = Dino,
  naup = Naup,
  ot   = OT,
  prot = Prot
)
df
#> # A tibble: 6 x 8
#>     seq   cop  cyan   dia  dino  naup    ot  prot
#>   <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1     1  4.17 7.22   96.7 127.  272.  22.5  142. 
#> 2     2  4.72 3.89   43.9  71.1 226.  19.2  109. 
#> 3     3  3.06 1.39   34.4  50   208.  10.3   99.2
#> 4     4  4.44 0.556 112.   56.0 230.  18.6  114. 
#> 5     5  2.78 6.94  163.   65   140.  18.9   84.4
#> 6     6  2.22 3.61   94.2  38.3  92.5  8.06  71.9

df_tidy <- df %>%
  gather(grp, value, -seq)
df_tidy
#> # A tibble: 42 x 3
#>      seq grp   value
#>    <int> <chr> <dbl>
#>  1     1 cop   4.17 
#>  2     2 cop   4.72 
#>  3     3 cop   3.06 
#>  4     4 cop   4.44 
#>  5     5 cop   2.78 
#>  6     6 cop   2.22 
#>  7     1 cyan  7.22 
#>  8     2 cyan  3.89 
#>  9     3 cyan  1.39 
#> 10     4 cyan  0.556
#> # ... with 32 more rows

ggplot(df_tidy, aes(x = seq, y = value, color = grp)) +
  geom_line()

ggplot(df_tidy, aes(x = seq, y = value, color = grp)) +
  geom_line() +
  facet_wrap(~ grp, scales = "free_y")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM