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)
解决方案
你的代码主要有三个问题:
- 原来的
axes()函数基于全局plt对象绘制坐标轴,子图模式下需要针对具体子图对象操作 - 错误用
ax.plot()代替ax.contour(),你要画的是等高线图,不是折线图 - 创建
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
相关产品推荐
相关产品推荐

