【问题标题】:Python Logarithmic Colormap/palettePython对数颜色图/调色板
【发布时间】:2019-10-20 19:08:55
【问题描述】:

我想使用一个颜色图,其中高值的色差很大,而我的其余值的差异不大。我认为对数颜色图将是最好的方法。我想绘制一个热图,不管是在 matplotlib、seaborn、plotly 中。

像这里这样创建对数颜色图的示例总是创建一个网格网格,并为 X 和 Y 获取一些东西,但我只有一个二维数组(代表图像)。 :https://matplotlib.org/3.1.0/gallery/images_contours_and_fields/pcolor_demo.html#sphx-glr-gallery-images-contours-and-fields-pcolor-demo-py:

N = 100
X, Y = np.mgrid[-3:3:complex(0, N), -2:2:complex(0, N)]

# A low hump with a spike coming out.
# Needs to have z/colour axis on a log scale so we see both hump and spike.
# linear scale only shows the spike.
Z1 = np.exp(-(X)**2 - (Y)**2)
Z2 = np.exp(-(X * 10)**2 - (Y * 10)**2)
Z = Z1 + 50 * Z2

fig, (ax0, ax1) = plt.subplots(2, 1)

c = ax0.pcolor(X, Y, Z,
               norm=LogNorm(vmin=Z.min(), vmax=Z.max()), cmap='PuBu_r')
fig.colorbar(c, ax=ax0)

c = ax1.pcolor(X, Y, Z, cmap='PuBu_r')
fig.colorbar(c, ax=ax1)

plt.show()

也喜欢这篇文章:Second example for logaithmic colormap

如果我只有一个像a=np.array([[0,2,3],[4,5,6],[7,8,9]]) 这样的图像/二维数组,那么该怎么做呢?

【问题讨论】:

    标签: python matplotlib colors plotly seaborn


    【解决方案1】:
    a = np.array([[1,2,3],[4,5,6],[7,8,9]])
    plt.imshow(a, norm=matplotlib.colors.LogNorm(vmin=a.min(), vmax=a.max()))
    plt.colorbar()
    

    如果你的值不是严格正数,你需要先屏蔽它们,这里用 nan 替换它们:

    a = np.array([[-1,0,1],[4,5,6],[7,8,9]])
    b = np.where(a>0,a,np.nan)
    
    cmap = plt.cm.get_cmap("viridis")
    cmap.set_bad("magenta")
    
    plt.imshow(b, norm=matplotlib.colors.LogNorm(vmin=np.nanmin(b), vmax=np.nanmax(b)), cmap=cmap)
    plt.colorbar()
    

    【讨论】:

    • 完美!谢谢,但我认为如果数组/图像包含零则不起作用,因为我收到错误异常 ValueError: values must all be positive.
    • @Varlor:嗯,是的。对数刻度只能取 >0 的值,因此如果 a 包含零,vmin=a.min() 将导致问题。一种选择可能是对数组的非负值取最小值(但如果您的值非常接近零,这可能会扭曲您的比例)。另外,如果它解决了您的问题,请考虑接受 DA 的回答。
    • 是的,显然,如果您有严格的正值,您只能使用对数刻度。我提出了一个处理数组中值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多