plotly:使用下拉选择更新数据
Posted
技术标签:
【中文标题】plotly:使用下拉选择更新数据【英文标题】:plotly: Updating data with dropdown selection 【发布时间】:2017-02-22 18:09:16 【问题描述】:我不确定这是否可能,但这是我想做的。我想通过从下拉菜单中选择来更新 plotly
图中的数据。
举个简单的例子,假设我有一个数据框
df <- data.frame(x = runif(200), y = runif(200), z = runif(200))
我在散点图中使用df$x
和df$y
。我想使用下拉菜单实现两种数据操作场景:
-
将
df$y
替换为df$z
仅绘制df$x
和df$y
的第一个n
值
我查看了以下两个示例,可以轻松重现: https://plot.ly/r/dropdowns/
但是,我不知道如何根据下拉选择传递有关要绘制的数据的信息。对于场景 2,例如我用args = list("data", df[1:n,])
试过了,但没用。
对于场景 1,(唯一?)方法(根据示例)似乎分别隐藏/显示痕迹。这也是方案 2 的唯一方法吗?
还有其他的想法吗?
更新 1:添加可重现的示例
所以这是一个实现我在场景 1 中想要的示例。
require(plotly)
df <- data.frame(x = runif(200), y = runif(200), z = runif(200))
Sys.setenv("plotly_username"="xxx") #actual credentials replaced
Sys.setenv("plotly_api_key"="xxx") #actual credentials replaced
p <- plot_ly(df, x = df$x, y = df$y, mode = "markers", name = "A", visible = T) %>%
add_trace(mode = "markers", y = df$z, name = "B", visible = T) %>%
layout(
title = "Drop down menus - Styling",
xaxis = list(domain = c(0.1, 1)),
yaxis = list(title = "y"),
updatemenus = list(
list(
y = 0.7,
buttons = list(
list(method = "restyle",
args = list("visible", list(TRUE, TRUE)),
label = "Show All"),
list(method = "restyle",
args = list("visible", list(TRUE, FALSE)),
label = "Show A"),
list(method = "restyle",
args = list("visible", list(FALSE, TRUE)),
label = "Show B")))
))
plotly_POST(p)
这里的结果:https://plot.ly/~spietrzyk/96/drop-down-menus-styling/ 这是基于https://plot.ly/r/dropdowns/的示例
但是,我想知道是否可以传递要绘制的数据,而不是触发对单个跟踪的 visible
属性的更改。
我尝试过的一件事是:
p <- plot_ly(df, x = df$x, y = df$y, mode = "markers", name = "A", visible = T) %>%
layout(
title = "Drop down menus - Styling",
xaxis = list(domain = c(0.1, 1)),
yaxis = list(title = "y"),
updatemenus = list(
list(
y = 0.7,
buttons = list(
list(method = "restyle",
args = list("y", df$y),
label = "Show A"),
list(method = "restyle",
args = list("y", df$z),
label = "Show B")))
))
这里的结果:https://plot.ly/~spietrzyk/98/drop-down-menus-styling/
这种方法不起作用,因为来自df$z
的数据没有发布到网格 (https://plot.ly/~spietrzyk/99/)。
所以我想知道是否有办法根据下拉选择操作要绘制的数据,而不是绘制所有轨迹,而不是通过下拉选择切换 visible
属性。
【问题讨论】:
请尝试提供reproducible example,向我们准确展示您的代码在做什么。目前尚不清楚您是如何调用plotly
的,甚至不清楚您将这些参数放在哪里。这样可以更轻松地为您提供帮助。
说实话,我对 R API 不太熟悉,所以我的评论可能用处有限,但这是积极开发中的一个特性。您可以通过 updatemenus 命令直接传递数据,但还有一个新的frame
概念可以促进这一点。 animation
的 plotly.js
文档有一些示例:plot.ly/javascript/animations/… 不幸的是,我不知道是否可以通过 R API 访问帧(请参阅:github.com/plotly/plotly.js/issues/1014),这就是为什么这可能不是一个完全令人满意的答案.
FWIW,这是一个稍微不那么雄心勃勃的示例,它直接通过 updatemenus 命令传递数据:codepen.io/rsreusser/pen/mAjpkb?editors=0010 再次抱歉,它不是通过 R API。
您使用哪个情节版本?对我来说,最新版本plotly_4.5.2
的工作就像一个魅力。
感谢您的提示。我还在使用旧版本的 plotly。但即使更新包,上面的例子对我也不起作用)。您是否复制了包含 args = list("y", df$y)
行的示例?
【参考方案1】:
这就是你想要的吗?
require(plotly)
df <- data.frame(x = runif(200), y = runif(200), z = runif(200))
p <- plot_ly(df, x = ~x, y = ~y, mode = "markers", name = "A", visible = T) %>%
layout(
title = "Drop down menus - Styling",
xaxis = list(domain = c(0.1, 1)),
yaxis = list(title = "y"),
updatemenus = list(
list(
y = 0.7,
buttons = list(
list(method = "restyle",
args = list("y", list(df$y)), # put it in a list
label = "Show A"),
list(method = "restyle",
args = list("y", list(df$z)), # put it in a list
label = "Show B")))
))
p
【讨论】:
是否可以让这个示例处理由数据帧确定的长度列表,而不是硬编码为每个列表项的列表? @jimmy G 我也有类似的问题:***.com/questions/60556896/…,如果你有空,请过来看看,谢谢。【参考方案2】:在@jimmy G 的答案之上。
您可以自动创建按钮,这样您就不必手动指定绘图中所需的每个变量。
library(plotly)
df <- data.frame(x = runif(200), y = runif(200), z = runif(200), j = runif(200), k = rep(0.7, 200), i = rnorm(200,0.6,0.05))
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('Show %s', var_name)
)
,
df
)
y_axis_var_names <- c('y', 'z', 'j', 'k', 'i')
p <- plot_ly(df, x = ~x, y = ~y, mode = "markers", name = "A", visible = T) %>%
layout(
title = "Drop down menus - Styling",
xaxis = list(domain = c(0.1, 1)),
yaxis = list(title = "y"),
updatemenus = list(
list(
y = 0.7,
buttons = create_buttons(df, y_axis_var_names)
)
))
p
希望你觉得它有用。
【讨论】:
确实最有用!另外,可以在arg
函数中添加多个数据属性,如此答案所示:***.com/a/69364462/8076560以上是关于plotly:使用下拉选择更新数据的主要内容,如果未能解决你的问题,请参考以下文章
python - 如何使用plotly python中的下拉按钮更新多个散点图的数据?
如何返回由 2 个下拉列表更新的数据表作为 Plotly Python 中的输入
创建一个按日期月份过滤的下拉列表(pandas + plotly)