Python Matplotlib Назначение границ встроенной карте цветов - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь присвоить максимальные и минимальные значения встроенным цветным картам в matplotlib.

Это код для цветовой карты:

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

Аргумент frame в настоящее время является массивом 4 x 16, который затем преобразуется в цвета, но проблема заключается в максимуме цветовой карты, и минимум генерируется относительно максимума и минимума данных.

Если максимум набора данных равен 20, он сделает эту область очень красной.Однако, если я затем запусту это с другим набором данных, который имеет максимум 100, он станет самым красным.Как я могу ограничить границы цвета cmap, чтобы у него всегда был согласованный максимум и минимум?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Кажется, это вопрос правильной нормализации.Нормализация должна быть одинаковой для всех графиков, и в этом случае она должна находиться в диапазоне между минимальным и максимальным значением всех данных.

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()

enter image description here

0 голосов
/ 31 мая 2018

это не так много проверено (и даже менее прокомментировано), но я надеюсь, что вы поняли идею

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()

, которая дает

persistent cmap

...