如何在x轴为日期、y轴为对数的Seaborn图表中添加文本?
问题与解决方案:在对数y轴+日期x轴的Seaborn图中添加文本
问题背景
我绘制了一幅股票折线图,x轴为日期,y轴采用对数刻度。相关数据片段、绘图代码如下:
数据片段
DATE STOCK CODE HIGHEST VALUE 0 2019-01-02 GENTS.E 1.80 882 2019-01-02 IHLGM.E 1.09 1197 2019-01-02 ISGYO.E 4.60 126 2019-01-02 ALBRK.E 3.80 504 2019-01-02 DOHOL.E 2.87
绘图代码
sns.set(font_scale=1.5) sns.set_theme(style="ticks", palette="bright") ax= sns.relplot( data=part1_19H, x="DATE", y="HIGHEST PRICE", hue="STOCK CODE", height=10, aspect=2, kind="line", legend=True, marker="o" ).set(title="First 20 Stocks of Q1 2019", ylabel="Highest Price", xlabel=None) plt.yscale('log') plt.xticks(rotation=45)
尝试用plt.text("2019-03-29", 4.10, 'Some text')添加文本时,出现错误:Failed to convert value(s) to axis units: '2019-03-29'。同时y轴为对数刻度,直接用非对数数值定位也可能出错,请问如何通过日期和非对数坐标在图表中定位文本?
解决方案
核心问题分析
- 日期字符串不被识别:Matplotlib的日期轴无法直接解析字符串格式的日期,必须转换为
datetime对象或Matplotlib兼容的日期数值。 - 对数y轴的坐标映射:
plt.text的上下文适配问题可能导致对数轴坐标映射错误,改用relplot返回的FacetGrid中的轴对象添加文本,可自动处理对数刻度的坐标转换。
具体实现步骤
- 导入
datetime模块用于日期格式转换; - 从FacetGrid对象中提取实际绘图的轴;
- 将目标日期字符串转换为
datetime对象; - 调用轴对象的
text方法,直接传入原始y值(Matplotlib会自动适配对数刻度)。
修改后的完整代码
import seaborn as sns import matplotlib.pyplot as plt from datetime import datetime sns.set(font_scale=1.5) sns.set_theme(style="ticks", palette="bright") # relplot返回FacetGrid对象,用g指代更清晰 g = sns.relplot( data=part1_19H, x="DATE", y="HIGHEST PRICE", hue="STOCK CODE", height=10, aspect=2, kind="line", legend=True, marker="o" ).set(title="First 20 Stocks of Q1 2019", ylabel="Highest Price", xlabel=None) plt.yscale('log') plt.xticks(rotation=45) # 获取实际绘图的轴对象 ax = g.axes[0][0] # 将日期字符串转换为Matplotlib可识别的datetime对象 target_date = datetime.strptime("2019-03-29", "%Y-%m-%d") # 添加文本,直接传入原始y值,自动适配对数刻度 ax.text(target_date, 4.10, 'Some text', fontsize=12, ha='center', va='bottom') plt.show()
额外说明
- 如果DataFrame中的
DATE列已经是datetime类型,直接传入对应日期值即可,无需额外转换; ha(水平对齐)和va(垂直对齐)参数可根据需求调整,比如ha='right'、va='top'。
内容的提问来源于stack exchange,提问作者Emrecan Ulu
相关产品推荐
相关产品推荐

