R 在绘图仪中,根据坐标值而不是像素设置标记大小

R 在绘图仪中,根据坐标值而不是像素设置标记大小,r,plotly,r-plotly,R,Plotly,R Plotly,不幸的是,这篇文章对我正在寻找的东西没有帮助,而且是我能找到的关于这个主题的唯一一篇文章。根据散点图尺寸参数的plotly文档: 大小(大于或等于0的数字或数字数组),默认值:6,设置标记大小(以像素为单位) (在px中)对我来说是个问题。我想创建一个绘图,其中标记大小基于坐标值,而不是像素,这样我可以增加图形的大小(例如,通过完全屏蔽),并且点的大小也会增加。我目前的代码示例如下: library(plotly) mydf <- data.frame(x = rep(1:20, time

不幸的是,这篇文章对我正在寻找的东西没有帮助,而且是我能找到的关于这个主题的唯一一篇文章。根据散点图尺寸参数的plotly文档:

大小(大于或等于0的数字或数字数组),默认值:6,设置标记大小(以像素为单位)

(在px中)对我来说是个问题。我想创建一个绘图,其中标记大小基于坐标值,而不是像素,这样我可以增加图形的大小(例如,通过完全屏蔽),并且点的大小也会增加。我目前的代码示例如下:

library(plotly)
mydf <- data.frame(x = rep(1:20, times = 20), y = rep(1:20, each = 20),
                   thesize = 10)
plot_ly(mydf) %>%
  add_trace(x = ~x, y = ~y, type = 'scatter', mode = 'markers', 
            marker = list(symbol = 'hexagon', size = ~thesize, opacity = 0.6))
library(plotly)
多年筹资框架%
添加跟踪(x=~x,y=~y,type='scatter',mode='markers',
标记=列表(符号='hexagon',大小=~thesize,不透明度=0.6))
如果在R中创建此绘图,然后通过拖动Rstudio查看器窗口或以其他方式使绘图变大或变小,您会注意到标记保持完全相同的大小(10像素),这令人沮丧。如果我能让这些标记的直径==1(在x轴上),而不是设置为若干像素,我会很高兴。这可能吗

非常感谢您的帮助

  • 让我们从定义轴范围的绘图开始

    p <- plot_ly() %>% layout(xaxis = list(range = c(1, 5)))
    
    eventdata['xaxis.range[1]']
    
  • 因为我们事先不知道绘图的大小,所以我们通过轴线的大小来确定它

    var plot_width = Plotly.d3.select('.xlines-above').node().getBBox()['width'];
    
  • 我们需要手动调用该事件一次,以确保绘图已正确初始化

初始绘图

放大

完整的R代码

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

p <- plot_ly() %>%
  add_trace(x = c(1.5, 3, 4.2),
            y = c(-2, 1, 2), 
            type = 'scatter',
            mode = 'lines+markers',
            showlegend = F) %>% 
  add_trace(x = c(2, 3, 4.2),
            y = c(2, 0, -1),
            type = 'scatter',
            mode = 'lines+markers',
            showlegend = F) %>%
  add_trace(x = c(1.5, 3, 4.2),
            y = c(1, 0.5, 1),
            type = 'scatter',
            mode = 'markers',
            showlegend = F) %>% 
  layout(xaxis = list(range = c(1, 5)))
javascript <- "
marker_size = 0.5; // x-axis units
var myPlot = document.getElementsByClassName('plotly')[0];

function resize(eventdata) {
  var xaxis_stop = 5;
  var xaxis_start = 1;
  var plot_width = Plotly.d3.select('.xlines-above').node().getBBox()['width'];
  if (eventdata['xaxis.range[1]'] !== undefined) {
    var update = {'marker.size': marker_size * plot_width / (eventdata['xaxis.range[1]'] - eventdata['xaxis.range[0]'])};
  } else {
    var update = {'marker.size': marker_size * plot_width / (xaxis_stop - xaxis_start)};
  }
  Plotly.restyle(myPlot, update, 2);
}
resize({eventdata: {}});

myPlot.on('plotly_relayout', function(eventdata) {
  resize(eventdata);
});
"
p <- htmlwidgets::prependContent(p, 
                                 onStaticRenderComplete(javascript))
p

  • 让我们从定义轴范围的绘图开始

    p <- plot_ly() %>% layout(xaxis = list(range = c(1, 5)))
    
    eventdata['xaxis.range[1]']
    
  • 因为我们事先不知道绘图的大小,所以我们通过轴线的大小来确定它

    var plot_width = Plotly.d3.select('.xlines-above').node().getBBox()['width'];
    
  • 我们需要手动调用该事件一次,以确保绘图已正确初始化

初始绘图

放大

完整的R代码

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

p <- plot_ly() %>%
  add_trace(x = c(1.5, 3, 4.2),
            y = c(-2, 1, 2), 
            type = 'scatter',
            mode = 'lines+markers',
            showlegend = F) %>% 
  add_trace(x = c(2, 3, 4.2),
            y = c(2, 0, -1),
            type = 'scatter',
            mode = 'lines+markers',
            showlegend = F) %>%
  add_trace(x = c(1.5, 3, 4.2),
            y = c(1, 0.5, 1),
            type = 'scatter',
            mode = 'markers',
            showlegend = F) %>% 
  layout(xaxis = list(range = c(1, 5)))
javascript <- "
marker_size = 0.5; // x-axis units
var myPlot = document.getElementsByClassName('plotly')[0];

function resize(eventdata) {
  var xaxis_stop = 5;
  var xaxis_start = 1;
  var plot_width = Plotly.d3.select('.xlines-above').node().getBBox()['width'];
  if (eventdata['xaxis.range[1]'] !== undefined) {
    var update = {'marker.size': marker_size * plot_width / (eventdata['xaxis.range[1]'] - eventdata['xaxis.range[0]'])};
  } else {
    var update = {'marker.size': marker_size * plot_width / (xaxis_stop - xaxis_start)};
  }
  Plotly.restyle(myPlot, update, 2);
}
resize({eventdata: {}});

myPlot.on('plotly_relayout', function(eventdata) {
  resize(eventdata);
});
"
p <- htmlwidgets::prependContent(p, 
                                 onStaticRenderComplete(javascript))
p


这是我迄今为止一直使用的解决方法,因为我相当确定这是我必须采用的方法。我目前的挑战是在RShiny中自动调整这些plot_ly()图的高度和宽度。当plot_ly()中未设置高度和宽度时,R Shining会动态调整宽度(高度是它自己的痛苦),但当设置高度和宽度时,情况当然不再如此。无论如何,感谢您一如既往的输入。我知道你的例子是用Javascript编写的,我会尝试用R代码实现类似的东西。@Canovice:请参阅用R代码更新的答案和自动确定宽度。这是我迄今为止一直使用的解决方法,因为我相当确定这是我必须采用的方法。我目前的挑战是在RShiny中自动调整这些plot_ly()图的高度和宽度。当plot_ly()中未设置高度和宽度时,R Shining会动态调整宽度(高度是它自己的痛苦),但当设置高度和宽度时,情况当然不再如此。无论如何,感谢您一如既往的输入。我知道你的例子是用Javascript编写的,我会用R代码实现类似的东西。@Canovice:请参阅用R代码更新的答案和自动确定宽度。