in c3dm/tools/vis_utils.py [0:0]
def visdom_plotly_pointclouds( viz, pcl, visdom_env,
title=None,
markersize=2,
nmax=5000,
sticks=None,
win=None,
autocolor=False,
in_subplots=False,
height=500,
width=500,
normalise=False ):
if sticks is not None:
pcl = { k:extend_to_3d_skeleton_simple(v,sticks)[0] \
for k,v in pcl.items() }
npcl = len(pcl)
rgb = np.linspace(0,1,10)
rgb = np.array([rgb[i%10] for i in range(npcl)])
if in_subplots:
cols = npcl
else:
cols = 1
titles = [None]*cols; titles[0] = title
fig = make_subplots(
rows = 1, cols = cols,
specs=[[{"type": "scene"}]*cols],
subplot_titles=titles,
column_widths=[1.]*cols,
)
for pcli, ((pcl_name, pcl_data),color) in enumerate(zip(pcl.items(), rgb)):
if pcl_data.shape[1] > nmax:
with NumpySeedFix():
prm = np.random.permutation(pcl_data.shape[1])[0:nmax]
pcl_data = pcl_data[:,prm]
if pcl_data.shape[0]==6:
# we have color
pcl_color = np.minimum(np.maximum(pcl_data[3:],0.),1.)
pcl_data = pcl_data[:3]
pcl_color = [(255.*c).astype(int).tolist() for c in pcl_color.T]
marker=dict(
size=markersize,
color=pcl_color,
opacity=1.)
else:
marker=dict(
size=markersize,
color=color,
colorscale='Spectral',
opacity=1.)
if normalise:
pcl_data -= pcl_data.mean(axis=1, keepdims=True)
pcl_data /= (pcl_data.max(axis=1) - pcl_data.min(axis=1)).max()
pcl[pcl_name] = pcl_data
fig.add_trace(
go.Scatter3d(
x=pcl_data[0, :],
y=pcl_data[1, :],
z=pcl_data[2, :],
mode='markers',
name=pcl_name,
visible=True,
marker=marker,
),
row = 1,
col = pcli+1 if in_subplots else 1
)
pcl_cat = np.concatenate(list(pcl.values()),axis=1)[:3]
pcl_c = pcl_cat.mean(1)
maxextent = (pcl_cat.max(axis=1) - pcl_cat.min(axis=1)).max()
bounds = np.stack((pcl_c-maxextent, pcl_c+maxextent))
height = height
width = width * cols
fig.update_layout(height = height, width = width,
scene = dict(
xaxis=dict(range=[bounds[0,0],bounds[1,0]]),
yaxis=dict(range=[bounds[0,1],bounds[1,1]]),
zaxis=dict(range=[bounds[0,2],bounds[1,2]]),
aspectmode='cube',
)
)
# print(win)
viz.plotlyplot(fig, env=visdom_env, win=win)
return win