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
相关产品推荐
相关产品推荐

