Python Pandas Matplotlib:如何利用自定义函数绘制子图?
我来帮你搞定这个问题~你遇到的问题主要有两个关键点:一是重复指定了同一个子图位置(两次都用了plt.subplot(1,2,1)),二是你的自定义绘图函数可能没有明确指定要绘制到哪个子图轴上,导致默认覆盖了当前轴。
下面给你一套完整的解决方案,包含修改自定义函数和正确绘制子图的示例代码:
第一步:修改自定义函数,支持指定子图轴
我们需要给myFunction加一个可选的ax参数,让它可以把图画到我们指定的子图坐标轴上,同时保留原来的使用方式(不传ax时默认用当前轴):
import matplotlib.pyplot as plt import numpy as np # 示例用,你可以换成自己的数据逻辑 def myFunction(arg1, arg2, ax=None): # 如果没传入ax,就用当前默认的坐标轴 if ax is None: ax = plt.gca() # 这里替换成你自己的绘图逻辑,下面是示例:用arg1和arg2生成线性图 x = np.linspace(0, 10, 100) y = arg1 * x + arg2 ax.plot(x, y, linewidth=2) ax.set_title(f"参数:arg1={arg1}, arg2={arg2}") ax.set_xlabel("X轴") ax.set_ylabel("Y轴")
第二步:在JupyterLab中绘制多张子图
这里提供两种常用的写法,你可以选自己习惯的:
写法一:一次性创建所有子图(更推荐)
这种方式可以直接拿到每个子图的坐标轴对象,精准控制绘图位置:
# 创建1行2列的子图布局,指定整体图大小 fig, (ax_left, ax_right) = plt.subplots(1, 2, figsize=(12, 5)) # 分别在两个子图上调用自定义函数,传入对应的坐标轴 myFunction(arg1=2, arg2=3, ax=ax_left) myFunction(arg1=5, arg2=-2, ax=ax_right) # 自动调整子图间距,避免标题、标签重叠 plt.tight_layout() plt.show()
写法二:逐个指定子图位置
如果你习惯用plt.subplot()逐个切换子图的方式,也可以这么写:
# 先创建一个空画布,指定大小 plt.figure(figsize=(12, 5)) # 第一个子图:1行2列的第1个位置 plt.subplot(1, 2, 1) myFunction(arg1=2, arg2=3) # 当前轴是第一个子图,无需传ax也能正常绘制 # 第二个子图:1行2列的第2个位置 plt.subplot(1, 2, 2) myFunction(arg1=5, arg2=-2) plt.tight_layout() plt.show()
为什么你之前的代码不行?
你两次都调用了plt.subplot(1,2,1),相当于两次都选中了同一个子图位置,第二次调用myFunction会把新图直接覆盖在第一个子图上,自然得不到你想要的左右两张子图效果。加上自定义函数支持ax参数后,就能彻底避免这种轴混乱的问题啦。
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

