Plotly: Comment ajouter des carquois aux sous-graphiques?

Sep 27 2020

Je voudrais ajouter des carquois à une plotlyintrigue secondaire. Mais je ne trouve aucun moyen de le faire.

C'est ce que j'aimerais faire:

fig = plotly.subplots.make_subplots(rows=1, cols=2)
    
    
x,y = np.meshgrid(np.arange(0, 2, .2), np.arange(0, 2, .2))
u = np.cos(x)*y
v = np.sin(x)*y
    
quivers = ff.create_quiver(x, y, u, v)
    
fig.add_trace(data=quivers.data,col=1,row=1)

Le problème est qu'il add_tracen'accepte pas l'argument data et add_tracesn'accepte pas les arguments col et row.

Lors du lancement de ce morceau de code, j'obtiens l'erreur suivante:

TypeError: add_trace() got an unexpected keyword argument 'data'

Merci!

Réponses

2 vestland Sep 28 2020 at 03:37

Il semble que les objets de figure complets ne peuvent pas être utilisés pour configurer des sous-graphiques à l'aide de make_subplots(). Et comme vous l'avez montré, fig.add_trace()ne peut pas être utilisé directement avec les données d'une ff.create_quiver()figure. Ce qui fonctionnera cependant, c'est d'inclure un go.Scatterélément unique pour chaque élément x et y dans fig1.data:

'x': [0.0, 0.0, None, ..., 1.7591036229552444, 1.7526465527333175, None],
'y': [0.0, 0.0, None, ..., 1.9752925735580753, 1.9216800167812427, None]

Cela peut sembler un peu compliqué, mais ce n'est vraiment pas du tout. Faites-en deux ff.create_quiver() figureset utilisez ceci pour chacun d'eux:

# add all fig1.data as individual traces in fig at row=1, col=1
for d in fig1.data:
    subplots.add_trace(go.Scatter(x=d['x'], y=d['y']),
                  row=1, col=1)

L'utilisation de l'extrait ci-dessous produira la configuration de sous-tracé suivante avec 1 ligne et deux colonnes. Même les formes de flèche pour toutes les lignes sont incluses.

Terrain

Code complet

import numpy as np
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.figure_factory as ff

# data
x,y = np.meshgrid(np.arange(0, 2, .2), np.arange(0, 2, .2))
u = np.cos(x)*y
v = np.sin(x)*y

# quiver plots
fig1 = ff.create_quiver(x, y, u, v)
fig2 = ff.create_quiver(x, y, u*0.9, v*1.1)
    
# subplot setup
subplots = make_subplots(rows=1, cols=2)

# add all fig1.data as individual traces in fig at row=1, col=1
for d in fig1.data:
    subplots.add_trace(go.Scatter(x=d['x'], y=d['y']),
                  row=1, col=1)

# add all fig2.data as individual traces in fig at row=1, col=2
for d in fig1.data:
    subplots.add_trace(go.Scatter(x=d['x'], y=d['y']),
                  row=1, col=2)
subplots.show()
1 RichieV Sep 27 2020 at 22:35

J'ai trouvé une solution dans la page Web de l'intrigue en ajustant manuellement les axes au lieu de les utiliser make_subplots.

import numpy as np
import plotly.figure_factory as ff
import plotly.graph_objects as go

x,y = np.meshgrid(np.arange(0, 2, .2), np.arange(0, 2, .2))
u = np.cos(x)*y
v = np.sin(x)*y

fig1 = ff.create_quiver(x, y, u, v, name='trace1')
fig2 = ff.create_quiver(x, y, u*0.9, v*2, name='trace2')


for i in range(len(fig1.data)):
    fig1.data[i].xaxis = 'x1'
    fig1.data[i].yaxis = 'y1'

for i in range(len(fig2.data)):
    fig2.data[i].xaxis = 'x2'
    fig2.data[i].yaxis = 'y2'

fig1.layout.xaxis1.update({'anchor': 'y1', 'domain': [0.55, 1]})
# apparently [0.55, 1] is relative to the full chart's dimensions
fig1.layout.yaxis1.update({'anchor': 'x1'})

fig2['layout']['xaxis2'] = {'anchor': 'y2', 'domain': [0, 0.45]}
fig2['layout']['yaxis2'] = {'anchor': 'x2'}

fig = go.Figure()
fig.add_traces([fig1.data[0], fig2.data[0]])
fig.layout.update(fig1.layout)
fig.layout.update(fig2.layout)