Saya memiliki kumpulan data panda dengan versi mainan yang dapat dibuat dengan ini

#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'])

Saya ingin membuat diagram batang yang terlihat seperti versi ini yang saya retas bersama di excel

enter image description here

Saya ingin dapat memberikan nilai RGB untuk menyesuaikan dua warna untuk bilah kiri dan kanan (saat ini biru dan oranye)

Saya mencoba versi yang berbeda menggunakan "fig.add_trace(go.Bar" tetapi saya baru mengenal plotly dan tidak bisa mendapatkan apa pun untuk bekerja dengan bilah berwarna berbeda pada satu baris dengan anotasi di bawah setiap bilah.

Semua bantuan sangat dihargai!

Terima kasih

1
Michael K 9 Mei 2021, 22:46

1 menjawab

Jawaban Terbaik

Untuk membuat bagan batang dua sisi, Anda dapat membuat dua subplot dengan sumbu x dan y yang dibagikan. Setiap subplot adalah bagan batang horizontal dengan warna penanda tertentu

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

Anotasi perlu ditambahkan secara terpisah:

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()
1
Pascalco 10 Mei 2021, 16:50