2017-02-17 2 views
2

У меня есть график Plotly Scatter3d(), и я хочу нарисовать линии между некоторыми из них. Физически говоря, у меня есть сеть, где у меня есть некоторые узлы, связанные с облигациями, и я хочу привлечь эти облигации. Как мне это сделать?Добавление определенных строк в график Plotly Scatter3d()

Scatter3d() поставляется с опцией mode='lines+markers', которая просто делает его графиком разметки «точка-и-линия», а не по умолчанию. Это не то, что я ищу. Я хочу предоставить список пары координат xyz, и я хочу получить набор строк в конце.

Вот моя функция для построения простого Scatter3d() сюжета:

def Splot3dPlotly(xyz): 
''' 
3D scatter plot using Plotly. 

:param xyz: (NPx3) array of xyz positions 
:return: A Plotly figure that can now be plotted as usual. 
''' 
xyz = np.reshape(xyz, (int(xyz.size/3), 3)) 
NN = int(sqrt(xyz.shape[0])) 

trace1 = go.Scatter3d(
    x=xyz[:,0], 
    y=xyz[:,1], 
    z=xyz[:,2], 
    mode = 'markers', # 'lines+markers', 
    marker=dict(color=range(NN*NN), colorscale='Portland') 
      ) 

data = [trace1] 
layout = go.Layout(
    margin=dict(
     l=0, 
     r=0, 
     b=0, 
     t=0 
    ) 
) 

fig = go.Figure(data=data, layout=layout) 
return fig 

ответ

1

Вы можете добавить второй след с линиями, и каждая пара координат отделена None для предотвращения Plotly от подключения следов.

import plotly.graph_objs as go 
import plotly 
plotly.offline.init_notebook_mode() 

#draw a square 
x = [0, 1, 0, 1, 0, 1, 0, 1] 
y = [0, 1, 1, 0, 0, 1, 1, 0] 
z = [0, 0, 0, 0, 1, 1, 1, 1] 

#the start and end point for each line 
pairs = [(0,6), (1,7)] 

trace1 = go.Scatter3d(
    x=x, 
    y=y, 
    z=z, 
    mode='markers', 
    name='markers' 
) 

x_lines = list() 
y_lines = list() 
z_lines = list() 

#create the coordinate list for the lines 
for p in pairs: 
    for i in range(2): 
     x_lines.append(x[p[i]]) 
     y_lines.append(y[p[i]]) 
     z_lines.append(z[p[i]]) 
    x_lines.append(None) 
    y_lines.append(None) 
    z_lines.append(None) 

trace2 = go.Scatter3d(
    x=x_lines, 
    y=y_lines, 
    z=z_lines, 
    mode='lines', 
    name='lines' 
) 

fig = go.Figure(data=[trace1, trace2]) 
plotly.offline.iplot(fig, filename='simple-3d-scatter') 

enter image description here

+0

Я принимаю это как ответ, так как нет других, но Plotly должны действительно нравится в том числе более беспроблемный способ построения 3d линий. Что-то вроде LineCollection от matplotlib было бы идеальным. – ap21

+0

@ ap21: Согласен, добавив, что «Нет» довольно хаки. Я видел, что вы попросили эту функцию на заговоре, надеюсь, они вас услышат! –

Смежные вопросы