Этот ответ, скорее всего, больше подходит для комментариев, но моя репутация не соответствует минимальному требованию 50.

всех сил пытался решить, по-видимому, основной вопрос. Представьте, что у вас есть точечный график, скажем ... 10 маркеров. Я полагаю, что этот сюжет был создан с использованием заговора в блестящей среде.

Можно легко получить координаты этих маркеров, используяevent_data("plotly_click") код.

Теперь представьте, что вам нужны не координаты этих маркеров, а координаты, сгенерированные щелчком мыши, но именно там, где маркер не существует (например, потому что вы хотели бы установить новый маркер именно там, и вы хотели бы повторно использовать информация, поступающая от этого щелчка мыши).

Я не могу получить такое поведение, используяonclick()или что угодно.

Любая идея ?

 Maximilian Peters15 сент. 2017 г., 16:17
Это сложно. Координаты экрана относительно просты.
 Maximilian Peters12 сент. 2017 г., 04:10
Вам нужны относительные координаты Plotly, то есть те, которые вы видите на оси? или просто точка, где пользователь нажал, чтобы создать новый элемент SVG? Вы хотите добавить свою точку к данным Plotly?
 Olivier BRANDOUY15 сент. 2017 г., 16:16
Чтобы быть более прямым, мне нужны относительные координаты Plotly, как видно на оси.
 Olivier BRANDOUY13 сент. 2017 г., 01:21
На самом деле я хотел бы добавить новую точку, где пользователь щелкнул и чтобы иметь возможность использовать координаты для обработки нового вычисления. Любой soLuton для этого будет очень признателен. Спасибо

Ответы на вопрос(1)

Решение Вопроса

Вы можете добавить слушатель событий D3 на свой сюжет

Plotly.d3.select('.plotly').on('click', function(d, i) {})

а потом

получить относительные значения x и y на основе позиции щелчка (d3.event.layerX соответственноlayerY)с учетом относительного положения графика (document.getElementsByClassName('bg')[0].attributes['x'])и, наконец, вычисление новых значений на основе диапазонов осей (myPlot.layout.xaxis.range[0])

Новыйx а такжеy значение затем подталкивается к существующему графику

Plotly.extendTraces(myPlot, {
      x: [[x]],
      y: [[y]]
    }, [1]);

Полный код R

library("plotly")
library("htmlwidgets")

p <- plot_ly(x = c( -2, 0, 2 ),y = c( -2, 1, 2), type = 'scatter' ,mode = 'lines+markers') %>% 
  add_trace(x=c(-1,0.4,2),y=c(2, 0, -1),type='scatter',mode='lines+markers') %>% 
  layout(hovermode='closest')
javascript <- "
var myPlot = document.getElementsByClassName('plotly')[0];
Number.prototype.between = function (min, max) {
  return this >= min && this <= max;
};

Plotly.d3.select('.plotly').on('click', function(d, i) {
  var e = Plotly.d3.event;
  var bg = document.getElementsByClassName('bg')[0];
  var x = ((e.layerX - bg.attributes['x'].value + 4) / (bg.attributes['width'].value)) * (myPlot.layout.xaxis.range[1] - myPlot.layout.xaxis.range[0]) + myPlot.layout.xaxis.range[0];
    var y =((e.layerY - bg.attributes['y'].value + 4) / (bg.attributes['height'].value)) * (myPlot.layout.yaxis.range[0] - myPlot.layout.yaxis.range[1]) + myPlot.layout.yaxis.range[1]
  if (x.between(myPlot.layout.xaxis.range[0], myPlot.layout.xaxis.range[1]) && 
y.between(myPlot.layout.yaxis.range[0], myPlot.layout.yaxis.range[1])) {
    Plotly.extendTraces(myPlot, {
      x: [[x]],
      y: [[y]]
    }, [1]);
  }
});"
p <- htmlwidgets::prependContent(p, onStaticRenderComplete(javascript), data=list(''))
p

Интерактивный пример Javascript

var traces = [{
  x: [1, 2, 3, 4],
  y: [10, 15, 13, 17],
  mode: 'markers',
  type: 'scatter'
}];

traces.push({
  x: [2, 3, 4, 5],
  y: [16, 5, 11, 9],
  mode: 'markers',
  type: 'scatter'
});

traces.push({
  x: [1, 2, 3, 4],
  y: [12, 9, 15, 12],
  mode: 'markers',
  type: 'scatter'
});

traces.push({
  x: [],
  y: [],
  mode: 'lines+markers',
  type: 'scatter'
});

var myPlot = document.getElementById('myPlot')
Plotly.newPlot('myPlot', traces, {hovermode: 'closest'});

Number.prototype.between = function(min, max) {
  return this >= min && this <= max;
};

Plotly.d3.select(".plotly").on('click', function(d, i) {
  var e = Plotly.d3.event;
  var bg = document.getElementsByClassName('bg')[0];
  var x = ((e.layerX - bg.attributes['x'].value + 4) / (bg.attributes['width'].value)) * (myPlot.layout.xaxis.range[1] - myPlot.layout.xaxis.range[0]) + myPlot.layout.xaxis.range[0];
  var y = ((e.layerY - bg.attributes['y'].value + 4) / (bg.attributes['height'].value)) * (myPlot.layout.yaxis.range[0] - myPlot.layout.yaxis.range[1]) + myPlot.layout.yaxis.range[1]
  if (x.between(myPlot.layout.xaxis.range[0], myPlot.layout.xaxis.range[1]) &&
    y.between(myPlot.layout.yaxis.range[0], myPlot.layout.yaxis.range[1])) {
    Plotly.extendTraces(myPlot, {
      x: [
        [x]
      ],
      y: [
        [y]
      ]
    }, [3]);
  }
});
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
<div id="myPlot" style="width:100%;height:100%"></div>

Блестящий пример

library(shiny)
library("plotly")
library("htmlwidgets")

ui <- fluidPage(
  plotlyOutput("plot")
)

server <- function(input, output) {
   javascript <- "
function(el, x){
  Number.prototype.between = function (min, max) {
   return this >= min && this <= max;
  };

  Plotly.d3.select('.plotly').on('click', function(d, i) {
  var e = Plotly.d3.event;
  var bg = document.getElementsByClassName('bg')[0];
  var x = ((e.layerX - bg.attributes['x'].value + 4) / (bg.attributes['width'].value)) * (el.layout.xaxis.range[1] - el.layout.xaxis.range[0]) + el.layout.xaxis.range[0];
  var y =((e.layerY - bg.attributes['y'].value + 4) / (bg.attributes['height'].value)) * (el.layout.yaxis.range[0] - el.layout.yaxis.range[1]) + el.layout.yaxis.range[1]
  if (x.between(el.layout.xaxis.range[0], el.layout.xaxis.range[1]) && y.between(el.layout.yaxis.range[0], el.layout.yaxis.range[1])) {
    Plotly.extendTraces(el, {
     x: [[x]],
     y: [[y]]
    }, [1]);
  }
});
}"
  output$plot <- renderPlotly({
    plot_ly(x = c( -2, 0, 2 ),y = c( -2, 1, 2), type = 'scatter' ,mode = 'lines+markers') %>% 
    add_trace(x=c(-1,0.4,2),y=c(2, 0, -1),type='scatter',mode='lines+markers') %>% 
    layout(hovermode='closest') %>% onRender(javascript)
  })
}

shinyApp(ui = ui, server = server)
 Olivier BRANDOUY23 сент. 2017 г., 19:29
Работает отлично. Максимилиан: только одно слово для всего этого => блестящий. Большое спасибо за вашу помощь.
 Olivier BRANDOUY16 сент. 2017 г., 12:03
Спасибо Максимилиану, он отлично работает ... но не в блестящей обстановке. Я полагаю, что это связано с тем, что prependContent () не поддерживается в содержимом рендеринга блестящего виджета.
 Maximilian Peters16 сент. 2017 г., 20:55
Для блеска вам нужно будет обернуть код JSfunction(el, x){ ... } и использовать%>% onRender(javascript) где вы вызываете свою сюжетную функцию. - Смотрите обновленный ответ

Ваш ответ на вопрос