Plotly:如何制作 3D 堆叠直方图?
Plotly: How to make a 3D stacked histogram?
我有几个使用 plotly 成功绘制的直方图,如下所示:
fig.add_trace(go.Histogram(x=np.array(data[key]), name=self.labels[i]))
我想创建类似 this 3D stacked histogram 的东西,但不同之处在于内部的每个 2D 直方图都是真实的直方图,而不仅仅是硬编码的线(我的数据是 [0.5 0.4 0.5 0.7 0.4]
的形式,所以使用直方图很方便)
请注意,我要问的与 this and therefore also not the same as this 不相似。在 matplotlib 示例中,数据直接呈现在二维数组中,因此直方图是第三维。在我的例子中,我想为一个函数提供许多已经计算出的直方图。
很遗憾,您不能在 3D space 中使用 go.Histogram
,因此您应该使用其他方法。我使用了 go.Scatter3d
并且我想使用该选项来填充行 doc but there is an evident bug see
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()
下面的代码片段负责图形的合并和格式设置,因此它显示为使用 go.Scatter3D
和 np.Histogram
的多个轨迹的堆叠 3D 图表。
输入是使用 np.random.normal(50, 5, size=(300, 4))
随机数的数据框
如果您可以使用,我们可以讨论更多其他细节:
地块 1: 角度 1
地块 2: 角度 2
完整代码:
# 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()
我有几个使用 plotly 成功绘制的直方图,如下所示:
fig.add_trace(go.Histogram(x=np.array(data[key]), name=self.labels[i]))
我想创建类似 this 3D stacked histogram 的东西,但不同之处在于内部的每个 2D 直方图都是真实的直方图,而不仅仅是硬编码的线(我的数据是 [0.5 0.4 0.5 0.7 0.4]
的形式,所以使用直方图很方便)
请注意,我要问的与 this and therefore also not the same as this 不相似。在 matplotlib 示例中,数据直接呈现在二维数组中,因此直方图是第三维。在我的例子中,我想为一个函数提供许多已经计算出的直方图。
很遗憾,您不能在 3D space 中使用 go.Histogram
,因此您应该使用其他方法。我使用了 go.Scatter3d
并且我想使用该选项来填充行 doc but there is an evident bug see
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()
下面的代码片段负责图形的合并和格式设置,因此它显示为使用 go.Scatter3D
和 np.Histogram
的多个轨迹的堆叠 3D 图表。
输入是使用 np.random.normal(50, 5, size=(300, 4))
随机数的数据框
如果您可以使用,我们可以讨论更多其他细节:
地块 1: 角度 1
地块 2: 角度 2
完整代码:
# 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()