Thursday, March 12, 2020

Published March 12, 2020 by with 2 comments

Improving Plotly Performance - Coloring Plots

When doing colored marker plots in plotly, is it faster to pass an array of colors for the markers, or do 1 trace per color?
There's actually not a perfect answer here, but I found '1 trace per color' to be much faster for real use cases. The issue is that plotting n total points across m traces slows down as m increases. However, you can only really resolve 10-20 colors on a plot, so realistically you'd have 10-20 traces at most here.

Here is an example:

```let count = 500000;

let x = [];
let y = [];
let colors = [];
let sourceColors = ['rgb(255, 50, 50)', 'rgb(50, 255, 50)', 'rgb(50, 50, 255)', 'rgb(155, 50, 50)', 'rgb(50, 155, 50)', 'rgb(50, 50, 155)', 'rgb(255, 50, 255)', 'rgb(255, 255, 50)', 'rgb(50, 255, 255)'];
let ncolors = 8;

//assign a color to each marker
for (let i = 0; i < count; i++) {
x.push(i);
y.push(Math.random());
colors.push(sourceColors[Math.floor(ncolors*i/count)]);
}

let traces = [{
x: x,
y: y,
marker: {
color: colors
},
type: 'scattergl',
mode: 'markers'
}];

let time = new Date().getTime();

traces = [];
counter = 0;

//create a trace for each color
for (let i = 0; i < ncolors; i++) {
let trace = {};
x = [];
y = [];
for (; counter < (1 + i)*count / ncolors; counter++) {
x.push(counter);
y.push(Math.random());
}
trace.x = x;
trace.y = y;
trace.type = 'scattergl';
trace.mode = 'markers';
trace.marker = { color: sourceColors[i] };
traces.push(trace);
}

time = new Date().getTime();
Plotly.react('plot2', traces, { showlegend: false }).then(alert(new Date().getTime() - time));
```

This builds two 8 color, 500,000 point plots. The first one loops through the points and assigns a color per point to the colors array then creates on trace with that color array. The second one loops through the colors and creates a trace per color.

On my current laptop, the first one takes ~2000 ms to render and the second one takes ~500 ms to render. For the same view for the user, the '1 trace per color' implementation is 4x faster. The tool I hit this with allows users to really quickly view up to ~1M points at a time, so this was an enormous difference. As an example in the actual tool, total processing from click to finished render went from ~3500 ms to ~1000 ms.

For small amounts of data, this won't matter much, but there are situations where this is a massive impact so it's a cool thing to have available.

1. 🔰 IPRO356 เว็บเดียวจบครบวงจร
เว็บใหญ่ เว็บตรง มั่นคง ไม่มีประวัติการโกง 💯%

🎰 เว็บไซต์ คาสิโนชั้นนำระดับโลก
🎮 เกมสล็อตออนไลน์ ครบทุกค่าย
⭐️ เว็บตรงเปอร์เซ็นการชนะสูง
💸 พร้อมกับอัตราการจ่ายที่ให้มากกว่าใครๆ

2. ⭐️เชิญทางนี้เลย เว็บเดียวจบครบวงจร งบน้อย แตกหนัก

🎰สล็อต♥️คาสิโน♠️บาคาร่า⚽️กีฬา💥ไฮโล🎲หวย🔢

💸 เริ่มต้น 1บาท เล่นง่าย จ่ายจริง
✅ เว็บตรง มั่นคง ปลอดภัย จ่ายเป็นล้านก็ไม่หวั่น

🔊 IPRO356 ใจดีให้ทุนฟรี นำไปต่อยอดได้
📌 ด้วยโปรโมชั่น แนะนำเพื่อน สร้างรายได้ฟรี
💸 สูงถึง100,000บาทต่อเดือน