假设我要绘制z=0
的轮廓,其中z=(19*y^3-6*x*y-1)
。我可以使用以下代码:
x = np.linspace(-2,2,1000)
y = np.linspace(-1,1,1000)
X,Y = np.meshgrid(x,y)
z = (19)*Y**3-6*X*Y-1
plt.figure()
plt.contour(z,0)
plt.show()
现在我要在实线中显示曲线的其中3*19*y^2-6*x<0
的部分,并在虚线中显示3*19*y^2-6*x>0
的部分。基本上,我正在对系统进行某种稳定性分析,并且我想根据z=0
是正还是负来不同地显示dz/dy
曲线的不同区域。
我能想到的是自己定位两个部分的坐标,并使用scatter
图以不同的颜色(或线型)显示曲线的两个部分。我也知道如何在Mathematica中轻松做到这一点。我只是想知道matplotlib中是否有一种更优雅的解决方案来完成这项工作。
也许下面的方法很有趣,尽管并不完美?
为z2
条件创建一个变量3*19*y^2-6*x>0
。 z2
在除z
附近的所有地方都会被删除。然后用红蓝色配色表上色,红色代表正极,蓝色代表负极,白色约为0。
背景设置为黑色,轮廓颜色设置为白色,以便具有足够的对比度。
请注意,contour
图和imshow
都需要设置extent
参数以获得信息轴。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-2, 2, 1000)
y = np.linspace(-1, 1, 1000)
X, Y = np.meshgrid(x, y)
z = (19) * Y ** 3 - 6 * X * Y - 1
z2 = 3 * 19 * Y ** 2 - 6 * X
z2 = np.where(np.abs(z) < 0.2, z2, np.NaN)
plt.gca().set_facecolor('black')
plt.imshow(z2, cmap='coolwarm', vmin=-1, vmax=+1, alpha=1, extent=[-2, 2, -1, 1], origin='lower')
plt.contour(z, 0, extent=[-2, 2, -1, 1], zorder=3, colors='white')
plt.show()