matplotlib: предотвращение влияния нескольких очень больших (или маленьких) значений на мой контур

при построении данных иногда есть несколько очень больших (или очень маленьких) чисел, которые, если о них не позаботиться, плохо повлияют на контур. решение состоит в том, чтобы убрать 10% самых высоких и самых низких данных из цветовой градации контура и рассматривать их как меньше и больше. на следующем рисунке показана идея: введите здесь описание изображения

две формы стрелок вверху и внизу панели поддерживают эту идею. любое значение выше 14 будет отображаться белым цветом, а любое значение ниже -2 будет отображаться черным цветом. как это возможно в matplotlib? Как я могу определить: - поместить 5% самых высоких значений и 5% самых низких значений в двух категориях, показанных в треугольных частях в обоих концах полосы? (Должен ли я определить это операцию контура или есть другие способы?) - что, если я хочу дать определенные значения вместо процентов? например, попросить поместить любое значение выше 14 в белый треугольник и любое значение ниже -2 в качестве черных областей?

Спасибо большое за вашу помощь.


person BobbyF    schedule 05.07.2013    source источник


Ответы (1)


Взято с сайта http://matplotlib.org/examples/api/colorbar_only.html. Вы можете поиграть с ним, и вы увидите, может ли он решить вашу проблему.

import matplotlib.pyplot as plt
from matplotlib import mpl
import numpy as np

x = np.linspace(-1,1,100)
X,Y = np.meshgrid(x,x)
Z = np.exp(-X**2-Y**2)

vmin = 0.3 #Lower value
vmax = 0.9 #Upper value

bounds = np.linspace(vmin,vmax,4)

cmap = mpl.colors.ListedColormap([(0,0,0),(0.5,0.5,0.5),(0,1,0),(1,1,1)])
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)

plt.imshow(Z,cmap=cmap,interpolation='nearest',vmin=vmin,vmax=vmax)

ax = plt.colorbar().ax
cb = mpl.colorbar.ColorbarBase(ax, norm=norm,
                               extend='both',
                               cmap=cmap)
cmap.set_over([0,0,1])
cmap.set_under([1,0,0])

plt.show()

введите здесь описание изображения

person Pablo    schedule 05.07.2013
comment
Большое спасибо за ваш ответ. Я решил это так. Поскольку я использовал Contourf, я определил уровни (например, чтобы нарисовать цветовую полосу, как в вашем примере, я бы определил ее как level=numpy.arange(.3,.9,.2), а затем в моей команде контура я добавил эти kwargs : уровни, расширить='оба' - person BobbyF; 12.07.2013