如何为分类散点图添加带标题的自定义单行图例并任意定位?
散点图图例添加问题解决
问题背景
已实现按ABC列数值区间(<2浅蓝、2-4蓝色、4-6橙色、≥6棕色)分类的散点图,但无法正常添加符合要求的图例:
- 图例需包含标题
- 单行显示
- 使用
colour_names作为标签 - 可自定义位置
当前绘图代码:
import numpy as np import matplotlib.pyplot as plt # 假设df是已加载的DataFrame x = np.array(df['Date']) y = np.array(df['PR']) colours = np.array(df['colour']) colormap = np.array(['cyan', 'dodgerblue', 'orangered','brown']) colour_names = ['very less', 'less', 'good', 'more'] scatter = plt.scatter(x,y, c = colormap[colours], s = 5)
尝试添加图例的代码无效,且出现以下警告:
UserWarning: 未使用带数组的集合。请确保通过c参数指定要进行颜色映射的值。
WARNING:matplotlib.legend: 未找到可放入图例的带标签的元素。请注意,当不带参数调用legend()时,标签以下划线开头的元素会被忽略。
问题原因
scatter.legend_elements()方法仅适用于通过数值数组映射颜色的场景(即c参数传入数值而非直接的颜色值)。而当前代码直接传入了颜色数组,导致该方法无法生成有效的图例元素,因此无法正常显示图例。
解决方案
手动创建图例的标记元素,对应每个颜色类别,再添加图例并设置相关参数:
import numpy as np import matplotlib.pyplot as plt from matplotlib.lines import Line2D # 原有绘图代码 x = np.array(df['Date']) y = np.array(df['PR']) colours = np.array(df['colour']) colormap = np.array(['cyan', 'dodgerblue', 'orangered','brown']) colour_names = ['very less', 'less', 'good', 'more'] scatter = plt.scatter(x,y, c = colormap[colours], s = 5) # 手动创建图例handles legend_handles = [ Line2D([0], [0], marker='o', color='w', markerfacecolor=color, markersize=8, label=name) for color, name in zip(colormap, colour_names) ] # 添加图例:设置标题、单行显示、位置(loc可选值如'upper right'、'lower left'等) plt.legend( handles=legend_handles, title='ABC', ncol=4, # 设置为4列实现单行显示 loc='upper right' # 自定义位置,可根据需求修改 ) plt.show()
参数说明
ncol=4:将图例设置为4列,实现单行显示loc:设置图例位置,可选值包括'upper left'、'lower right'、'center'等,也可传入坐标元组如(0.5, 0.95)实现精确定位markersize:调整图例中标记的大小,可根据需求修改
内容的提问来源于stack exchange,提问作者Hatim Jhalodwala
相关产品推荐
相关产品推荐

