用于选择 x、y 和颜色的下拉菜单(绘图)菜单、颜色

2023-09-06 07:48:46 作者:相忘于江湖

我正在尝试创建一个带有可选 x、y 和颜色变量的绘图图,部分基于 前一个问题.The x and y variable selection appears to work, however when new x and y variables are selected, the point color is lost.

I am trying to create a plotly graph with selectable x, y and color variables, based in part on this previous question. The x and y variable selection appears to work, however when new x and y variables are selected, the point color is lost.

此外,我尝试使用类似的策略来选择点颜色,但不幸的是这似乎不起作用.

Further, I have tried to use a similar strategy to select the point colour, but unfortunately this does not seem to work.

另一种选择是使用设置可见".之前链接的问题中的策略.

Another option would be to use the "set visible" strategy in the previously linked question.

示例:

library(plotly)
library(pcaMethods)

pca <- pcaMethods::pca(mtcars, nPcs=3)

df <- as.data.frame(pca@scores)

colors1 <- sample(c("red", "green", "blue"), nrow(df), replace=TRUE)
colors2 <- sample(c("red", "green", "blue"), nrow(df), replace=TRUE)

p <- plotly::plot_ly(df, x = ~PC1, y = ~PC2, type = "scatter",
    color = sample(c("red", "green", "blue"), nrow(df), replace=TRUE),
    mode = "markers") 

p <-  plotly::layout(
    p,
    title = "Dropdown PCA plot",
    updatemenus = list(
        list(
            y = 0.7,
            buttons = list(
                list(method = "restyle",
                   args = list(
                    "x", list(df$PC1)
                    ),
                   label = "PC1"),
                list(method = "restyle",
                   args = list(
                    "x", list(df$PC2)
                    ),
                   label = "PC2"),
                list(method = "restyle",
                   args = list(
                    "x", list(df$PC3)
                    ),
                   label = "PC3")
                )
            ),
        list(
            y = 0.5,
            buttons = list(
                list(method = "restyle",
                   args = list(
                    "y", list(df$PC1)
                    ),
                   label = "PC1"),
                list(method = "restyle",
                   args = list(
                    "y", list(df$PC2)
                    ),
                   label = "PC2"),
                list(method = "restyle",
                   args = list(
                    "y", list(df$PC3)
                    ),
                   label = "PC3")
                )
            )
        )
    )

htmlwidgets::saveWidget(p, "test.html", selfcontained=FALSE)

推荐答案

目前这在 R API 中是不可能的,因为从变量到绘图输出的映射是在 R 端完成的,而不是通过 plotly.js.

This is not currently possible in the R API, as mapping from variables to plot output is done on the R side, not by plotly.js.

以下链接对此进行了解释:https://github.com/ropensci/plotly/issues/803

This is explained at the following link: https://github.com/ropensci/plotly/issues/803

这个功能可以使用 plotly.js 和 HTML 来完成.必须将 select 元素添加到 HTML 页面,并添加事件侦听器以在更新时调用 Plotly.newPlot().

This functionality can be accomplished using plotly.js and HTML. One would have to add select elements to a HTML page, and add event listeners to call Plotly.newPlot() on update.

这里可以看到一个示例实现:https://github.com/Alanocallaghan/plotlyutils/blob/master/inst/htmlwidgets/lib/selectable_scatter_plot/selectable_scatter_plot.js

An example implementation can be seen here: https://github.com/Alanocallaghan/plotlyutils/blob/master/inst/htmlwidgets/lib/selectable_scatter_plot/selectable_scatter_plot.js