matplotlib выбрать между 2 цветовой схемой или 3 цветовой схемой - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть график значений, выбранных из набора [-1, 0, 1], и каждое значение сопоставлено с цветом. Однако возможно иметь выборку, в которой отображаются только два разных значения ([-1,0], [-1,1], [0,1]), и если это произойдет, тогда цветовая схема должна адаптироваться соответственно

Если количество уникальных значений равно 3, этот код работает

ax2 = plt.subplot2grid((n_rows , 1), (2, 0))
colors = [(216/255, 24/255, 24/255), (1, 1, 1), (143/255, 188/255, 143/255)]    
positions = df['long'].astype(int) - df['short'].astype(int)
cm = LinearSegmentedColormap.from_list('mycols', colors, N=3)
ax2.pcolorfast(ax2.get_xlim(), ax2.get_ylim(),  positions.values[np.newaxis], cmap=cm, alpha=0.5)    

Результат

enter image description here

Как мне управлять сценариями, где нужны только два цвета?

Я думаю, что это контролирует количество сегментов, но я не знаю, как учесть цветовую схему

cm = LinearSegmentedColormap.from_list('colores', colors, N=len(list(set(positions))))

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Обычно не нужно создавать новую цветовую карту для каждого графика с разными значениями, а вместо этого менять нормализацию.

Здесь, насколько я понимаю, есть только значения [-1,0,1] или любое подмножество используемых. Следовательно, можно использовать одну нормализацию как plt.Normalize(-1,1) повсюду.

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import numpy as np


colors = [(216/255., 24/255., 24/255.), (1., 1., 1.), (143/255., 188/255., 143/255.)]
cmap = ListedColormap(colors)
norm=plt.Normalize(-1,1)

combinations = [[-1,0,1],[-1,0],[0,1],[-1,1]]

fig, axes = plt.subplots(nrows=len(combinations), sharex=True)

for combo, ax in zip(combinations, axes):    
    data = np.random.choice(combo, size=(50))

    ax.pcolorfast(np.atleast_2d(data), cmap=cmap, norm=norm, alpha=0.5)
    ax.set_ylabel(combo)

plt.show()

enter image description here

0 голосов
/ 04 сентября 2018

Если вы сделаете цвета массивом, вы можете сделать что-то вроде этого: colors[np.isin([-1, 0, 1], sorted(available_values))], чтобы выбрать только нужные цвета. [-1, 0, 1], конечно, должен быть полным списком всех доступных значений с однозначным соответствием с colors.

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

Пример кода (не проверено):

all_values = np.array([-1, 0, 1])
colors = np.array([(216/255, 24/255, 24/255), (1, 1, 1), (143/255, 188/255, 143/255)])
positions = df['long'].astype(int) - df['short'].astype(int)
available_values = set(positions)
cm = LinearSegmentedColormap.from_list('mycols', colors[np.isin(all_values, sorted(available_values))], N=len(available_values))
ax2.pcolorfast(ax2.get_xlim(), ax2.get_ylim(),  positions.values[np.newaxis], cmap=cm, alpha=0.5) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...