Matplotlib 等高线图与曲线上的条件

Matplotlib contour plot with conditions on the curve

假设我想绘制 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 的部分。基本上我正在对系统进行某种稳定性分析,我想根据 dz/dy 是正数还是负数来不同地显示 z=0 曲线的不同区域。

我能想到的是自己定位两部分的坐标,用scatterplot用不同的颜色(或线型)来显示曲线的两部分。我也知道如何在 Mathematica 中轻松地做到这一点。我只是想知道 matplotlib 中是否有更优雅的解决方案来完成这项工作。

也许下面的方法很有趣,但并不完美?

3*19*y^2-6*x>0 条件创建了一个变量 z2z2 除了靠近 z 的地方外,所有地方都被擦除。然后用红蓝colormap上色,正的部分是红色,负的部分是蓝色,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()