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

如何基于列值为Plotly go.Bar指定调色板颜色(未知类别数)

解决Plotly go.Bar动态根据Category分配调色板颜色的问题

直接把Category字符串列传给marker_color是行不通的,Plotly没法直接识别类别字符串作为颜色值。你需要先把每个类别映射到具体的颜色,不管类别数量有多少,都可以按下面的步骤实现:

实现步骤

  1. 提取所有唯一类别:从DataFrame中获取Category列的所有唯一值,不用提前知道数量。
  2. 匹配对应数量的调色板颜色:用Plotly内置的定性调色板(比如qualitative.Pastel、qualitative.D3等),根据类别数量提取对应数量的颜色;如果需要自定义调色板,也可以自己定义颜色列表。
  3. 创建类别-颜色映射字典:把唯一类别和对应颜色一一对应起来。
  4. 转换Category列为颜色值:用映射字典把原DataFrame的Category列转换成具体的颜色字符串,再传给marker_color。

完整代码示例

import plotly.graph_objects as go
import plotly.colors as pc
import pandas as pd

# 用你自己的challenge_count_df替换下面的示例数据
challenge_count_df = pd.DataFrame({
    "Challenge": ["Chal1", "Chal2", "Chal3", "Chal4"],
    "Count": [10, 20, 15, 25],
    "Category": ["A", "B", "A", "C"]
})

# 1. 获取所有唯一类别
unique_categories = challenge_count_df["Category"].unique()

# 2. 从Plotly内置调色板取对应数量的颜色(这里用Pastel调色板)
# 如果类别数量超过调色板长度,会自动循环重复颜色
palette = pc.qualitative.Pastel
colors = [palette[i % len(palette)] for i in range(len(unique_categories))]

# 3. 创建类别到颜色的映射字典
color_map = dict(zip(unique_categories, colors))

# 4. 将Category列转换为对应的颜色
challenge_count_df["Color"] = challenge_count_df["Category"].map(color_map)

# 绘制条形图
fig = go.Figure()
fig.add_trace(go.Bar(
    x=challenge_count_df["Challenge"],
    y=challenge_count_df["Count"],
    marker_color=challenge_count_df["Color"],
    # 可选:hover时显示类别信息
    hovertext=challenge_count_df["Category"],
    hoverinfo="x+y+text"
))

fig.update_layout(title="按类别着色的挑战数量条形图")
fig.show()

自定义调色板的情况

如果不想用Plotly内置调色板,可以自己定义颜色列表,比如:

# 自定义颜色列表
custom_palette = ["#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FFEAA7"]
# 同样按类别数量取颜色,超出的话循环
colors = [custom_palette[i % len(custom_palette)] for i in range(len(unique_categories))]

这样不管你的Category有多少个不同的值,都能自动分配对应的颜色,保证相同类别用同一种颜色。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:45:40