添加阴影矩形,在Plotly R中选择Box角

时间:2017-04-05 23:18:39

标签: javascript r ggplot2 plotly htmlwidgets

我正在尝试创建一个应用程序,如果用户在Plotly中使用Box Select工具,则填充的矩形将出现在Box Select旁边。为了实现这一点,我试图调用Plotly.addTrace()来创建一个矩形对象(类型:rect),它具有用户选择的框的角。

我能够获得用户选择的方框角落的坐标(在代码中称为xMin,xMax,yMin和yMax)。但是,然后我尝试创建一个名为drawRect的变量,可以将其添加到Plotly中。但是,此时此事无所作为。

我基于Python Plotly(https://plot.ly/python/shapes/)的帖子提供了一些语法。但是,我在R中使用Plotly。是否有任何类似的矩形对象可以在Plotly R中使用?

以下是显示我的代码的MWE。

O(log(n))

1 个答案:

答案 0 :(得分:0)

基本上,奇怪的是,对于我们老ggplot兽医来说听起来很奇怪,"形状"处理的方式与标记和线条的处理方式不同(在#34;痕迹"中设置),但"形状" (如rect)设置在情节图的layout部分。如果我阅读更多的情节书,我可能会更好地理解这一点。

所以我做了两处修改。

  • 在开头使用dragmode"select"更改为layout
  • Plotly.addTraces javascript末尾的onRender逻辑更改为Plotly.relayout

作为一个旁注,我几个小时都在想它为什么叫它"转发",我刚才意识到我正在写这个,它是"重新布局"这完全有道理。

所以这是代码:

library(ggplot2)
library(shiny)
library(plotly)
library(htmlwidgets)

ui <- basicPage(
  plotlyOutput("plot1")
)

server <- function(input, output) {

  p <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point(alpha=0) + xlim(0,5) +ylim(-3,3)
  gp <- ggplotly(p)

  set.seed(3)
  myDF <- data.frame(X1=rnorm(10,-1), X2=rnorm(10,-1), X3=rnorm(10,-1), X4=rnorm(10,1), X5=rnorm(10,1), X6=rnorm(10,1))
  colNms <- colnames(myDF)
  nVar <- length(colNms)

  output$plot1 <- renderPlotly({
    gp %>% layout(dragmode="select") %>%  
           onRender("
                    function(el, x, data) {

                    var myDF = data.myDF
                    var Traces = [];
                    var dLength = myDF.length
                    var vLength = data.nVar
                    var cNames = data.colNms
                    for (a=0; a<dLength; a++){
                    xArr = [];
                    yArr = [];
                    for (b=0; b<vLength; b++){
                    xArr.push(b)
                    yArr.push(myDF[a][cNames[b]]);
                    }
                    var pcpLine = {
                    x: xArr,
                    y: yArr,
                    mode: 'lines',
                    line: {
                    color: 'orange',
                    width: 1
                    },
                    opacity: 0.9,
                    }
                    Traces.push(pcpLine);
                    }
                    Plotly.addTraces(el.id, Traces);

                    el.on('plotly_selected', function(e) {
                    var dLength = myDF.length
                    var selectedPCP = []
                    var xMin = e.range.x[0]
                    var xMax = e.range.x[1]
                    var yMin = e.range.y[0]
                    var yMax = e.range.y[1]

                    console.log([xMin, xMax, yMin, yMax])

                    var Traces = []
                    var drawRect = {
                    type: 'rect',
                    x0: xMin,
                    y0: yMin,
                    x1: xMax,
                    y1: yMax,
                    line: {
                    color: 'green',
                    width: 1
                    },
                    fillcolor: 'green'
                    }
                    var update = {
                        shapes:[drawRect]
                     }
                    Plotly.relayout(el.id, update)
                    })
                    }", data = list(myDF = myDF, nVar = nVar, colNms = colNms))})

  }
shinyApp(ui, server)

以下是它工作的屏幕截图:

enter image description here