【问题标题】:How to get build a consistent discrete colormap/colorbar with "upper" and "lower" values如何使用“上”和“下”值构建一致的离散颜色图/颜色条
【发布时间】:2019-01-25 00:09:34
【问题描述】:

一张图片值一千字: https://www.harrisgeospatial.com/docs/html/images/colorbars.png

我想使用 matplotlib 获得与右侧相同的颜色条。 默认行为对“上”/“下”和相邻单元格使用相同的颜色...

感谢您的帮助!

这是我的代码:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as colors

N = 100
X, Y = np.mgrid[-3:3:complex(0, N), -2:2:complex(0, N)]
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2) * 2

fig, ax = plt.subplots(1, 1, figsize=(8, 8))

# even bounds gives a contour-like effect
bounds = np.linspace(-1, 1, 10)
norm = colors.BoundaryNorm(boundaries=bounds, ncolors=256)
pcm = ax.pcolormesh(X, Y, Z,
                    norm=norm,
                    cmap='RdBu_r')
fig.colorbar(pcm, ax=ax, extend='both', orientation='vertical')

【问题讨论】:

  • 也许你可以插入你的代码
  • 完成!谢谢你的回答
  • 例如在this example 中有一个带有上下扩展名的颜色条。
  • 您好,感谢您的回答。是的,我知道这些扩展,我已将它们包含在我发布的代码中。实际上,我想让它们以与相邻 bin 不同的颜色绘制,并且颜色与基色图一致
  • 这就是您要找的东西吗? pcm = ax.pcolormesh(X, Y, Z, norm=norm, cmap='gnuplot', vmin=-1, vmax=1)。颜色图在那里:matplotlib.org/users/colormaps.html

标签: python matplotlib colorbar


【解决方案1】:

为了使颜色图的“上”/“下”颜色采用该图的第一种/最后一种颜色,但仍与颜色图范围内的最后一种颜色不同,您可以从颜色图中获得一种颜色比你在BoundaryNorm 中有边界,并使用第一个和最后一个颜色作为“over”/“under”颜色的相应颜色。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

N = 100
X, Y = np.mgrid[-3:3:complex(0, N), -2:2:complex(0, N)]
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2) * 2

fig, ax = plt.subplots(1, 1, figsize=(8, 8))

# even bounds gives a contour-like effect
bounds = np.linspace(-1, 1, 11)
# get one more color than bounds from colormap
colors = plt.get_cmap('RdBu_r')(np.linspace(0,1,len(bounds)+1))
# create colormap without the outmost colors
cmap = mcolors.ListedColormap(colors[1:-1])
# set upper/lower color
cmap.set_over(colors[-1])
cmap.set_under(colors[0])
# create norm from bounds
norm = mcolors.BoundaryNorm(boundaries=bounds, ncolors=len(bounds)-1)
pcm = ax.pcolormesh(X, Y, Z, norm=norm, cmap=cmap)
fig.colorbar(pcm, ax=ax, extend='both', orientation='vertical')

plt.show()

【讨论】:

  • 这正是我想要的!谢谢!
  • 我仍然不明白为什么这不是默认行为......你不同意这样更好吗?
  • 按照纯逻辑,颜色图 的最后一个值不能在颜色图之外,因为那样它就不是 的最后一个值了颜色图,对吧?
  • 如果您要求显示上限值和下限值(extend='both'),您希望能够真正区分相邻值的上限值和下限值!并且按照纯逻辑,颜色图的第一个和最后一个值应该用于上限和下限。我坚持认为,即使按照纯逻辑,这也应该是默认行为;)
  • 如果您要求extend='both',您需要定义要使用的颜色。如果您想为它们使用颜色图的第一种和最后一种颜色,它们必然不再是颜色图的第一种和最后一种颜色 - 因此您需要定义一个不包含那些外部颜色的新颜色图。与书类似,如果您不希望书的最后一页成为书的一部分,则需要将其删除。一旦你这样做了,它就不再是本书的最后一页了。无论如何,我可以向您保证,您所要求的永远不会是 matplotlib 中的默认设置。
【解决方案2】:

正如我在评论中所建议的,您可以使用

更改颜色图

pcm = ax.pcolormesh(X, Y, Z, norm=norm, cmap='rainbow_r')

这给了:

您可以定义自己的颜色图,如下所示:Create own colormap using matplotlib and plot color scale

【讨论】:

  • 这个问题是我们无法区分上面和下面的值 -1 例如......这就是我想要的。 ImportanceOfBeingErnest 找到了解决方案!
猜你喜欢
  • 2016-04-07
  • 2019-10-20
  • 2021-09-05
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 2018-04-09
相关资源
最近更新 更多