如何为分组打印条形图中的条形图着色

2024-10-03 09:07:10 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我想用Python 3.9中的Plotly.express创建一个条形图。 我用熊猫创建了下表:

      idx  cat1  cat2  cat3   cat4
0       A  0.98  0.93  0.550  1.00
1       B  0.92  0.80  0.865  1.00
2       C  0.91  0.87  0.955  0.96

我有以下代码:

 # df is the pandas table
fig = px.bar(df,
        x = 'idx',
        y=['cat1', 'cat2', 'cat3', 'cat4']
    )

colors = ['#dc1a22', ] * 12
colors[2] = '#000000'
fig.update_traces(marker_color = colors, marker_line_color='rgb(8,48,107)',
                  marker_line_width=1.5, opacity=0.6)
    
fig.update_layout(barmode='group')

我想给#dc1a22中所有组中的所有条涂上颜色,第三个位置的条除外(颜色[2])

现实情况是,第一组和第二组中的所有酒吧都是dc1a22,第三组中的所有酒吧都是000000

是否有可能为分组图表中的单个条形图上色

这可能很重要:在未来,我会根据条形图的值为其上色

(0-0.5->;红色,0.5-0.9->;黄色,0.9-1->;绿色)


Tags: gtdflinefigupdatemarkercolor条形图
1条回答
网友
1楼 · 发布于 2024-10-03 09:07:10

您可以做的是使用循环一次添加一个跟踪,并将颜色列表和对应列名列表传递给每个go.bar对象。不幸的是,需要重置条形图的默认宽度,并且在分组模式下,条形图以overlay模式打印(这意味着如果在不更改偏移的情况下设置每个条形图的宽度,它们将重叠)

因此,还需要调整偏移,以确保条在x轴上围绕每个idx类别精确居中。如果钢筋宽度为0.2,则将四根钢筋的偏移量分别设置为[-0.4,-0.2,0,0.2]即可。这可能适用于任何宽度

import numpy as np
import pandas as pd
import plotly.graph_objs as go

## recreate the data
df = pd.DataFrame({'idx':['A','B','C'], 'cat1':[0.98,0.92,0.91], 'cat2':[0.93,0.80,0.87], 'cat3':[0.55,0.865,0.955], 'cat4':[1,1,0.96]})

fig = go.Figure()
indexes = ['A','B','C']
groups = ['cat1','cat2','cat3','cat4']
colors = ['#dc1a22','#dc1a22','#000000','#dc1a22']

## this can be generalized a bit better
width = 0.2
offset = [-0.4,-0.2,0,0.2]

for i in indexes:
    for g, c, o in zip(groups, colors, offset):
            fig.add_trace(
                go.Bar(x=df['idx'], y=df[g], marker_color=c, width=width, offset=o)
            )

fig.update_traces(
    marker_line_color='rgb(8,48,107)',
    marker_line_width=1.5, 
    opacity=0.6
)

fig.update_layout(
    xaxis_title='idx',
    yaxis_title='value',
    barmode='group', 
    showlegend=False
)

fig.show()

enter image description here

相关问题 更多 >