假设我想绘制z=0
where 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
在虚线中的部分。基本上,我是在做系统的某种稳定性分析,我想根据dz/dy
是正的还是负的,以不同的方式显示z=0
曲线的不同区域。
我所能想到的就是自己定位两部分的坐标,并使用scatter
绘图来用不同的颜色(或线条样式)来显示曲线的两部分。我也知道如何在Mathematica中轻松地做到这一点。我只是想知道matplotlib中是否有更好的解决方案来完成这项工作。
发布于 2020-02-05 08:26:01
也许下面的方法很有趣,但并不完美?
使用为3*19*y^2-6*x>0
条件创建变量z2
。除了靠近z
的地方,z2
会被擦除到任何地方。然后用红蓝颜色贴图对其进行着色,红色表示正片,蓝色表示负片,白色在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()
https://stackoverflow.com/questions/60067194
复制相似问题