我不确定这是否可行,但这是我想做的事情。我想通过从下拉菜单中选择来更新plotly
图中的数据。
作为一个简单的例子,我们假设我有一个数据框
df <- data.frame(x = runif(200), y = runif(200), z = runif(200))
我在散点图中使用df$x
和df$y
。我希望使用下拉列表实现两种数据操作方案:
df$y
替换为df$z
n
和df$x
的第一个df$y
值我查看了以下两个示例,我可以轻松地重现这些示例: 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
属性。
答案 0 :(得分:7)
这是你追求的吗?
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
答案 1 :(得分:1)
在@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
希望你觉得它有用。