我正在使用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)
我如何修改我的代码来实现这一点?谢谢你的帮助!
1条答案
按热度按时间rdrgkggo1#
我修改了一些东西。
1.用于创建按钮的函数:您需要修改2,而不是修改一条轨迹的y轴。(稍后会详细介绍)
1.绘图:为水平线添加了第二条轨迹。
1.布局:将函数调用更改为创建按钮;添加了第3个参数。
新功能
现在有三个论点:第一个记录道的 Dataframe 、第二个记录道的 Dataframe (水平线)以及y轴所需的变量名。
在
args
中,您将看到y = list()
,而不是"y", list()
。在此列表中有2个列表,第一个轨迹的数据df[, vn]
(条形图)和第二个轨迹的数据df2[, vn]
(线条)。Plotly在重新设计样式时对
y
的单个值不满意,所以我调用rep
来重复x轴上数据长度的值。修改后的打印和布局
我在图和赋值运算符周围添加了括号;这允许你更新一个对象并同时打印该对象。
具体绘图:包括
add_lines
;我随意地选择绘制X1
,我选择将图例设置为false,因为它也没有意义。特定布局:在按钮分配中,函数名称已更改为
creat2
,参数现在包括2个数据框和名称。在这些图片中,我注解掉了绘图大小的指定,这样使用查看器窗格会更容易一些。