Matplotlib等高线图,条件在曲线上

问题描述 投票:0回答:1

假设我要绘制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中是否有一种更优雅的解决方案来完成这项工作。

python matplotlib contour figure scatter
1个回答
0
投票

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

z2条件创建一个变量3*19*y^2-6*x>0z2在除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()

resulting plot

© www.soinside.com 2019 - 2024. All rights reserved.