You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib中基于右侧次坐标轴实现曲线终点标注及配色

Matplotlib曲线标签右侧对齐优化方案

需要在Matplotlib绘图中实现以下效果:

  • 各曲线标签放置在图表右侧的次y轴区域
  • 标签高度与对应曲线终点高度一致
  • 标签颜色与曲线颜色匹配

此前使用annotate方法实现时,存在标签落入图表内部、部分标签重叠的问题(示例代码如下):

import matplotlib.pyplot as plt
import numpy as np

l = ['label {:d}'.format(i) for i in range(1,5)]

x = [0,1]
yy = np.transpose([np.arange(1,5),np.arange(1,5)])
l2 = 'overlap'
y2 = [3.95,3.95]

fig, ax = plt.subplots()
for y,l in zip(yy,l):
    ax.plot(x,y)
    ax.annotate(xy=(x[-1],y[-1]), xytext=(20,0), textcoords='offset points', text=l, va='center')
    
ax.plot(x,y2)
ax.annotate(xy=(x[-1],y2[-1]), xytext=(20,0), textcoords='offset points', text=l2, va='center')

plt.show()

优化实现思路

通过创建隐藏的次y轴定位标签,既保证标签在图表外部,又能完美对齐曲线终点高度,同时可通过微调避免重叠:

  1. 绘制主曲线时,记录每条曲线的颜色和终点y值
  2. 创建次y轴,同步其y轴范围与主轴一致,隐藏轴线、刻度等元素
  3. 在次y轴上添加文本标签,位置对应主曲线终点的y值,颜色匹配曲线
  4. 对高度接近的标签,添加微小垂直偏移避免重叠

完整代码示例

import matplotlib.pyplot as plt
import numpy as np

# 准备数据
labels = ['label 1', 'label 2', 'label 3', 'label 4', 'overlap']
x = [0, 1]
y_values = [
    [1, 1],
    [2, 2],
    [3, 3],
    [4, 4],
    [3.95, 3.95]
]

fig, ax = plt.subplots(figsize=(8, 6))
curve_info = []

# 绘制主曲线,记录颜色和终点y值
for y, lbl in zip(y_values, labels):
    line, = ax.plot(x, y, label=lbl)
    curve_info.append({
        'y_end': y[-1],
        'color': line.get_color(),
        'label': lbl
    })

# 创建隐藏的次y轴
ax_right = ax.twinx()
# 同步次轴y范围与主轴一致
ax_right.set_ylim(ax.get_ylim())
# 隐藏次轴的轴线、刻度、标签
ax_right.spines[['top', 'right', 'bottom', 'left']].set_visible(False)
ax_right.set_yticks([])
ax_right.set_yticklabels([])

# 添加标签,处理重叠问题
offset = 0.05  # 重叠标签的垂直偏移量
prev_y = None
for info in curve_info:
    y_pos = info['y_end']
    # 若当前标签与前一个高度接近,添加偏移
    if prev_y is not None and abs(y_pos - prev_y) < 0.1:
        y_pos += offset
        offset *= -1  # 交替偏移方向
    # 在次轴右侧添加文本,x位置设为1.02(图表外部)
    ax_right.text(1.02, y_pos, info['label'], 
                  color=info['color'], 
                  va='center', 
                  fontsize=10)
    prev_y = info['y_end']

# 调整布局,避免标签被截断
plt.subplots_adjust(right=0.8)

plt.show()

关键细节说明

  • 隐藏次轴:通过twinx()创建次轴后,隐藏所有轴线和刻度,仅用其坐标系统定位标签
  • 颜色匹配:通过line.get_color()获取曲线颜色,直接应用到标签
  • 重叠处理:对高度差小于阈值的标签,交替添加正负垂直偏移,避免重叠
  • 布局调整:用subplots_adjust(right=0.8)预留右侧空间放置标签

内容的提问来源于stack exchange,提问作者Alpha_Ursae_Minoris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:55:18