matplotlib散点图如何使用自定义指定颜色生成对应字母的图例
实现方案
你可以通过手动构造自定义图例元素的方式实现需求,同时可以通过复用固定的字母-颜色映射字典,保证多张图表的颜色编码规则一致。
完整实现代码
import pandas as pd import matplotlib.pyplot as plt from matplotlib.patches import Patch # 原始数据 data = {'letter': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X'], 'color': ['#FF0000', '#FF7F00', '#FFD400', '#FFFF00', '#BFFF00', '#6AFF00', '#00EAFF', '#0095FF', '#0040FF', '#AA00FF', '#FF00AA', '#EDB9B9', '#E7E9B9', '#B9EDE0', '#B9D7ED', '#DCB9ED', '#8F2323', '#8F6A23', '#4F8F23', '#23628F', '#6B238F', '#000000', '#737373', '#CCCCCC'], 'percent': [0.59, 0.569, 0.343, 0.791, 0.099, 0.047, 0.387, 0.232, 0.262, 0.177, 0.522, 0.317, 0.252, 0.617, 0.644, 0.571, 0.382, 0.12, 0.281, 0.855, 0.283, 1.0, 0.844, 0.499], 'score': [0.541, 0.399, 0.625, 0.584, 0.83, 0.859, 0.62, 0.618, 0.545, 0.536, 0.513, 0.563, 0.592, 0.276, 0.037, 0.0, 0.5, 0.653, 0.485, 0.213, 0.44, 0.0, 0.308, 0.35]} df = pd.DataFrame(data) # 1. 生成固定的字母-颜色映射字典,多图可复用保证编码一致 color_map = df.set_index('letter')['color'].to_dict() # 2. 绘制散点图 ax = df.plot.scatter(x='percent', y='score', color=df['color']) # 3. 构造自定义图例元素(纯色方块+对应字母) legend_elements = [Patch(facecolor=color, label=letter) for letter, color in color_map.items()] # 4. 添加图例到图表右侧,避免遮挡绘图区域 ax.legend( handles=legend_elements, bbox_to_anchor=(1.05, 1), # 图例定位到图右侧外 loc='upper left', borderaxespad=0, # ncol=2 # 如果图例太长可以加这个参数拆分为多列 ) # 调整布局避免图例被截断 plt.tight_layout() plt.show()
关键说明
- 颜色规则统一:把
color_map字典单独抽离为公共变量,所有同系列图表都使用该字典获取对应字母的颜色,即可保证跨图表的颜色编码完全一致。 - 图例样式:通过
Patch构造的图例元素就是你需要的纯色方块+对应文字的形式,可通过调整ncol、fontsize等参数适配不同的展示需求。
内容的提问来源于stack exchange,提问作者Steele Farnsworth
相关产品推荐
相关产品推荐

