如何在 R 中的 Plotly 中的每个子图中保留额外的痕迹?它们都出现在顶部的子图中

问题描述 投票:0回答:1

我正在尝试使用 R 中的绘图和子图功能来绘制流速和浓度的时间序列。我有几个水质参数,我希望将三个子图堆叠在一起,每个子图都有流量的时间序列和感兴趣的水质参数的时间序列。为此,我编写了一个简单的绘图函数,它同时考虑流量和浓度。当我使用下面的代码时,看起来每个子图中的第一条迹线(在我的例子中是流)都在每个子图中正确绘制,但所有其他迹线都最终出现在顶部子图中,以及它们的辅助轴参数。显然,必须有一种方法使用layout()将额外的轨迹分配给适当的子图。如果您有任何建议,我很感兴趣!

此外,如果您有建议为每个子图添加图例,我也很感兴趣。我看过相关帖子,但仍不清楚如何为我做到这一点。谢谢!

time <- c(1:7)
flow <- c(10,9,8,6,6,7,8.5)

NO3 <- c(5,6,6,5,4,3,4)

NH4 <- c(0.2,0.3,0.4,0.6,1,0.9,0.8)

TSS <- c(50,45,40,43,42,41,40)

data <- as.data.frame(cbind(time,flow,NO3,NH4,TSS))


Special_plot <- function(data, parameter, rangeQ, ConcRange){ 
  
    fig <- plot_ly(data, x = ~time)
  
    fig <- fig %>% add_trace(type = 'scatter',
 
                                 y = ~flow,
 
                                 name = 'Flow',
 
                                 mode = 'lines',
 
                                 line = list (color = "#1f77b4"),
 
                                 showlegend = TRUE)
  
    fig <- fig %>% add_trace(type = 'scatter',
                           y = ~data[,parameter],
 
                              name = parameter,
 
                              mode = 'lines' , yaxis = 'y2',
  
                                 showlegend = TRUE)
  
    fig <- fig %>% layout( yaxis = list(title = 'Flow rate', range = rangeQ),
  
                       yaxis2 = list(title = 'Concentration', 
                        range = ConcRange, overlaying = 'y', 
                        side = 'right', automargin = TRUE))

return(fig)

}

rangeQ = c(2,12)




fig1 <- Special_plot(data, "NO3",rangeQ, c(2,7)) 
fig2 <- Special_plot(data, "NH4",rangeQ, c(0,1.5))  

fig3 <- Special_plot(data, "TSS",rangeQ, c(0,50)) 


fig <- subplot(fig1,fig2,fig3,nrows = 3, shareX = TRUE)
fig
r function plotly
1个回答
0
投票

我在这篇文章中找到了问题的答案

因此,在上面的代码中,我在函数中添加了另一个名为

Yaxis

 的变量。根据上面的帖子,所需要做的就是将 
overlaying = "y"
 更改为 
overlaying = Yaxis
。两个子图的变量,第一个子图有 
Yaxis = 'y'
,第二个子图有 
Yaxis = 'y3'
。对于三个子图,第三个子图将具有 
Yaxis = 'y5'
。对于每个额外的子图,这个列表一直在继续,
Yaxis
将采取
y7
y9
等。我不明白它为什么起作用,而且我在这本电子书中找不到

所以似乎有效的代码是:

time <- c(1:7) flow <- c(10,9,8,6,6,7,8.5) NO3 <- c(5,6,6,5,4,3,4) NH4 <- c(0.2,0.3,0.4,0.6,1,0.9,0.8) TSS <- c(50,45,40,43,42,41,40) data <- as.data.frame(cbind(time,flow,NO3,NH4,TSS)) Special_plot <- function(data, parameter, rangeQ, ConcRange, Yaxis){ fig <- plot_ly(data, x = ~time) fig <- fig %>% add_trace(type = 'scatter', y = ~flow, name = 'Flow', mode = 'lines', line = list (color = "#1f77b4"), showlegend = TRUE) fig <- fig %>% add_trace(type = 'scatter', y = ~data[,parameter], name = parameter, mode = 'lines' , yaxis = 'y2', showlegend = TRUE) fig <- fig %>% layout( yaxis = list(title = 'Flow rate', range = rangeQ), yaxis2 = list(title = 'Concentration', range = ConcRange, overlaying = Yaxis, side = 'right', automargin = TRUE)) return(fig) } rangeQ = c(2,12) fig1 <- Special_plot(data, "NO3",rangeQ, c(2,7),'y') fig2 <- Special_plot(data, "NH4",rangeQ, c(0,1.5),'y3') fig3 <- Special_plot(data, "TSS",rangeQ, c(0,50),'y5') fig <- subplot(fig1,fig2,fig3,nrows = 3, shareX = TRUE) fig

不过我还没有解决图例问题。

© www.soinside.com 2019 - 2024. All rights reserved.