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

Python matplotlib如何使用subplots拆分多个图形为独立子图?

用Matplotlib的subplots将多个图形拆分到独立子图

问题描述

我是Python初学者,想要将现有代码中的四个图形拆分到独立的子图块中,已知需要使用subplots但不知具体操作方法。

原代码:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

mpl.rcParams['lines.color'] = 'k'
mpl.rcParams['axes.prop_cycle'] = mpl.cycler('color', ['k'])
x = np.linspace(-9, 9, 400)
y = np.linspace(-5, 5, 400)
x, y = np.meshgrid(x, y)

def axes():
    plt.axhline(0, alpha=.1)
    plt.axvline(0, alpha=.1)

a = 0.3
axes()
plt.contour(x, y, (y**2 - 4*a*x), [2], colors='k')
plt.show()

a1 = 2
b1= 2
axes()
plt.contour(x, y,(x**2/a1**2 + y**2/b1**2), [1], colors='k')
plt.show()

a = 4.0
b = 2.0
axes()
plt.contour(x, y,(x**2/a**2 + y**2/b**2), [1], colors='k')
plt.show()

a = 2.0
b = 1.0
axes()
plt.contour(x, y,(x**2/a**2 - y**2/b**2), [1], colors='k')
plt.show()

我尝试过以下两种写法,但均无法成功:

fig, ax = plt.subplots(3, 2)

a = 0.3
axes()
ax[0].plot(x, y, (y**2 - 4*a*x), [2], colors='k')
plt.show()
fig, ax = plt.subplots(3, 2)

def practice():
   a = 0.3
   axes()
   ax[0].plot(x, y, (y**2 - 4*a*x), [2], colors='k')
ax[0].plot(practice)

解决方案

你的代码主要有三个问题:

  1. 原来的axes()函数基于全局plt对象绘制坐标轴,子图模式下需要针对具体子图对象操作
  2. 错误用ax.plot()代替ax.contour(),你要画的是等高线图,不是折线图
  3. 创建3行2列子图时,ax是二维数组,需用ax[row, col]访问子图,而非ax[0]

下面是修正后的完整代码:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

mpl.rcParams['lines.color'] = 'k'
mpl.rcParams['axes.prop_cycle'] = mpl.cycler('color', ['k'])
x = np.linspace(-9, 9, 400)
y = np.linspace(-5, 5, 400)
x, y = np.meshgrid(x, y)

# 修改axes函数,接收子图对象ax作为参数
def axes(ax):
    ax.axhline(0, alpha=.1)
    ax.axvline(0, alpha=.1)

# 创建2行2列的子图,刚好放下4个图形(坚持3行2列的话,空出两个位置即可)
fig, ax = plt.subplots(2, 2, figsize=(10, 8))

# 第一个子图:抛物线
a = 0.3
axes(ax[0, 0])
ax[0, 0].contour(x, y, (y**2 - 4*a*x), [2], colors='k')
ax[0, 0].set_title('抛物线')

# 第二个子图:圆(a1=b1的椭圆)
a1 = 2
b1= 2
axes(ax[0, 1])
ax[0, 1].contour(x, y,(x**2/a1**2 + y**2/b1**2), [1], colors='k')
ax[0, 1].set_title('圆')

# 第三个子图:椭圆
a = 4.0
b = 2.0
axes(ax[1, 0])
ax[1, 0].contour(x, y,(x**2/a**2 + y**2/b**2), [1], colors='k')
ax[1, 0].set_title('椭圆')

# 第四个子图:双曲线
a = 2.0
b = 1.0
axes(ax[1, 1])
ax[1, 1].contour(x, y,(x**2/a**2 - y**2/b**2), [1], colors='k')
ax[1, 1].set_title('双曲线')

# 调整子图间距,避免标题重叠
plt.tight_layout()
plt.show()

错误代码解析

  • 第一种尝试:ax[0].plot()错误,一是plot不适合画等高线,二是3行2列子图需用ax[0,0]访问第一个子图,三是axes()函数未指定子图,会把坐标轴画到全局画布而非目标子图。
  • 第二种尝试:把函数practice传给ax[0].plot()完全不符合语法,plot需要传入x、y等数据,不能直接传函数对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:05:30