plotly:使用下拉选择更新数据 [英] plotly: Updating data with dropdown selection

查看:24
本文介绍了plotly:使用下拉选择更新数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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

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

  1. df$y 替换为 df$z
  2. 仅绘制 df$xdf$y
  3. 的前 n

我查看了以下两个示例,可以轻松重现:https://plot.ly/r/dropdowns/

但是,我不知道如何根据下拉选择传递有关要绘制的数据的信息.对于场景 2,例如我用 args = list("data", df[1:n,]) 试过了,但没用.

对于场景 1,(唯一?)方法(根据示例)似乎分别隐藏/显示痕迹.这也是方案 2 的唯一方法吗?

还有其他的想法吗?

更新 1:添加可重现的示例

所以这是一个实现我在场景 1 中想要的示例.

要求(情节)df <- data.frame(x = runif(200), y = runif(200), z = runif(200))sys.setenv("plotly_username"="xxx") #实际凭据已替换sys.setenv("plotly_api_key"="xxx") #实际凭证已替换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) %>%布局(title = "下拉菜单 - 样式",xaxis = list(domain = c(0.1, 1)),yaxis = list(title = "y"),更新菜单=列表(列表(y = 0.7,按钮=列表(列表(方法=重新设计",args = list("可见", list(TRUE, TRUE)),标签 = "显示全部"),列表(方法=重新设计",args = list("可见", list(TRUE, FALSE)),标签=显示A"),列表(方法=重新设计",args = list("可见", list(FALSE, TRUE)),标签=显示B")))))plotly_POST(p)

这里的结果:https://plot.ly/~spietrzyk/96/下拉菜单样式/这是基于 https://plot.ly/r/dropdowns/

但是,我想知道是否可以传递要绘制的数据,而不是触发对单个跟踪的 visible 属性的更改.

我尝试过的一件事是:

p <- plot_ly(df, x = df$x, y = df$y, mode = "markers", name = "A", visible = T) %>%布局(title = "下拉菜单 - 样式",xaxis = list(domain = c(0.1, 1)),yaxis = list(title = "y"),更新菜单=列表(列表(y = 0.7,按钮=列表(列表(方法=重新设计",args = list("y", df$y),标签=显示A"),列表(方法=重新设计",args = list("y", df$z),标签=显示B")))))

这里的结果:https://plot.ly/~spietrzyk/98/下拉菜单样式/这种方法不起作用,因为来自 df$z 的数据未发布到网格 (https://plot.ly/~spietrzyk/99/).

所以我想知道是否有办法根据下拉选择操作要绘制的数据,而不是绘制所有轨迹,而不是通过下拉选择切换 visible 属性.

解决方案

这就是你想要的吗?

要求(情节)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) %>%布局(title = "下拉菜单 - 样式",xaxis = list(domain = c(0.1, 1)),yaxis = list(title = "y"),更新菜单=列表(列表(y = 0.7,按钮=列表(列表(方法=重新设计",args = list("y", list(df$y)), # 放入列表标签=显示A"),列表(方法=重新设计",args = list("y", list(df$z)), # 放入列表标签=显示B")))))p

I am not sure if this is possible, but here is what I would like to do. I would like to update the data in a plotly plot by selecting from a dropdown menu.

As a simple example, let's assume I have a data frame

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

from which I use df$x and df$y in a scatter plot. Two scenarios of data manipulation I would like to achieve using a dropdown:

  1. Replace df$y with df$z
  2. Plot only the first n values of df$x and df$y

I looked at the following two examples, which I can easily reproduce: https://plot.ly/r/dropdowns/

However, I have no idea how to pass the information regarding the data to be plotted based on the dropdown selection. For scenario 2 e.g. I have tried it with args = list("data", df[1:n,]) which did not work.

For scenario 1 the (only?) way to go (according to the examples) seems to be hiding/showing the traces respectively. Is that the only way for scenario 2 as well?

Any alternative ideas?

Update 1: Add reproducible example

So here is an example which achieve what I would like in scenario 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)

Result here: https://plot.ly/~spietrzyk/96/drop-down-menus-styling/ This is based on the example from https://plot.ly/r/dropdowns/

However, I am wondering if one could pass the data to be plotted instead of triggering changes to the visible property of individual traces.

The one thing I tried was the following:

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")))
))

Result here: https://plot.ly/~spietrzyk/98/drop-down-menus-styling/ This approach cannot work, as the data from df$z is not posted to the grid (https://plot.ly/~spietrzyk/99/).

So I was wondering is there anyway to manipulate the data to be plotted based on dropdown selection, beyond plotting all traces and than switching the visible property by dropdown selections.

解决方案

Is this what you were after?

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

这篇关于plotly:使用下拉选择更新数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆