Matplotlib绘制散点图如何为每个赛事在色条中分配不同独立颜色
问题根因
- 你当前使用的
tab20c色谱仅包含20种独立颜色,而你统计的赛事条目共46个,颜色数量不足以覆盖全部分类,导致颜色重复、色条映射异常 - 色条默认展示空间不足,多标签重叠导致无法完整显示所有赛事名称
修复方案
更换支持更多颜色的色谱,同时调整画布、色条参数适配多标签展示,完整修改后代码如下:
import pandas as pd import collections import matplotlib.pyplot as plt if __name__ == '__main__': # 读取Excel文件 games_male_attendance = collections.OrderedDict() games_female_attendance = collections.OrderedDict() df = pd.read_excel("Olympic-dataset.xlsx", usecols=["Game_Discipline", "Male", "Female"]) for index, row in df.iterrows(): game_name = row["Game_Discipline"] male_attendance = row["Male"] female_attendance = row["Female"] if game_name not in games_male_attendance: games_male_attendance[game_name] = male_attendance if game_name not in games_female_attendance: games_female_attendance[game_name] = female_attendance list_male_attendance = list(games_male_attendance.values()) list_female_attendance = list(games_female_attendance.values()) classes = list(games_male_attendance.keys()) class_count = len(classes) # 更换为turbo色谱,内置256种独立颜色,完全覆盖46个分类需求 colors = plt.cm.get_cmap('turbo', class_count) # 调整画布尺寸,避免元素拥挤 plt.figure(figsize=(12, 8)) scatter = plt.scatter( y=list_male_attendance, x=list_female_attendance, c=range(class_count), cmap=colors, vmin=0, vmax=class_count-1 ) # 调整色条参数,拉长色条、缩小标签字体 cbar = plt.colorbar(scatter, fraction=0.046, pad=0.04) cbar.ax.set_yticks(range(class_count), labels=classes, fontsize=7) plt.ylabel("男子参赛人数") plt.xlabel("女子参赛人数") plt.title("各赛事男女参赛人数散点图") plt.show()
效果说明
修改后每个赛事都会映射唯一的独立颜色,色条可完整展示所有46个赛事名称,不再出现颜色重复、标签截断的问题。
内容的提问来源于stack exchange,提问作者Tilak Raj
相关产品推荐
相关产品推荐

