如何为Plotly分组柱状图中的每个分组设置不同颜色
如何为Plotly分组柱状图中的每个分组设置不同颜色
没问题呀!你遇到的情况是因为Plotly Express默认对宽格式数据的每一列分配一个颜色组,而不是按你需要的行(也就是你的分组)来分配。要实现每个分组的所有柱子统一用同一种颜色、不同分组颜色不同的效果,我们只需要把数据转成长格式,再指定颜色映射到分组就行,具体操作如下:
步骤1:把宽格式数据转成长格式
你的原始数据是宽格式(每行对应一个分组,每列是该分组下的重复测量值),我们用pd.melt()把它转成长格式,让Plotly能识别分组作为颜色的维度:
import plotly.express as px import pandas as pd # 原始数据 data_media_pH = pd.DataFrame( [[8.33, 8.36, 8.36], [8.21, 8.18, 8.21], [7.50, 7.56, 7.64]], index=["4 °C", "37 °C", "37 °C + 5 % CO₂"] ) # 转成长格式:拆分数据并标记分组、样本序号 data_long = data_media_pH.reset_index().melt( id_vars='index', var_name='sample', # 标记每个分组内的第几个样本 value_name='pH' ).rename(columns={'index': 'group'}) # 把原索引列重命名为分组列
步骤2:绘制分组柱状图并按分组设置颜色
用长格式数据绘图时,指定color='group',这样每个分组的所有柱子会自动使用同一种颜色,配合barmode="group"保持分组排列的效果:
fig_media_pH = px.bar( data_long, x='group', y='pH', color='group', # 按分组分配颜色 barmode="group", # 也可以自定义分组颜色,列表颜色会和分组顺序一一对应 color_discrete_sequence=["#1f77b4", "#ff7f0e", "#2ca02c"] ) # 调整布局,和你原来的设置保持一致 fig_media_pH = fig_media_pH.update_layout( showlegend=False, # 不需要图例,分组已经在x轴显示 xaxis_title_text=None, yaxis_title_text="pH", width=900, height=800, margin=dict(t=0, b=0, l=0, r=0), yaxis_range=(6.5, 8.6) ) fig_media_pH.show()
为什么这个方法能解决问题?
转成长格式后,Plotly会把每个分组的所有测量值关联到同一个颜色维度(color='group'),而不是像原来的宽格式那样,把每一列的测量值作为独立的颜色维度。这样每个分组内的所有柱子就会共享同一种颜色,不同分组的颜色也会自动区分开。如果想要自定义具体颜色,直接修改color_discrete_sequence里的颜色值就可以了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

