Specifying marker size in data unit for plotly


I switched from matplotlib to plotly mainly to plot smooth animations in 2D/3D. I want to plot the motion of robots consisting of multiple circles/spheres.

The different body parts of the robot have different sizes and the circles need to represent that accurately.
Is there a way in plotly to specify the size of the markers in data units?
For example, I want to draw a 5m x 5m section in which circles with a radius of 0.1m are moving along different trajectories.

In matplotlib I know two alternatives. One is to use patches matplotlib.patches.Circle. The second option is to plot the points and scale their markersize correctly by taking the dpi into account (See the answers to this question for matplotlib).

Is there a way in poorly to specify the size of the markers in data units or scale the sizeref attribute correctly?

# Point with radius 2 (approx.)
from plotly.offline import plot
import plotly.graph_objs as go

trace = go.Scatter(x=[4], y=[4],
                   marker={'size': 260, 'sizeref': 1})  # ???

layout = dict(yaxis=dict(range=[0, 10]),
              xaxis=dict(range=[0, 10]))

fig = dict(data=[trace], layout=layout)
plot(fig, image_height=1000, image_width=1000)

A problem with scaling the markersize is that the image is only correct as long as you don’t zoom in or out, because the markersize stays constant.
Therefore the cleaner approach would be to specify the size of the circles directly in data units.

Asked By: scleronomic



Drawing circles is probably your best bet. Updating markersize with each resize would be a bit cumbersome. Here’s something you could try for drawing circles

from plotly.offline import plot
import plotly.graph_objects as go

xy = [[4, 4], [1, 5], [2, 2]]
r = 0.1

fig = go.Figure()
kwargs = {'type': 'circle', 'xref': 'x', 'yref': 'y', 'fillcolor': 'black'}
points = [go.layout.Shape(x0=x-r, y0=y-r, x1=x+r, y1=y+r, **kwargs) for x, y in xy]

fig.update_xaxes(range=[0, 10])
fig.update_yaxes(range=[0, 10])
fig.update_layout(width=1000, height=1000)

Default (1st) and zoomed (2nd) view:

Answered By: busybear
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.