根据从R下拉菜单中选择的变量,在Plotly中的条形图中添加一条线

jm2pwxwz  于 2023-02-26  发布在  其他
关注(0)|答案(1)|浏览(102)

我正在使用Plotly基于R中的下拉菜单生成多个条形图。我的数据集包含数百个变量,并且我能够自动创建下拉菜单,这要归功于我找到的here函数:

create_buttons <- function(df, y_axis_var_names) {
  lapply(
    y_axis_var_names,
    FUN = function(var_name, df) {
      button <- list(
        method = 'restyle',
        args = list('y', list(df[, var_name])),
        label = sprintf(var_name) #'Show %s', 
      )
    },
    df
  )
  
}

然而,我很难根据下拉菜单中选择的变量为每个条形图自动添加一条线。下拉菜单本身生成成功,但我似乎找不到为每个选择的变量添加一条线的方法。
下面是我正在使用的一个示例数据集:

structure(list(YW = structure(1:58, .Label = c("47-2021", "48-2021", 
"49-2021", "50-2021", "51-2021", "52-2021", "1-2022", "2-2022", 
"3-2022", "4-2022", "5-2022", "6-2022", "7-2022", "8-2022", "9-2022", 
"10-2022", "11-2022", "12-2022", "13-2022", "14-2022", "15-2022", 
"16-2022", "17-2022", "18-2022", "19-2022", "20-2022", "21-2022", 
"22-2022", "23-2022", "24-2022", "25-2022", "26-2022", "27-2022", 
"28-2022", "29-2022", "30-2022", "31-2022", "32-2022", "33-2022", 
"34-2022", "35-2022", "36-2022", "37-2022", "38-2022", "39-2022", 
"40-2022", "41-2022", "42-2022", "43-2022", "44-2022", "45-2022", 
"46-2022", "47-2022", "48-2022", "49-2022", "50-2022", "51-2022", 
"52-2022"), class = "factor"), X1 = c(0, 0, 0, 2, 0, 2, 0, 6, 
3, 2, 2, 4, 0, 0, 0, 0, 2, 2, 2, 5, 2, 3, 2, 2, 2, 2, 0, 2, 0, 
0, 2, 4, 4, 2, 2, 0, 0, 0, 2, 0, 6, 4, 4, 6, 6, 13, 2, 2, 0, 
4, 2, 0, 3, 6, 4, 4, 0, 2), X2 = c(0, 0, 0, 2, 0, 2, 0, 6, 3, 
2, 2, 4, 0, 0, 0, 4, 10, 2, 2, 5, 2, 3, 2, 2, 2, 2, 0, 2, 0, 
0, 2, 4, 4, 2, 2, 0, 0, 2, 2, 0, 6, 6, 4, 6, 6, 13, 2, 2, 0, 
4, 2, 0, 3, 6, 4, 4, 0, 2), X3 = c(0, 0, 0, 2, 0, 2, 0, 6, 2, 
2, 2, 4, 2, 0, 0, 0, 2, 2, 2, 5, 2, 3, 2, 2, 2, 2, 0, 2, 0, 0, 
2, 4, 4, 4, 2, 0, 0, 0, 2, 0, 6, 4, 4, 6, 6, 13, 2, 2, 0, 4, 
4, 0, 3, 6, 4, 4, 0, 2), X4 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 
0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0)), class = "data.frame", row.names = c(NA, -58L
))

p = plot_ly(data = test, x=~YW, y= ~X1 ,type ="bar", width = 1500, height = 500 )%>%
  config(locale = 'fr')%>%
  layout(autosize=T,
         title = "",
         xaxis = list(title = "Weeks"),
         yaxis = list(title = "Frequency"),
         updatemenus = list(
           list(y = 0.7,
                buttons = create_buttons(test, names(test[,!names(test) %in% "YW"])))))

我还有一个单独的数据框,其中包含我想用于行的值,其中每列对应一个不同的变量。
lines_x = data.frame(X1 = 5, X2 = 3, X3 = 4, X4 = 1)
我的目标是得到一个如下所示的图表,其中的下拉菜单允许用户选择不同的变量,线条也会相应地更新:

plot_ly(data = test, x=~YW, y= ~X1 ,type ="bar", width = 1500, height = 500 )%>%
  add_lines(y= lines_x$X1)

我如何修改我的代码来实现这一点?谢谢你的帮助!

rdrgkggo

rdrgkggo1#

我修改了一些东西。
1.用于创建按钮的函数:您需要修改2,而不是修改一条轨迹的y轴。(稍后会详细介绍)
1.绘图:为水平线添加了第二条轨迹。
1.布局:将函数调用更改为创建按钮;添加了第3个参数。

新功能

现在有三个论点:第一个记录道的 Dataframe 、第二个记录道的 Dataframe (水平线)以及y轴所需的变量名。
args中,您将看到y = list(),而不是"y", list()。在此列表中有2个列表,第一个轨迹的数据df[, vn](条形图)和第二个轨迹的数据df2[, vn](线条)。
Plotly在重新设计样式时对y的单个值不满意,所以我调用rep来重复x轴上数据长度的值。

creat2 <- function(df, df2, var_n) { # 1st y df, 2nd y df, names
  lapply(
    var_n, 
    function(vn) {
      button <- list(
        method = 'restyle', label = paste0(vn),
        args = list( # a list of 'y's (a list for each trace)
          list(y = list(df[, vn], rep(df2[, vn], nrow(df)))))
      )
    }
  )
}
修改后的打印和布局

我在图和赋值运算符周围添加了括号;这允许你更新一个对象并同时打印该对象。

具体绘图:包括add_lines;我随意地选择绘制X1,我选择将图例设置为false,因为它也没有意义。
特定布局:在按钮分配中,函数名称已更改为creat2,参数现在包括2个数据框和名称。

(p = plot_ly(data = test, x = ~YW, y = ~X1, type ="bar", width = 1500, height = 500 ) %>% 
  config(locale = 'fr') %>% 
  add_lines(y = lines_x$X1, showlegend = F) %>% # hide legend w/ multi traces
  layout(autosize = T,
         title = "",
         xaxis = list(title = "Weeks"),
         yaxis = list(title = "Frequency"),
         updatemenus = list(list(
           y = 0.7,
           buttons = creat2(test, lines_x,
                            names(test[,!names(test) %in% "YW"]))))))

在这些图片中,我注解掉了绘图大小的指定,这样使用查看器窗格会更容易一些。

相关问题