Как добавить цветовой код к ярлыку на тепловой карте моря? - PullRequest
0 голосов
/ 01 июля 2019

У меня есть матрица генных выражений в сравнении с клетками, и я хотел бы отобразить их в виде тепловой карты, что само по себе не является проблемой. Однако отображение всех генов в виде yticklabels было бы слишком хаотичным и визуально непривлекательным. Поэтому я аннотировал каждый из генов как принадлежащий определенной функциональной группе и хотел бы представить каждую функциональную группу в виде цвета, и чтобы их цвета отображались на тепловой карте в том же порядке, что и гены. Просто чтобы прояснить, я не хотел бы группировать их по цветам, которые, я полагаю, вы могли бы сделать с помощью кластерной карты seaborn.

Как таковой, до сих пор у меня есть pandas dataframe, который содержит мультииндекс генов и соответствующих им функциональных групп, а также клетки.

Я много раз искал ответы в Stackoverflow и Google, но безуспешно. Это моя первая попытка чего-либо подобного, поэтому, к сожалению, я не знаю, с чего именно начать.

Итак, для простоты предположим, что у вас есть следующий фрейм данных:

import seaborn as sns
import numpy as np
import pandas as pd

data=pd.DataFrame(np.array([(0,1,2),(4,5,6),(7,8,9)]), columns=['C1','C2','C3'], index=pd.MultiIndex.from_arrays([['Gene1','Gene2','Gene3'],['A','B','A']]))

Это даст следующее:

           C1  C2  C3
Gene1   A   0   1   2
Gene2   B   4   5   6
Gene3   A   7   8   9

Теперь я могу просто позвонить sns.heatmap(data), чтобы сгенерировать тепловую карту. Однако, как я могу настроить его так, чтобы я получал цвета, представляющие A & B, а не Gene1, Gene2, Gene3 как yticklabels? Например, скажем, «А» - синий, а «В» - зеленый, я хочу, чтобы эти yticklabels (сверху вниз>) были синего, зеленого и синего цвета.

Заранее большое спасибо.

1 Ответ

1 голос
/ 01 июля 2019

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

import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import numpy as np
import pandas as pd

data=pd.DataFrame(np.array([(0,1,2),(4,5,6),(7,8,9)]), 
                  columns=['C1','C2','C3'], 
                  index=pd.MultiIndex.from_arrays([['Gene1','Gene2','Gene3'],['A','B','A']]))


cats = data.index.to_frame().set_index(0)
u, inv = np.unique(cats.values, return_inverse=True)

colors = ["navy", "limegreen", "gold"]
assert(len(u) <= len(colors))

cmap = mcolors.ListedColormap(colors)
norm = mcolors.BoundaryNorm(np.arange(len(u)+1)-.5, len(u))

fig, (sax, hax) = plt.subplots(ncols=2, sharey=True,
                               gridspec_kw=dict(width_ratios=[1, data.shape[1]]))

im = sax.imshow(np.atleast_2d(inv).T, cmap=cmap, norm=norm)
hax.imshow(data.values, cmap="Greys")

sax.set_yticks(np.arange(len(cats)))
sax.set_yticklabels(cats.index)
sax.tick_params(bottom=False, labelbottom=False)

hax.set_xticks(np.arange(len(data.columns)))
hax.set_xticklabels(data.columns)

cbar = fig.colorbar(im, cax = fig.add_axes([.125, .08, .1, .04]), 
                    orientation="horizontal", ticks=np.arange(len(u)))
cbar.set_ticklabels(u)

plt.show()

enter image description here

...