代码之家  ›  专栏  ›  技术社区  ›  Sembei Norimaki

具有不同颜色映射的两个分布的绘图计数

  •  0
  • Sembei Norimaki  · 技术社区  · 7 年前

    我想画出 contourf 在两个分布中,用不同的颜色区分它们,并且没有“一个在另一个之上”,而是在较低的点之上有较高的点

    玩具示例:

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.mlab as mlab
    
    x = np.arange(-3.0, 3.0, 0.1)
    y = np.arange(-2.0, 2.0, 0.1)
    X, Y = np.meshgrid(x, y)
    
    Z = np.zeros((len(y), len(x), 2))
    Z[:,:,0] = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
    Z[:,:,1] = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
    

    好的,让我们绘制它们:

    plt.figure()
    plt.contourf(X, Y, Z[:,:,0], cmap='Reds', alpha=0.6)
    plt.contourf(X, Y, Z[:,:,1], cmaps='Blues', alpha=0.6)
    plt.show()
    

    enter image description here

    不是我想要的,因为第二个情节在第一个之上。 所以我试着取沿第二轴分布的最大值

    plt.figure()
    plt.contourf(X, Y, np.max(Z, axis=2),alpha=0.6)
    plt.show()
    

    enter image description here

    现在它们看起来像我想要的,但我混合了它们,所以我无法用不同的颜色绘制它们(红色vs蓝色)

    我可以使用argmax来知道哪个绘图给了我最大值,我可以创建一个索引矩阵,但我不知道如何告诉countourf使用这个矩阵来确定要使用的颜色映射。

    我怎样才能保持颜色,而不让它们相互重叠?

    1 回复  |  直到 7 年前
        1
  •  2
  •   ImportanceOfBeingErnest    7 年前

    当然,您可以互斥地屏蔽两个轮廓。

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.mlab as mlab
    
    x = np.arange(-3.0, 3.0, 0.1)
    y = np.arange(-2.0, 2.0, 0.1)
    X, Y = np.meshgrid(x, y)
    
    Z = np.zeros((len(y), len(x), 2))
    Z[:,:,0] = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
    Z[:,:,1] = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
    mask = Z[:,:,0] > Z[:,:,1]
    plt.figure()
    plt.contourf(X, Y, np.ma.array(Z[:,:,0], mask=~mask), cmap='Reds', 
                 alpha=0.6)
    plt.contourf(X, Y, np.ma.array(Z[:,:,1], mask=mask), cmap='Blues', 
                 alpha=0.6)
    plt.show()
    

    enter image description here