python 中带有注释的双向条形图 plotly

bi-directional bar chart with annotation in python plotly

我有一个 pandas 数据集,其中包含可以使用此创建的玩具版本

#creating a toy pandas dataframe
s1 = pd.Series(['dont have a mortgage',-31.8,'have mortgage',15.65])
s2 = pd.Series(['have utility bill arrears',-21.45,'',0])
s3 = pd.Series(['have interest only mortgage',-19.59,'',0])
s4 = pd.Series(['bank with challenger bank',-19.24,'bank with a traditional bank',32.71])

df = pd.DataFrame([list(s1),list(s2),list(s3),list(s4)], columns = ['label1','value1','label2','value2'])

我想创建一个看起来像我在 excel

中一起破解的这个版本的条形图

我希望能够提供 RGB 值来自定义左右栏的两种颜色(当前为蓝色和橙色)

我使用“fig.add_trace(go.Bar”尝试了不同的版本,但我对 plotly 是全新的,无法在一行中使用不同颜色的条并在每个条下进行注释。

非常感谢所有帮助!

谢谢

要创建双面条形图,您可以创建两个共享 x 轴和 y 轴的子图。每个子图都是一个带有指定标记颜色的水平条形图

import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots

# define data set
s1 = pd.Series(['dont have a mortgage',-31.8,'have mortgage',15.65])
s2 = pd.Series(['have utility bill arrears',-21.45,'',0])
s3 = pd.Series(['have interest only mortgage',-19.59,'',0])
s4 = pd.Series(['bank with challenger bank',-19.24,'bank with a traditional bank',32.71])
df = pd.DataFrame([list(s1),list(s2),list(s3),list(s4)], columns = ['label1','value1','label2','value2'])

# create subplots
fig = make_subplots(rows=1, cols=2, specs=[[{}, {}]], shared_xaxes=True,
                    shared_yaxes=True, horizontal_spacing=0)

fig.append_trace(go.Bar(y=df.index, x=df.value1, orientation='h', width=0.4, showlegend=False, marker_color='#4472c4'), 1, 1)
fig.append_trace(go.Bar(y=df.index, x=df.value2, orientation='h', width=0.4, showlegend=False, marker_color='#ed7d31'), 1, 2)
fig.update_yaxes(showticklabels=False) # hide all yticks

需要单独添加的注释:

annotations = []
for i, row in df.iterrows():
    if row.label1 != '':
        annotations.append({
            'xref': 'x1',
            'yref': 'y1',
            'y': i,
            'x': row.value1,
            'text': row.value1,
            'xanchor': 'right',
            'showarrow': False})
        annotations.append({
            'xref': 'x1',
            'yref': 'y1',
            'y': i-0.3,
            'x': -1,
            'text': row.label1,
            'xanchor': 'right',
            'showarrow': False})            
    if row.label2 != '':
        annotations.append({
            'xref': 'x2',
            'yref': 'y2',
            'y': i,
            'x': row.value2,
            'text': row.value2,
            'xanchor': 'left',
            'showarrow': False})  
        annotations.append({
            'xref': 'x2',
            'yref': 'y2',
            'y': i-0.3,
            'x': 1,
            'text': row.label2,
            'xanchor': 'left',
            'showarrow': False})

fig.update_layout(annotations=annotations)
fig.show()