[英]Set marker size based on coordinate values, not pixels, in plotly R
不幸的是,該帖子- 設置標記大小 -並沒有幫助我尋找所需內容,並且是該主題中我唯一能找到的帖子。 根據散點圖的size參數上的繪圖文檔:
“大小(數字或大於或等於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))
如果您在R中創建此圖,然后通過拖動Rstudio查看器窗口或以其他方式使圖變大或變小,您會注意到標記保持完全相同的大小(10像素),這令人沮喪。 如果我可以讓這些標記的直徑== 1(在x軸上)而不是設置為多個像素,我會很喜歡。 這可能嗎?
任何幫助都非常感謝!!!
讓我們從定義軸范圍的圖開始。
p <- plot_ly() %>% layout(xaxis = list(range = c(1, 5)))
現在添加一個JavaScript事件監聽器,以捕獲繪圖布局中的任何更改
javascript <- " var myPlot = document.getElementsByClassName('plotly')[0]; function resize(eventdata) { // magic happens here } myPlot.on('plotly_relayout', function(eventdata) { resize(eventdata); }); " p <- htmlwidgets::prependContent(p, onStaticRenderComplete(javascript)) p
事件傳遞事件eventdata
從那里我們可以獲得新的軸范圍。
eventdata['xaxis.range[1]']
由於我們事先不知道繪圖的大小,因此我們通過軸線的大小來確定
var plot_width = Plotly.d3.select('.xlines-above').node().getBBox()['width'];
我們需要手動調用一次該事件,以確保正確初始化繪圖
放大
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
交互式JavaScript示例
plotly_relayout
事件將被觸發,並且可以從檢索新范圍eventdata
在xaxis.range[1]
開始)和xaxis.range[1]
端部) relayout
標記大小。 var plot_width = 500; var plot_height = 500; var margin_l = 100; var margin_r = 100; marker_size = 0.5; // x-axis units xaxis_start = 1; xaxis_stop = 5; var trace1 = { x: [1.5, 2, 3, 4], y: [10, 15, 13, 17], mode: "markers", marker: { size: marker_size * (plot_width - margin_l - margin_r) / (xaxis_stop - xaxis_start) }, showlegend: false }; var trace2 = { x: [2, 3, 4, 4.5], y: [16, 5, 11, 10], mode: "lines" }; var trace3 = { x: [1.5, 2, 3, 4], y: [12, 9, 15, 12], mode: "lines+markers", showlegend: false }; var data = [trace1, trace2, trace3]; var layout = { width: plot_width, height: plot_height, margin: { l: margin_l, r: margin_r }, xaxis: { range: [1, 5] }, showlegend: false }; Plotly.newPlot("myDiv", data, layout); var refplot = document.getElementById("myDiv"); refplot.on("plotly_relayout", function(eventdata) { if (eventdata["xaxis.range[1]"] !== undefined) { var update = { "marker.size": marker_size * (plot_width - margin_l - margin_r) / (eventdata["xaxis.range[1]"] - eventdata["xaxis.range[0]"]) }; } else { var update = { "marker.size": marker_size * (plot_width - margin_l - margin_r) / (xaxis_stop - xaxis_start) }; } Plotly.restyle("myDiv", update, 0); });
<head> <script src="https://cdn.plot.ly/plotly-latest.min.js"></script> </head> <body> <div id="myDiv"></div> </body>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.