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

如何在Plotly中为X轴上的单个箱线图设置颜色?

解决Plotly Express箱线图color参数的KeyError问题

你遇到的KeyError: (nan, '', '', '')是因为issuer.operator.name列中存在缺失值(NaN)或者空字符串,Plotly在尝试根据这些无效值分组配色时,无法识别对应的键,所以抛出了错误。下面给你几个可行的解决方案:

方案1:先清理数据中的缺失/空值

这是最直接的解决办法,先处理掉issuer.operator.name列里的无效值,再画图:

步骤1:检查数据情况

先确认列里的空值和空字符串数量:

print("NaN数量:", df["issuer.operator.name"].isna().sum())
print("各值分布:\n", df["issuer.operator.name"].value_counts(dropna=False))

步骤2:清理数据

你可以选择删除包含空值的行,或者把空值/空字符串替换成统一的默认值(比如"Unknown"):

# 方法A:删除空值行
df_clean = df.dropna(subset=["issuer.operator.name"])

# 方法B:替换空值和空字符串为"Unknown"
df_clean = df.copy()
df_clean["issuer.operator.name"] = df_clean["issuer.operator.name"].fillna("Unknown").replace("", "Unknown")

步骤3:用清理后的数据集画图

import plotly.express as px
fig = px.box(df_clean, x="issuer.operator.name", y="validity_period", 
             color="issuer.operator.name", points='all', log_y=True, 
             width=2000, height=1000, template="simple_white")
fig.show()

方案2:自定义颜色映射,手动控制分组颜色

如果不想修改原始数据,你可以创建一个颜色映射字典,指定每个有效运营商的颜色,同时给无效值分配一个默认颜色:

import plotly.express as px

# 获取所有非空的唯一运营商名称
unique_ops = df["issuer.operator.name"].dropna().unique()
# 用Plotly内置的定性颜色序列创建映射,也可以自定义颜色值
color_map = {op: px.colors.qualitative.D3[i] for i, op in enumerate(unique_ops)}
# 给空值/空字符串分配灰色
color_map["Unknown"] = "#888888"

# 先处理数据中的无效值
df_clean = df.copy()
df_clean["issuer.operator.name"] = df_clean["issuer.operator.name"].fillna("Unknown").replace("", "Unknown")

# 画图时指定color_discrete_map参数
fig = px.box(df_clean, x="issuer.operator.name", y="validity_period", 
             color="issuer.operator.name", points='all', log_y=True, 
             width=2000, height=1000, template="simple_white",
             color_discrete_map=color_map)
fig.show()

方案3:用Plotly Graph Objects手动构建图表(更灵活)

如果需要更精细的控制,你可以直接使用Plotly的Graph Objects API,逐个添加箱线图trace并设置颜色:

import plotly.graph_objects as go

# 获取所有非空的运营商名称
operators = df["issuer.operator.name"].dropna().unique()
# 准备颜色序列(循环使用避免颜色不够)
colors = px.colors.qualitative.D3

fig = go.Figure()

for idx, op in enumerate(operators):
    # 筛选当前运营商的数据
    op_data = df[df["issuer.operator.name"] == op]
    # 添加箱线图trace,设置颜色
    fig.add_trace(go.Box(
        y=op_data["validity_period"],
        name=op,
        boxpoints='all',
        marker_color=colors[idx % len(colors)],
        yaxis_type="log"
    ))

# 设置布局
fig.update_layout(
    width=2000,
    height=1000,
    template="simple_white",
    xaxis_title="issuer.operator.name",
    yaxis_title="validity_period"
)

fig.show()

以上三种方法都能解决你的问题,优先推荐方案1,因为数据清理是可视化前的常规操作,能避免后续更多潜在问题。

内容的提问来源于stack exchange,提问作者Cloud9

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 05:17:48