8

我不确定这是否可能,但这是我想做的。我想plotly通过从下拉菜单中选择来更新图中的数据。

作为一个简单的例子,假设我有一个数据框

df <- data.frame(x = runif(200), y = runif(200), z = runif(200))

我从中使用df$xdf$y在散点图中。我想使用下拉菜单实现两种数据操作场景:

  1. 替换df$ydf$z
  2. 仅绘制和的第一个ndf$xdf$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通过下拉选择来切换属性。

4

2 回答 2

10

这就是你所追求的吗?

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
于 2016-10-27T19:12:28.987 回答
3

在@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


希望你觉得它有用。

于 2021-02-26T12:02:25.247 回答