【问题标题】:Python Matplotlib Assigning boundaries to the built-in colormapPython Matplotlib 为内置颜色图分配边界
【发布时间】:2018-05-31 18:29:49
【问题描述】:

我正在尝试为 matplotlib 中的built-in colormaps 分配最大值和最小值。

这是颜色图的代码:

im = ax.imshow(frame, cmap='inferno', interpolation = "bilinear")
fig.colorbar(im, ax=ax)
fig, ax = plt.subplots()

参数 frame 目前是一个 4 x 16 的数组,然后将其转换为颜色,但问题是颜色图的最大值和最小值是相对于图像的最大值和最小值生成的给定的数据。

如果数据集的最大值为 20,则该区域会变得非常红。但是,如果我随后使用另一个最大为 100 的数据集运行它,它将使它成为最红的。如何限制 cmap 颜色范围,使其始终具有一致的最大值和最小值?

提前致谢!

【问题讨论】:

  • 如何获得规范?你试过LogNorm吗?
  • 抱歉,我正在测试有界 cmap,所以目前我的 norm = colors.BoundaryNorm(bounds, cmap.N)。感谢您的评论。
  • 对不起,我不太明白你的问题,所以我的评论没用,我把它删除了。我不知道如何为您的问题提供简单的答案。也许您可以提取 cmap 的颜色并通过不同的数据集做出自己的一致性,但您需要提前获得所有最小值/最大值

标签: python matplotlib colormap


【解决方案1】:

这似乎是正确规范化的问题。所有图的归一化需要相同,在这种情况下,应介于所有数据的最小值和最大值之间。

import numpy as np
import matplotlib.pyplot as plt

x,y = np.meshgrid(np.linspace(-3,3),np.linspace(-3,3,80))
z1 = np.sin(x)+np.cos(y)
z2 = z1*3
z3 = 2*z1-4

mini = np.min([z1.min(), z2.min(), z3.min()])
maxi = np.max([z1.max(), z2.max(), z3.max()])
norm = plt.Normalize(mini, maxi)

fig, axes = plt.subplots(ncols=3)
axes[0].imshow(z1, norm=norm)
axes[1].imshow(z2, norm=norm)
im = axes[2].imshow(z3, norm=norm)

fig.colorbar(im, ax=axes)

plt.show()

【讨论】:

  • 非常感谢!规范化是我正在寻找的解决方案。欣赏它。
【解决方案2】:

这没有经过太多测试(甚至更少评论),但我希望你能明白

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from matplotlib.cm import get_cmap

class IndexedCMap(object):
    """set consistent cmap values through different datasets"""

    def __init__(self, cmap):
        """takes a cmap name or cmap object"""
        if type(cmap) is str:
            self.cmap = get_cmap(cmap)
        else:
            self.cmap = cmap
        self.colorlist = self.cmap.colors


    def set_max(self, data):
        """fix the max values of the max dataset"""
        self.z_max = data.max()
        self.z_min = data.min()


    def get_cmap_subset(self, data):
        """return a cmap consistent to your dataset"""
        norm_z = lambda x: int(self.cmap.N*(x-self.z_min)/(self.z_max-self.z_min))
        d_min = norm_z(data.min())
        d_max = norm_z(data.max())
        return ListedColormap(self.colorlist[d_min:d_max])


"""ad-hoc data"""
x = np.linspace(0,2,100)
x, y = np.meshgrid(x, x)
z = x**2 + y**2
z = np.sin(2*np.pi*z)
z_bigger = z*3
z_shifted = z/5+2

icmap = IndexedCMap('inferno')
icmap.set_max(z_bigger)
regular_inferno = icmap.get_cmap_subset(z)
shifted_inferno = icmap.get_cmap_subset(z_shifted)

plt.figure()
plt.subplot(311)
plt.contourf(x, y, z, cmap=regular_inferno)
plt.colorbar()
plt.ylabel('regular z')

plt.subplot(312)
plt.contourf(x, y, z_shifted, cmap=shifted_inferno)
plt.colorbar()
plt.ylabel('shifted z')

plt.subplot(313)
plt.contourf(x, y, z_bigger, cmap='inferno')
plt.colorbar()
plt.ylabel('bigger z')

plt.show()

这给了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 2021-12-02
    • 2018-08-24
    • 2012-08-15
    • 1970-01-01
    相关资源
    最近更新 更多