Как построить график, используя 2 оси Y, используя один фрейм данных с 7 переменными, имеющими широкий диапазон значений? - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть 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)

ИСкрипт ggplot без sec.axis, так как я пока не могу заставить его работать:

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 ))

1 Ответ

0 голосов
/ 18 февраля 2019

Строки не выглядят ужасно, как есть, но вот пример, который использует 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")

...