首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python Matplotlib为内置色彩映射表分配边界

Python Matplotlib为内置色彩映射表分配边界
EN

Stack Overflow用户
提问于 2018-05-31 09:21:23
回答 2查看 671关注 0票数 2

我尝试将最大值和最小值赋给matplotlib中的built-in colormaps

这是色彩映射的代码:

代码语言:javascript
复制
im = ax.imshow(frame, cmap='inferno', interpolation = "bilinear")
fig.colorbar(im, ax=ax)
fig, ax = plt.subplots()

参数frame当前是一个4x16数组,然后将其转换为颜色,但问题是色彩映射表的最大值和最小值是相对于给定数据的最大值和最小值生成的。

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

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-31 18:29:50

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

代码语言:javascript
复制
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()

票数 0
EN

Stack Overflow用户

发布于 2018-05-31 11:44:14

这并没有经过太多的测试(甚至更少的评论),但我希望您能理解

代码语言:javascript
复制
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()

这给了我们

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50615357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档