【发布时间】:2017-11-18 11:16:02
【问题描述】:
我有一个应用程序,我试图在其中更改点的大小、颜色或符号。 点是用户单击的对象。 单击一个点会在我的程序中创建一个弹出窗口,其中显示另一个数据集链接到属于单击点的行号的列中的 ID 值。我在演示应用程序(没有弹出窗口)中包含了点击事件的事件流。
我正在尝试根据答案here 更改点以绘制二维散点图。但是,将代码应用于我的 3d 绘图似乎不起作用。
一些额外的背景信息:我正在构建一个程序来分析 3D 散点数据,我的应用程序包含其中几个 3D 图
有人知道怎么做吗?
下面的应用程序包含 2d(注释)和 3d 绘图对象的代码,以显示工作和非工作情况,是对 @Maximilian Peters 给出的代码的直接修改
感谢您的帮助!
额外问题: 假设我们可以使它适用于 3dplot,我还想弄清楚如何更改 JavaScript 代码以根据存储在反应变量(即 values$activepoint)而不是来自点击事件,因为我将允许用户使用 按钮循环访问点,该按钮更改我们从中检索附加信息的点 ID。
library(shiny)
library(plotly)
library(htmlwidgets)
ui <- fluidPage(
plotlyOutput("plot"),
textOutput('messageNr')
)
javascript <- "
function(el, x){
el.on('plotly_click', function(data) {
colors = [];
var base_color = document.getElementsByClassName('legendpoints')[data.points[0].curveNumber].getElementsByTagName('path')[0].style['stroke']
for (var i = 0; i < data.points[0].data.x.length; i += 1) {
colors.push(base_color)
};
colors[data.points[0].pointNumber] = '#000000';
Plotly.restyle(el,
{'marker':{color: colors}},
[data.points[0].curveNumber]
);
//make sure all the other traces get back their original color
for (i = 0; i < document.getElementsByClassName('plotly')[0].data.length; i += 1) {
if (i != data.points[0].curveNumber) {
colors = [];
base_color = document.getElementsByClassName('legendpoints')[i].getElementsByTagName('path')[0].style['stroke'];
for (var p = 0; p < document.getElementsByClassName('plotly')[0].data[i].x.length; p += 1) {
colors.push(base_color);
}
Plotly.restyle(el,
{'marker':{color: colors}},
[i]);
}
};
});
}"
server <- function(input, output, session) {
row.names(mtcars) <- 1:nrow(mtcars)
colorscale <- c("blue", "red", "yellow")
values <- reactiveValues()
output$plot <- renderPlotly({
values$point <- event_data("plotly_click", source = "select")
plot_ly(mtcars,
x = ~mpg,
y = ~cyl,
z = ~wt,
type = "scatter3d",
color = as.factor(mtcars$gear),
colors = colorscale,
mode = "markers",
source = "select",
showlegend = F)%>%
add_markers() %>% onRender(javascript)
} )
observeEvent(values$point, {
values$row <- as.numeric(values$point$pointNumber) +1
values$ID <- rownames(mtcars)[values$row]
### the values$ID is what I use to look up the corresponding dataset in other dataframes containing the detailed info of a datapoint in the
### summary data set that is used to create the real scatter3d plots in which the user clicks.
output$messageNr <- renderText(values$ID)
})
}
# server <- function(input, output, session) {
#
# nms <- row.names(mtcars)
#
# output$plot <- renderPlotly({
# p <- ggplot(mtcars, aes(x = mpg, y = wt, col = as.factor(cyl))) +
# geom_point()
# ggplotly(p) %>% onRender(javascript)
#
# })
# }
shinyApp(ui, server)
【问题讨论】:
-
如果有人认为他可以帮助解决这个问题,也许我们可以在聊天中交谈,这样我就可以更好地解释我想要实现的目标
标签: javascript r shiny plotly