Как установить повороты на цветовой панели в настраиваемом месте в Matplotlib?

У меня есть некоторые проблемы с использованием цветовой панели Matplotlib, возможно, я не понимаю документацию (я не являюсь носителем английского языка) или ее основную концепцию.

Предположим, у меня есть матрица данных (форма, N*2). Я хочу сделать точечную диаграмму этих данных и добавить цветовую схему на основе столбца метки (N * 1) в float. Я знаю, как использовать colorbar и scalarmappable.

Но меня интересуют некоторые опорные значения в этом столбце меток, и я хочу представить эти значения в какой-нибудь интересной позиции на цветовой полосе. Например, значение метки 0, я хочу расположить его на 1/3 позиции или посередине, что на выбранной мной цветовой полосе может иметь белый или серый цвет.

Но если я правильно понимаю, colorbar берет только массив данных, отображаемый в [0, 1], из исходных данных в [min, max]. В этом случае интересующее меня опорное значение окажется где-то случайным, если только я не очень тщательно определю свою функцию нормализации.

Таким образом, чтобы поместить белый цвет, который я предпочитаю для моего опорного значения, в середине цветовой полосы, я должен определить функцию нормализации, которая не только нормализует мои данные, но и делает опорное значение в позиции 0,5.

Для моего ограниченного опыта работы с Matplotlib это решение, которое я знаю.

В идеале, предположим, что у меня есть столбец данных с плавающей запятой, я мог бы выбрать какое-то значение поворота и присвоить им какое-то особое положение. а затем я их нормализую и передаю в палитру. Однако на цветовой полосе я мог установить специальные цвета для тех специальных позиций, которые я ранее определил. и получить соответствующую цветовую полосу с правильным локатором галочки и метками галочки, которые указывают мое специальное значение поворота.

Я ищу более простой способ (из стандартной библиотеки), который я мог бы использовать для достижения этой цели.


person Hualin    schedule 25.09.2013    source источник
comment
Я боюсь кодировать специальную карту цветов и тщательную функцию нормализации. Я хочу иметь растяжимую цветовую карту и функцию нескольких норм. Интересно, понял ли меня кто-нибудь...   -  person Hualin    schedule 25.09.2013
comment
Я бы использовал LinearSegmentedColormap matplotlib.org/api/, чтобы вы могли поместите ваши основные цвета, где бы вы ни находились. Я бы предложил попробовать что-нибудь, а затем отредактировать свой вопрос, включив в него код. Люди лучше реагируют на код, чем на стену прозы (а у вас неплохой английский).   -  person tacaswell    schedule 25.09.2013
comment
ах-ха, мне просто интересно, как долго я могу получать здесь ответы. да, я знаю цветовую карту линейного сегмента. Это последнее, что я бы сделал, так как в matplotlib уже есть набор цветовых полос, но я просто хочу растянуть его, чтобы я мог разместить там свои опорные значения. Я хочу использовать карту цветов colorbrewer. Спасибо, в любом случае. Я сразу закодирую linearsegmap.   -  person Hualin    schedule 25.09.2013


Ответы (1)


Будет очень полезно, если вы опубликуете сюжет, который хотите сделать. Но, насколько я понимаю, вы просто хотите что-то сделать с цветовой полосой в одном или нескольких конкретных местах. Это легко, следующие случаи показывают пример записи текстовой строки в 0,5.

x1=np.random.random(1000)
x2=np.random.random(1000)
x3=np.random.random(1000)
plt.scatter(x1, x2, c=x3, marker='+')
cb=plt.colorbar()
color_norm=lambda x: (x-cb.vmin)/(cb.vmax-cb.vmin)
cb.ax.text(0.5, color_norm(0.5), 'Do something.\nRight here', color='r')

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

Если вы хотите иметь значение 0,5 точно на 1/3 высоты цветной полосы, вам нужно настроить предел цветной полосы, используя метод cb.set_clim((cmin, cmax)). Будет бесконечное количество возможных (cmin, cmax), соответствующих вашим потребностям, поэтому необходимы дополнительные ограничения, такие как сохранение минимального постоянного значения, сохранение максимального постоянного значения или сохранение постоянного значения максимального-минимального значения.

person CT Zhu    schedule 25.09.2013
comment
да, это часть того, что я хочу, сделать что-то в тике из функции позиционирования. но сейчас еще. Как мы можем сделать цветную полосу растянутой? например, RdYIGn, с желтым цветом вместо 1/3 места, и вся цветовая карта растянута, чтобы соответствовать (nbviewer .ipython.org/5357268). Я думаю, что, возможно, мне захочется создать вспомогательную функцию для растяжения этой предварительно определенной цветовой карты, возможно, из массива [0, pivot1, pivot2, pivot3,..., 1]. Спасибо за ответ. :) - person Hualin; 25.09.2013
comment
Основная проблема в том, что из-за моих языковых навыков я точно не знаю, как описать свою проблему. еще раз посмотрев на мой заголовок, чувак, это именно то, что ты ответил. - person Hualin; 25.09.2013
comment
Желтый цвет в RdYiGn равен 0,5, вы хотите изменить его на 0,3333, оставив максимальное значение темно-зеленым? То есть растягивать все, что выше 0,5, и сжимать все, что ниже 0,5? Я не думаю, что вы сможете сделать это эффективно без предложения LinearSegmentedColormap @tcaswell. Следуйте этому примеру: matplotlib.org/examples/pylab_examples/custom_cmap.html - person CT Zhu; 25.09.2013