matplotlib
цветовые карты
Поиск…
Основное использование
Использование встроенных цветовых папок так же просто, как передача имени требуемой цветовой карты (как указано в ссылке contourf
) функции построения графика (например, pcolormesh
или contourf
), которая ожидает ее, как правило, в виде аргумента ключевого слова cmap
:
import matplotlib.pyplot as plt
import numpy as np
plt.figure()
plt.pcolormesh(np.random.rand(20,20),cmap='hot')
plt.show()
Колларды особенно полезны для визуализации трехмерных данных на двумерных графиках, но хорошая цветовая карта также может сделать правильный трехмерный график намного яснее:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.ticker import LinearLocator
# generate example data
import numpy as np
x,y = np.meshgrid(np.linspace(-1,1,15),np.linspace(-1,1,15))
z = np.cos(x*np.pi)*np.sin(y*np.pi)
# actual plotting example
fig = plt.figure()
ax1 = fig.add_subplot(121, projection='3d')
ax1.plot_surface(x,y,z,rstride=1,cstride=1,cmap='viridis')
ax2 = fig.add_subplot(122)
cf = ax2.contourf(x,y,z,51,vmin=-1,vmax=1,cmap='viridis')
cbar = fig.colorbar(cf)
cbar.locator = LinearLocator(numticks=11)
cbar.update_ticks()
for ax in {ax1, ax2}:
ax.set_xlabel(r'$x$')
ax.set_ylabel(r'$y$')
ax.set_xlim([-1,1])
ax.set_ylim([-1,1])
ax.set_aspect('equal')
ax1.set_zlim([-1,1])
ax1.set_zlabel(r'$\cos(\pi x) \sin(\p i y)$')
plt.show()
Использование пользовательских цветовых палитр
Помимо встроенных цветовых кодов, определенных в ссылке colormaps (и их обратных картах, при добавлении '_r'
к их имени), могут также быть определены пользовательские цветовые карты. Ключом является модуль matplotlib.cm
.
В приведенном ниже примере определяется очень простая cm.register_cmap
, использующая cm.register_cmap
, содержащую один цвет, с непрозрачностью (альфа-значение) интерполяции цвета между полностью непрозрачным и полностью прозрачным в диапазоне данных. Обратите внимание, что важными линиями с точки зрения цветовой карты являются импорт cm
, вызов register_cmap
и прохождение plot_surface
карты в plot_surface
.
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.cm as cm
# generate data for sphere
from numpy import pi,meshgrid,linspace,sin,cos
th,ph = meshgrid(linspace(0,pi,25),linspace(0,2*pi,51))
x,y,z = sin(th)*cos(ph),sin(th)*sin(ph),cos(th)
# define custom colormap with fixed colour and alpha gradient
# use simple linear interpolation in the entire scale
cm.register_cmap(name='alpha_gradient',
data={'red': [(0.,0,0),
(1.,0,0)],
'green': [(0.,0.6,0.6),
(1.,0.6,0.6)],
'blue': [(0.,0.4,0.4),
(1.,0.4,0.4)],
'alpha': [(0.,1,1),
(1.,0,0)]})
# plot sphere with custom colormap; constrain mapping to between |z|=0.7 for enhanced effect
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(x,y,z,cmap='alpha_gradient',vmin=-0.7,vmax=0.7,rstride=1,cstride=1,linewidth=0.5,edgecolor='b')
ax.set_xlim([-1,1])
ax.set_ylim([-1,1])
ax.set_zlim([-1,1])
ax.set_aspect('equal')
plt.show()
В более сложных сценариях можно определить список значений R / G / B (/ A), в которые matplotlib интерполирует линейно, чтобы определить цвета, используемые на соответствующих графиках.
Порядочно однородные цветовые карты
Исходная по умолчанию цветовая карта MATLAB (замененная в версии R2014b), называемая jet
является повсеместной из-за ее высокой контрастности и знакомости (и по умолчанию была использована matplotlib по соображениям совместимости). Несмотря на свою популярность, традиционные цветовые карты часто имеют недостатки, когда дело доходит до представления данных точно. Произошедшее изменение в этих цветовых картах не соответствует изменениям данных; и преобразование цветовой карты в оттенки серого (например, путем печати фигуры с использованием черно-белого принтера) может привести к потере информации.
Были введены единые цветовые карты с восприятием, чтобы сделать визуализацию данных максимально точной и доступной. Matplotlib представила четыре новых, перцепционно однородных цветовых паттерна в версии 1.5, причем один из них (по имени viridis
) был по умолчанию от версии 2.0. Эти четыре цветовые карты ( viridis
, inferno
, plasma
и magma
) являются оптимальными с точки зрения восприятия, и они должны использоваться для визуализации данных по умолчанию, если только нет веских причин не делать этого. Эти цветовые карты вводят как можно меньше предвзятости (не создавая функций, где их нет), и они подходят для аудитории с уменьшенным восприятием цвета.
В качестве примера для визуального искажения данных рассмотрим следующие два сюжета верхнего плана пирамидоподобных объектов:
Какая из двух является правильной пирамидой? Ответ конечно, что оба они есть, но это далеко не очевидно из сюжета, использующего jet
карту:
Эта особенность лежит в основе единообразия восприятия.
Пользовательская дискретная цветовая палитра
Если у вас есть предопределенные диапазоны и вы хотите использовать определенные цвета для этих диапазонов, вы можете объявить пользовательскую цветовую палитру. Например:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors
x = np.linspace(-2,2,500)
y = np.linspace(-2,2,500)
XX, YY = np.meshgrid(x, y)
Z = np.sin(XX) * np.cos(YY)
cmap = colors.ListedColormap(['red', '#000000','#444444', '#666666', '#ffffff', 'blue', 'orange'])
boundaries = [-1, -0.9, -0.6, -0.3, 0, 0.3, 0.6, 1]
norm = colors.BoundaryNorm(boundaries, cmap.N, clip=True)
plt.pcolormesh(x,y,Z, cmap=cmap, norm=norm)
plt.colorbar()
plt.show()
Производит
Цвет i будет использоваться для значений между границами i и i + 1 . Цвета могут быть указаны по именам ( 'red'
, 'green'
), HTML-коды ( '#ffaa44'
, '#441188'
) или кортежи RGB ( (0.2, 0.9, 0.45)
).