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

Matplotlib绘制柱状图按条件设色时Goddess队颜色未生效

问题描述

现有包含username、scores、team三列的数据集,team字段仅含Ambios、Goddess两个取值,需要绘制X轴为用户名、Y轴为分数、按队伍分组的柱状图。运行代码后Goddess队伍的柱形未按预设显示为蓝色,异常效果如下:
柱状图颜色异常效果

原实现代码:

import pandas as pd 
import matplotlib.pyplot as plt 

data = pd.read_excel("C:\\users\\USER\\Documents\\Dataset_file\\team_dataset.xlsx")

ambios = data[data['team'] == 'Ambios']
amb_user = data[data['team'] == 'Ambios']['username']
amb_scores = data[data['team'] == 'Ambios']['scores']

goddess = data[data['team'] == 'Goddess']
goddess_user = data[data['team'] == 'Goddess']['username']
goddess_scores = data[data['team'] == 'Goddess']['scores']

color_val = []
for i in data['team'].values:
    if i == 'Ambios':
        color_val.append('orange')
    elif i == 'Goddess':
        color_val.append('blue')

plt.style.use('ggplot')

plt.bar(amb_user,amb_scores,label='Ambios',color=color_val)
plt.bar(goddess_user,goddess_scores,label='Goddess',color=color_val)
plt.legend()
plt.show()
错误原因
  • 颜色列表长度不匹配:color_val是基于全量数据集生成的,长度等于数据集总行数。但两次调用plt.bar()分别只传入单支队伍的用户数据,绘制时matplotlib只会从头截取和当前柱数量相等的颜色值,绘制Goddess队伍时取到的还是列表前面对应Ambios的橙色值,根本读不到后面的蓝色配置。
  • 柱体重叠:两次plt.bar()没有设置X轴偏移,若存在同名用户,两个柱会完全重叠覆盖,也无法实现分组并排展示的效果。
修复代码

分组并排柱状图版本(符合按team分组展示需求)

import pandas as pd 
import matplotlib.pyplot as plt 
import numpy as np

data = pd.read_excel("C:\\users\\USER\\Documents\\Dataset_file\\team_dataset.xlsx")

# 取全量用户作为X轴基准,设置柱宽和位置偏移
all_users = data['username'].unique()
x_axis = np.arange(len(all_users))
bar_width = 0.35

# 对齐两个队伍的分数,避免用户顺序错乱
amb_scores = data[data['team'] == 'Ambios'].set_index('username').reindex(all_users)['scores'].fillna(0)
goddess_scores = data[data['team'] == 'Goddess'].set_index('username').reindex(all_users)['scores'].fillna(0)

plt.style.use('ggplot')
# 两个队伍的柱分别向左右偏移半个柱宽,各自指定固定颜色
plt.bar(x_axis - bar_width/2, amb_scores, width=bar_width, label='Ambios', color='orange')
plt.bar(x_axis + bar_width/2, goddess_scores, width=bar_width, label='Goddess', color='blue')

# 配置X轴刻度
plt.xticks(x_axis, all_users, rotation=45)
plt.legend()
plt.tight_layout() # 自动调整布局防止标签截断
plt.show()

单柱按队伍配色版本(无需并排分组时使用)

如果不需要两个队伍柱体并排,只需要每个用户的柱体匹配所属队伍颜色,可直接单次绘图,不需要拆分数据集:

import pandas as pd 
import matplotlib.pyplot as plt 
from matplotlib.patches import Patch

data = pd.read_excel("C:\\users\\USER\\Documents\\Dataset_file\\team_dataset.xlsx")

plt.style.use('ggplot')
# 直接映射每行数据对应的颜色
color_map = {'Ambios': 'orange', 'Goddess': 'blue'}
plt.bar(data['username'], data['scores'], color=data['team'].map(color_map))

# 手动创建图例
legend_handles = [
    Patch(color='orange', label='Ambios'),
    Patch(color='blue', label='Goddess')
]
plt.legend(handles=legend_handles)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:39:18