2 votes

Plotly : Comment faire un histogramme empilé en 3D ?

J'ai plusieurs histogrammes que j'ai réussi à tracer en utilisant complot comme ça :

fig.add_trace(go.Histogram(x=np.array(data[key]), name=self.labels[i]))

Je voudrais créer quelque chose comme cet histogramme empilé en 3D mais avec la différence que chaque histogramme 2D à l'intérieur est un véritable histogramme et pas seulement une ligne codée en dur (mes données sont de la forme [0.5 0.4 0.5 0.7 0.4] donc utiliser directement l'histogramme est très pratique)

Notez que ce que je demande n'est pas similaire à este et n'est donc pas non plus identique à este . Dans l'exemple de matplotlib, les données sont présentées directement dans un tableau 2D et l'histogramme est la troisième dimension. Dans mon cas, je voulais alimenter une fonction avec de nombreux histogrammes déjà calculés.

2voto

vestland Points 3267

L'extrait ci-dessous s'occupe à la fois du binning et du formatage de la figure afin qu'elle apparaisse comme un graphique 3D empilé utilisant plusieurs traces de go.Scatter3D y np.Histogram . L'entrée est un dataframe avec des nombres aléatoires utilisant np.random.normal(50, 5, size=(300, 4)) Nous pouvons parler davantage des autres détails si c'est quelque chose que vous pouvez utiliser :

Plot 1 : Angle 1

enter image description here

Plot 2 : Angle 2

enter image description here

Code complet :

# imports
import numpy as np
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
import plotly.io as pio

pio.renderers.default = 'browser'

# data
np.random.seed(123)
df = pd.DataFrame(np.random.normal(50, 5, size=(300, 4)), columns=list('ABCD'))

# plotly setup
fig=go.Figure()

# data binning and traces
for i, col in enumerate(df.columns):
    a0=np.histogram(df[col], bins=10, density=False)[0].tolist()
    a0=np.repeat(a0,2).tolist()
    a0.insert(0,0)
    a0.pop()
    a1=np.histogram(df[col], bins=10, density=False)[1].tolist()
    a1=np.repeat(a1,2)
    fig.add_traces(go.Scatter3d(x=[i]*len(a0), y=a1, z=a0,
                                mode='lines',
                                name=col
                               )
                  )
fig.show()

1voto

rpanai Points 2524

Malheureusement, vous ne pouvez pas utiliser go.Histogram dans un espace 3D, vous devez donc utiliser une autre méthode. J'ai utilisé go.Scatter3d et je voulais utiliser l'option pour remplir la ligne doc mais il y a un bug évident voir

import numpy as np
import plotly.graph_objs as go

# random mat
m = 6
n = 5
mat = np.random.uniform(size=(m,n)).round(1)

# we want to have the number repeated
mat = mat.repeat(2).reshape(m, n*2)

# and finally plot

x = np.arange(2*n)
y = np.ones(2*n)
fig = go.Figure()
for i in range(m):
    fig.add_trace(go.Scatter3d(x=x,
                               y=y*i,
                               z=mat[i,:],
                               mode="lines",
                               # surfaceaxis=1 # bug
                               )
                 )
fig.show()

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X