代码之家  ›  专栏  ›  技术社区  ›  Denver Dang

对轮廓图中的一个级别使用不同的cmap/颜色

  •  1
  • Denver Dang  · 技术社区  · 8 年前

    我正在试着做一个matplotlib contourf 用一些 x y ,和 z z轴 值将定义绘图的颜色。 然而,在我现在所处的位置,一个区域(即对我来说很重要的区域)与其他区域相比非常小(见图),因此很难看到这个特定区域(几个小的黑色“点”)。所以我在想,是否有可能得到另一种颜色的第一个等级(或者最后一个等级,因为在这种情况下它是负值),或者用一条细白线什么的勾勒出来,这样人们就可以真正看到小而重要的点?

    我正在用这个代码绘图:

    import matplotlib.pyplot as plt
    from matplotlib import rcParams
    import matplotlib.colors as colors
    import numpy as np
    
    nx = 41
    ny = 67
    
    x = np.linspace(0.01, 1, nx)
    y = np.linspace(0.01, 2, ny)
    x_bc = x[:, np.newaxis]
    y_bc = y[np.newaxis, :]
    
    z = x_bc*y_bc
    
    max_value = np.amax(z)
    cmapp = plt.get_cmap('Greys')
    
    level_intervals = [100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 8, 1.92, 0]
    level_list = [max_value-i for i in level_intervals]
    
    col_bar = plt.contourf(x, y, z.T, level_list, cmap=cmapp)
    plt.xlabel('x')
    plt.ylabel('y')
    plt.colorbar(col_bar, cmap=cmapp)
    
    plt.show()
    

    很抱歉,我没有提供任何真实的数据,但我无法复制用于以下绘图的数据(实际上,在几乎黑色(奇怪的句子)的内部有一些少量/几乎黑色的点)。但是,大小和 z轴 创建的数据如上所述。然而,在从图中得到数据之前,中间进行了许多计算。

    enter image description here

    2 回复  |  直到 8 年前
        1
  •  1
  •   Sheldore    8 年前

    根据下面的注释进行编辑:您可以在所需的区域/范围内限制等高线。例如,我修改了上面示例代码中的x、y和z数据,以绘制更多的等高线。然后我只选择最高震级的等高线 levels = sorted(level_list)[-5:] (这里最后5行)用红色突出显示。试着为你的孩子做这件事 实际的 并查看感兴趣区域中的点是否可见。我只写下面的行,我修改了你的代码。

    fig = plt.figure(figsize=(8, 6))
    nx = 67
    ny = 77
    
    # Modified your actual values to get some more contour lines
    x = np.linspace(1, 16, nx)
    y = np.linspace(1, 15, ny)
    z = x_bc*y_bc*0.2
    
    col_bar = plt.contourf(x, y, z.T, level_list, cmap=cmapp)
    plt.contour(col_bar, levels = sorted(level_list)[-5:], colors=('r',),linestyles=('-',),linewidths=(3,))
    

    enter image description here

        2
  •  1
  •   ImportanceOfBeingErnest    8 年前

    您可以基于现有颜色映射创建自定义颜色映射,并将其中一种颜色替换为红色。
    然后你可以使用 BoundaryNorm 将新颜色映射中的颜色用于指定级别。

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.colors
    
    d = np.linspace(-3,3)
    x,y = np.meshgrid(d,d)
    data = -585.22 + 94*np.exp(-(x**2+y**2))
    levels = np.linspace(-585.22, -485.22, 13)
    norm = matplotlib.colors.BoundaryNorm(levels,len(levels))
    
    colors = list(plt.cm.Greys(np.linspace(0,1,len(levels)-1)))
    colors[-1] = "red"
    cmap = matplotlib.colors.ListedColormap(colors,"", len(colors))
    
    im = plt.contourf(data, levels, cmap=cmap, norm=norm)
    
    plt.colorbar(ticks=levels)
    
    plt.show()
    

    enter image description here