Я пытаюсь сделать 1D тепловую карту для гена (например, см. ссылку 1 в pastebin). Я приблизился к тому, что ищу, с помощью контура, но я не смог понять, как получить именно то, что я ищу. По сути, я хочу использовать палитру с 10 дискретными цветами, а отсечки для разных цветов соответствуют процентилю данных (таким образом, верхние 10% точек данных красные, следующие 10% — оранжевые и т. д.).
У меня недостаточно репутации, чтобы публиковать более двух ссылок или изображений, поэтому вы также можете увидеть мои выходные изображения из приведенного ниже кода, а также другие страницы, которые я просмотрел, чтобы попытаться решить этот вопрос, на http://pastebin.com/jAkxyQsK.
Фактические точки данных находятся в списке по адресу http://pastebin.com/3TrkkpZ0. Вы можете попробовать использовать случайные целые числа, но разница между линейным масштабированием и процентильным масштабированием, скорее всего, не будет ясна, если ваши данные не будут искажены, как мои.
data = [] #actually a list of ~450 floats
x = []
nd = np.array(data)
x = np.empty([2, nd.shape[0]])
x[:,:] = nd
fig = plt.figure(figsize = (11, 8.5))
ax = fig.add_subplot(111)
А теперь мои эксперименты:
mind, maxd, sprd = min(data), max(data), max(data)-min(data)
levels = [(lambda n: mind + (n*sprd)/10)(n) for n in range(0,11,1)]
hm = plt.contourf(x, levels = levels, cmap = "rainbow")
cbar = fig.colorbar(hm, ax = ax)
plt.show()
[Figure 1 on pastebin]
В основном это то, что я хочу видеть: цветная полоса дискретизирована, и график выглядит нормально, но цветовая полоса линейно разнесена между максимальным и минимальным значением данных, а это не то, что мне нужно. Попытка вторая:
levels = np.percentile(data, [z for z in range (0,110,10)])
hm = plt.contourf(x, levels = levels, cmap = "rainbow")
cbar = fig.colorbar(hm, ax = ax)
plt.show()
[Figure 2 on pastebin]
Это тоже близко; цветовая полоса разделена значениями процентилей (или, по крайней мере, значения галочки указывают на это), но по какой-то причине она больше не использует весь диапазон цветовой карты, и я понятия не имею, почему.
Я также пытался реализовать функцию, описанную в ссылках 2 и 3, с помощью pcolor, но я не мог понять, как заставить их работать с моими данными вместо точечной диаграммы, и результаты были не так близки, как я мог бы получить с помощью контура, поэтому Я перестал их преследовать. Если ответ уже есть в одной из ссылок, которые я просматривал, но я не мог его понять, то перевод на «простой английский» был бы очень полезен.