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轴定位标签,既保证标签在图表外部,又能完美对齐曲线终点高度,同时可通过微调避免重叠:
- 绘制主曲线时,记录每条曲线的颜色和终点y值
- 创建次y轴,同步其y轴范围与主轴一致,隐藏轴线、刻度等元素
- 在次y轴上添加文本标签,位置对应主曲线终点的y值,颜色匹配曲线
- 对高度接近的标签,添加微小垂直偏移避免重叠
完整代码示例
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
相关产品推荐
相关产品推荐

