代码之家  ›  专栏  ›  技术社区  ›  Physicist

具有曲线上条件的Matplotlib轮廓图

  •  0
  • Physicist  · 技术社区  · 6 年前

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   JohanC    6 年前

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

    一个变量 z2 是用for创建的 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()
    

    resulting plot

    推荐文章