如何使用Plotly为箱线图每行的不同组填充指定颜色
问题解决:Plotly箱线图按行(Facet Row)设置指定填充色
核心问题分析
你当前代码用color='Species'结合color_discrete_map把所有箱线统一设为黑色,又通过update_traces批量设置填充色,导致无法按每行(对应不同Species)区分填充颜色。要实现每行高亮填充、黑色轮廓的效果,需要手动遍历每个绘图轨迹,根据其所属Species匹配对应填充色,同时单独设置轮廓为黑色。
修改后的代码
import pandas as pd import plotly.express as px df = pd.read_csv(path) # 定义每个Species对应的填充色 fill_colors = {'Csi':'#DF9720', 'Ph':'#138245', 'Qc':'#A0D855'} outline_color = '#000000' # 统一黑色轮廓 # 绘制箱线图,此处无需color='Species',避免自动分配颜色干扰自定义设置 fig = px.box(df, x="RD", y="PRI", facet_col='DARC', facet_row='Species', width=800, height=930) # 遍历每个绘图轨迹,设置填充色、轮廓及样式 for data in fig.data: data["width"] = 17 data['whiskerwidth'] = 0.5 # 根据轨迹名称(对应Species)匹配填充色 data['fillcolor'] = fill_colors.get(data.name, '#FFFFFF') # 统一设置所有线条(箱线、须线、中位数线等)为黑色 data['line'] = dict(color=outline_color) # 标记点设为黑色,保持风格统一 data['marker'] = dict(size=5, color=outline_color) fig.update_layout(paper_bgcolor='white', plot_bgcolor='white', margin=dict(l=20, r=20, t=20, b=20), title=None, yaxis_range=[-0.2,0.05], font=dict(family="Arial", size=15, color='black')) fig.update_xaxes(showline=True, linewidth=1.2, linecolor='black', mirror=True, ticks='outside', tickfont_size=16, tickfont_family='Arial', tick0=0, dtick=25) fig.update_yaxes(showline=True, linewidth=1.2, linecolor='black', mirror=True, ticks='outside', tickfont_size=16, tickfont_family='Arial', tick0=-0.20, dtick=0.05) fig.show()
关键修改说明
- 移除
color='Species'和color_discrete_map,避免Plotly自动配色覆盖自定义设置 - 用
fill_colors字典存储每个物种对应的填充色,通过轨迹名称精准匹配 - 统一设置
line.color为黑色,确保箱线、须线、中位数线的轮廓一致 - 标记点颜色同步设为黑色,保持整体视觉风格统一
内容的提问来源于stack exchange,提问作者Gabriel Mulero
相关产品推荐
相关产品推荐

