Python Matplotlib双X轴双Y轴绘图实战:两种实现方案对比

巷口听风
巷口听风
发布时间:2026-10-15 | 5人浏览过
原创

本文详解Python中使用Matplotlib绘制双X轴双Y轴图表的两种主流方法。重点对比fig.add_subplot叠加坐标系与axes.twinx().twiny()两种实现路径,分析后者在刻度颜色等属性设置上的局限性,并提供完整代码示例与参数配置建议,帮助开发者根据实际需求选择最优方案。

双轴绘图背景与方案概述

时隔许久重新更新博客。过去一年忙于内容创作,甚至忘记了博客账号密码,直到近期在伴侣提醒下才找回登录信息。恰逢今日工作中需要绘制双X轴与双Y轴的图表,经过两小时研究,最终利用Python成功实现。在查阅资料时发现缺乏系统性的教程,既然代码已整理完毕,便决定撰写此文分享经验。

目前通过plt实现双X轴双Y轴绘图主要有两种技术路径:

第一种是利用fig.add_subplot方法,将两组坐标系叠加在同一画布fig上,从而生成双X轴双Y轴效果。该方法支持所有常规调整,功能完善,因此强烈推荐此方式。

第二种是通过axes.twinx().twiny()方法实现双X轴双Y轴图形绘制。此方法存在一个主要问题:对第二个Y轴进行各种设置往往无效。虽然可以通过手动添加方式创建label并指定颜色,但tick(刻度)颜色却无法修改。这可能需等待官方修复,或者尝试先使用ax1=axes.twinx()方式,从ax1中获取第二个Y轴,然后再使用ax2.twiny()创建第二个X轴。

基于fig.add_subplot的实现方案

以下是利用fig.add_subplot方式实现双X轴双Y轴绘图的具体代码示例。

"""
使用plt,通过fig.add_subplot方式将两对坐标系叠加在一个fig上实现双X轴双Y轴效果。
所有调整均可完美实现,推荐该方式
"""
import matplotlib.pyplot as plt
import numpy as np
 
"""生成数据并设置绘图参数"""
x = np.arange(1, 12, 4)
y = np.arange(1, 4, 1)
x2=x*10
y2=y**2
# 设置两种绘图颜色
c1='r'
c2='b'
# 设置字体大小
fontsize=12
# 设置画布大小
width,height=16,14 # 单位为cm;因为保存图片时使用 bbox_inches = 'tight' 可能使图片尺寸略微放大,所以此处宽度设置得略小
# 设置刻度线在坐标轴内
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
"""绘图"""
lns=[] # 用于存储绘图句柄以合并图例的list
# 创建画布并设置大小
fig=plt.figure()
fig.set_size_inches(width/2.54, height/2.54) # 因为画布输入大小为厘米,此处需转换为英寸,所以除以2.54
# 通过 add_subplot 方式创建两个坐标轴,相当于在同一个子图上叠加了两对坐标系
ax=fig.add_subplot(111, label="1")
ax2=fig.add_subplot(111, label="2", frame_on=False)
# 绘制图1并将绘图句柄返回,以便添加合并图例
lns1=ax.plot(x,y,color=c1,label=c1)
lns=lns1
lns2=ax2.plot(x2,y2, color=c2,label=c2)
lns+=lns2
"""图形美化"""
# 调整第二对坐标轴的label和tick位置,以实现双X轴双Y轴效果
ax2.xaxis.tick_top()
ax2.yaxis.tick_right()
ax2.xaxis.set_label_position('top')
ax2.yaxis.set_label_position('right')
# 设置坐标轴标注
ax.set_xlabel("X1", color=c1,fontsize=fontsize)
ax.set_ylabel("Y1", color=c1,fontsize=fontsize)
ax2.set_xlabel('X2', color=c2,fontsize=fontsize)
ax2.set_ylabel('Y2', color=c2,fontsize=fontsize)
# 设置图表标题
fig.suptitle("Title",fontsize=fontsize+2)
# 设置坐标轴刻度颜色
ax.tick_params(axis='x', colors=c1)
ax.tick_params(axis='y', colors=c1)
ax2.tick_params(axis='x', colors=c2)
ax2.tick_params(axis='y', colors=c2)
# 设置坐标轴线颜色
ax.spines["left"].set_color("r") # 修改左侧颜色
ax.spines["right"].set_color("b") # 修改右侧颜色
ax.spines["top"].set_color("b") # 修改上边颜色
ax.spines["bottom"].set_color("r") # 修改下边颜色
# 添加图例
labs = [l.get_label() for l in lns]
ax.legend(lns, labs, loc=0,fontsize=fontsize)
plt.tight_layout()
plt.show()

基于axes.twinx().twiny()的实现方案

以下是使用axes.twinx().twiny()方式实现双X轴双Y轴绘图的代码示例。

"""
使用plt,通过 axes.twinx().twiny() 方式实现双X轴双Y轴图形绘制。
问题在于对于第二个Y轴的各种设置无效,label可以通过手动添加的方式创建并指定颜色,而tick颜色则无法修改
"""
import matplotlib.pyplot as plt
import numpy as np
 
"""生成数据并设置绘图参数"""
x = np.arange(1, 12, 4)
y = np.arange(1, 4, 1)
x2=x*10
y2=y**2
# 设置两种绘图颜色
c1='r'
c2='b'
# 设置字体大小
fontsize=12
# 设置刻度线在坐标轴内
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
"""绘图"""
lns=[] # 用于存储绘图句柄以合并图例的list
# 创建画布
fig,axes=plt.subplots()
fig.set_size_inches(10, 8)
# 绘制图1并将绘图句柄返回,以便添加合并图例
lns1=axes.plot(x,y,color=c1,label=c1)
lns=lns1
# 创建双x轴双y轴
twin_axes=axes.twinx().twiny() # 使用画布的初始坐标轴对象创建第二对坐标轴,类似于在双x轴的基础上叠加双y轴
# 绘制图2并将绘图句柄返回,以便添加合并图例
lns2=twin_axes.plot(x2,y2,color=c2,label=c2) 
lns+=lns2
"""图形美化"""
# 设置坐标轴标注
axes.set_xlabel("X1",color=c1, fontsize=fontsize)
axes.set_ylabel("Y1",color=c1, fontsize=fontsize)
twin_axes.set_xlabel("X2",color=c2, fontsize=fontsize)
twin_axes.set_ylabel("Y2",color=c2, fontsize=fontsize) # 第二个y轴设置标注无效
# 设置图表标题
fig.suptitle("Title",fontsize=fontsize+2)
# 设置第二个y轴的label;由于set_ylabel无效,因此只能通过该种方式手动添加
loc_text_x=np.min(plt.xlim())+np.ptp(plt.xlim())*1.03
loc_text_y=np.min(plt.ylim())+np.ptp(plt.ylim())*0.5
str_text='Y2'
twin_axes.text(loc_text_x, loc_text_y, str_text,rotation=90,color=c2,fontsize=fontsize)
# 设置坐标轴刻度颜色
axes.tick_params('x', colors=c1)
axes.tick_params('y', colors=c1)
twin_axes.tick_params('x', colors=c2)
twin_axes.tick_params('y', colors=c2)
# 设置坐标轴线颜色
twin_axes.spines["left"].set_color("r") # 修改左侧颜色
twin_axes.spines["right"].set_color("b") # 修改右侧颜色;同第二个y轴的label设置一样,该设置也不起作用
twin_axes.spines["top"].set_color("b") # 修改上边颜色
twin_axes.spines["bottom"].set_color("r") # 修改下边颜色
# 添加图例
# lns = lns1+lns2
labs = [l.get_label() for l in lns]
axes.legend(lns, labs, loc=0,fontsize=fontsize)
plt.tight_layout()
plt.show()

至此,关于Python实现双X轴双Y轴绘图的示例详解介绍完毕。如需了解更多Python双轴绘图相关内容,请搜索本站历史文章或继续浏览后续文章,希望大家今后多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表