仅使用 Plotly Express 的堆叠条形图

Stacked Bar Graphs with only Plotly Express

我将数据存储在三个不同的列表中,如下所示:

labels = ['label1', 'label2', 'label3']
types = ['type1', 'type2', 'type3', 'type4', 'type5', 'type6']
counts = [[3,5,2,1,7,10], [2,2,4,1,7,2], [1,6,8,11,2,3]]

counts 列表包含每个标签的类型计数,例如:label1 有 3 个 type1,5 个 type2,...; label2 有 2 个 type1,2 个 type2,...等等

我可以使用 plotly.graph_objects 创建堆积条形图,但我想使用 plotly.express 创建此图。

我用 plotly.graph_objects 创建堆积条形图的代码:

import plotly.graph_objects as go

for i in range(len(types)):
    if i == 0:
        fig = go.Figure(go.Bar(x=labels, y=[sub[i] for sub in counts], name=types[i]))
    else:
        fig.add_trace(go.Bar(x=labels, y=[sub[i] for sub in counts], name=types[i]))

fig.update_layout(barmode='stack')
fig.show()

如何仅使用 plotly.express 获得相同的结果,因为我使用 plotly.express 创建所有其他图形并且不想导入 plotly.graph_objects

更新:我可以将我的数据传递到 pandas 数据框并使用以下代码创建带有 plotly.express 的图表:

import pandas as pd
import plotly.express as px

df = pd.DataFrame([count for sub in counts for count in sub],
                  index=pd.MultiIndex.from_product([labels,types]),
                  names=['label', 'type'],
                  columns=['count'])
fig = px.bar(df, x=df.index.get_level_values('label'),
                 y='count',
                 color=df.index.get_level_values('type'),
                 barmode='stack')
fig.show()

但是没有 pandas 有什么办法吗?

您可以创建一个数据框并根据您的列表构建它。然后就简单了 Plotly Express

import plotly.express as px
import pandas as pd

labels = ["label1", "label2", "label3"]
types = ["type1", "type2", "type3", "type4", "type5", "type6"]
counts = [[3, 5, 2, 1, 7, 10], [2, 2, 4, 1, 7, 2], [1, 6, 8, 11, 2, 3]]

px.bar(
    pd.DataFrame(counts, columns=types, index=labels).reset_index().melt(id_vars="index"),
    x="index",
    y="value",
    color="variable",
)

numpy

import numpy as np

c = np.array(counts)
px.bar(x=np.tile(labels, c.shape[1]), color=np.repeat(types, c.shape[0]), y=c.T.flatten())