LINUX.ORG.RU

Как изменить цвет контурного графика в интервале значений?

 ,


1

1

В matplotlib у класса Colormap есть замечательные методы set_under и set_over. Они позволяют закрасить значения лежащие за пределами шкалы на контурном графике в выбранный цвет.

Но что если надо закрасить белым (или другим цветом) все значения в определённом интервале, например от -1 до 1 ? Другими словами, нужeн метод:

cmap.set_between(interval, color)

Чего-то не соображу, как это сделать с минимальными потугами?

★★☆

Последнее исправление: cetjs2 (всего исправлений: 1)

Ответ на: комментарий от true_admin

Тогда colorbar геморойно рисовать.

Я сделал свой colormap, торорый может заменять цвет в указанном диапазоне. Но значения должны быть в интервале 0..1. Т.е. реальный интервал сначала нужно вручную отобразить на 0..1. Это не так удобно.

yvv ★★☆
() автор топика
Ответ на: комментарий от buddhist

Плюсую, я всегда так делаю :)

А как с colorbar тогда?

ТСу: никогда не юзал colormap, возможно там это реально сложно.

Да нет, сам класс colormap 20 строчек кода. Его использовать неудобно, т.к. он конвертирует в rgb значения из интервала 0..1. Значит, мой интервал нужно предварительно отобразить на 0..1 с помощью normalize. А хотелось бы указывать мой интервал и цвет закраски, чтоб contourf и colorbar сами всё закрашивали, как с set_under и set_over. Думал, может в matplotlib чего-нибудь такое предусмотрено?

yvv ★★☆
() автор топика

Если кому интересно, то получилось так:

from matplotlib import colors
import scipy as sp
import matplotlib.pyplot as pl

class FilledCmap(colors.Colormap):
    '''
    This colormap fills the values in fill_range with fill_color.
    Range should be normalized. 
    '''

    def __init__(self,cmap,name='filled_map',fill_color='white',fill_range=(0.45,0.55)):
        self.cmap = cmap
        self.fill_color=fill_color
        self.fill_range = fill_range
        self.monochrome=cmap.monochrome
        colors.Colormap.__init__(self,name,cmap.N)

    def __call__(self, X, alpha=1.0, bytes=False):
        r,g,b=colors.colorConverter(self.fill_color)
        rgba=sp.array(self.cmap( X, alpha=1.0, bytes=False))
        rgba[...,0] = sp.where(sp.logical_and(X>=self.fill_range[0],X<=self.fill_range[1]), r, rgba[...,0])
        rgba[...,1] = sp.where(sp.logical_and(X>=self.fill_range[0],X<=self.fill_range[1]), g, rgba[...,1])
        rgba[...,2] = sp.where(sp.logical_and(X>=self.fill_range[0],X<=self.fill_range[1]), b, rgba[...,2])
        return rgba

Потом использовать надо как-то так:

data=sp.memmap('mydata.dat')
n=colors.Normalize()
n.autoscale(data)
m=FilledCmap(pl.get_cmap(), fille_range=(x1,x2))
contourf(data,cmap=m,norm=n)
yvv ★★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.