如何创建以平均值为基轴的 Plotly 基准柱状图

How to create Plotly benchmarking bar chart with average value as base axis

我想开发一种很酷的基准图表,它将在 Y 轴上显示一些类别(在我的例子中是公司),在 X 轴上将有一些数值代表给定的测量值,例如每日销售产品数量。

我想以一种方式呈现它,即在 X 轴中间的某个位置显示一条长直线,代表我测量的平均值 - 然后我想将它用作我的基轴.对于每个类别,我将显示一个条形图,其平均线的值为 0(开始),结束将是给定类别的测量值与平均值(类别测量值 - 平均值)之间的差值。 下面是我在 PowerPoint 中绘制的示例。我希望它能让您简要了解我想要实现的目标。

老实说,我不知道 Plotly 库是否可行。我最初的想法是,我需要将平均线作为一个单独的元素放在给定图表上,然后我需要以某种方式动态计算给定类别条形图的开始和结束并将其放在图表上。但是不知道有没有意义。

你能帮我处理这个案子吗?

假设您有一些 data,

import pandas as pd
import plotly.graph_objects as go

data = pd.DataFrame({
    'companies': ['Comp1', 'Comp2', 'Comp3', 'Comp4'], 
    'performance': [26, 37, 54, 19]
})

# if you want a manual benchmark
benchmark_value = 40

# or in case the average
benchmark_value = data['performance'].mean()

data['benchmark_score'] = data['performance'] - benchmark_value

fig = go.Figure(
    go.Bar(
        y=data['companies'],
        x=data['benchmark_score'],
        marker=dict(color=['red' if score < 0 else 'green' for score in data['benchmark_score']]),
        orientation='h',
        text=data['benchmark_score'],
    )
)

# add vertical line at 0 but with benchmark value as annotation
fig.add_vline(x=0, line_width=2, line_dash="dash", annotation_text=benchmark_value)

fig.show()

输出:

您可以自定义一些属性,例如条形颜色和文本注释。