如何在Seaborn折线图上标注数据点数值?
为Seaborn折线图的数据点添加数值标注
问题描述
我尝试为Seaborn折线图的数据点标注数值,但未能成功实现。以下是我的折线图代码,期望通过代码实现如示例图所示的数值标注效果(示例图为手动标注的结果):
import matplotlib.pyplot as plt import seaborn as sns import matplotlib.dates as mdates fig, ax = plt.subplots(figsize = (12,5)) ax.set_title("Daily Closing Price") ax.set_ylabel("Values") ax.set_xlabel("Date") p1 = sns.lineplot(ax=ax, x='Date', y='Prev Close', data=result, hue='Symbol', markers=True, dashes=False, marker="o") plt.xticks(rotation=45,horizontalalignment='right',fontweight='light') locator = mdates.DayLocator(interval=1) p1.xaxis.set_major_locator(locator)
解决方案
要给每个数据点标注数值,可遍历折线图中的每个数据系列,用matplotlib的ax.text()方法在对应位置添加文本标注。针对你代码中hue='Symbol'的多系列场景,处理方式如下:
修改后的完整代码:
import matplotlib.pyplot as plt import seaborn as sns import matplotlib.dates as mdates fig, ax = plt.subplots(figsize=(12, 5)) ax.set_title("Daily Closing Price") ax.set_ylabel("Values") ax.set_xlabel("Date") # 绘制折线图 p1 = sns.lineplot(ax=ax, x='Date', y='Prev Close', data=result, hue='Symbol', markers=True, dashes=False, marker="o") # 遍历每个折线系列,添加数值标注 for line in ax.lines: # 获取当前系列的所有数据点坐标 x_data = line.get_xdata() y_data = line.get_ydata() # 逐个标注数值 for x, y in zip(x_data, y_data): # 调整文本位置避免与标记重叠,y轴偏移量可根据数据范围修改 ax.text(x, y + 0.1, f'{y:.2f}', ha='center', fontsize=8) plt.xticks(rotation=45, horizontalalignment='right', fontweight='light') locator = mdates.DayLocator(interval=1) p1.xaxis.set_major_locator(locator) plt.tight_layout() plt.show()
关键说明
ax.lines包含图中所有折线对象,遍历即可处理每个Symbol对应的系列line.get_xdata()和line.get_ydata()获取当前系列所有点的坐标ha='center'让文本水平居中于数据点,y+0.1是为了让标注在点的上方,避免重叠,可根据实际数据调整偏移量f'{y:.2f}'控制数值的小数位数,按需修改格式
内容的提问来源于stack exchange,提问作者user286076
相关产品推荐
相关产品推荐

