You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:48:04