In R können Sie eine Wärmekarte mit einem Dendrogramm zeichnen, das für jede Achse von x und y gruppiert ist, indem Sie einfach "Heatmap (x)" eingeben. Dies ist Bioinformatikern bekannt, die jeden Tag murmeln, z. B. die Genexpressionsstufe. Es ist eine Funktion von, aber als ich versuchte, dasselbe in der Python + matplotlib-Umgebung zu tun, gab es nicht viele Informationen, also versuchte ich es durch Ausprobieren.
Ich werde es als Memorandum veröffentlichen.
Erstellen Sie zunächst als geeignete Daten Daten, die die Zunahme oder Abnahme des Genexpressionsniveaus für jedes Zellgewebe zeigen. Die Gewebe- und Genentscheidungen hier sind alle angemessen. Wir werden die randomisierten Daten in ein "pandas.DataFrame" -Objekt optimieren, so dass es beim späteren Clustering so aussieht.
python
#!/usr/bin/env python3
genes = [
'HIST1H4H', 'SPRN', 'DNLZ', 'PYCARD', 'PRDM11', 'DKKL1', 'CYBRD1', 'DMAP1',
'MT1E', 'PDGFRL', 'SERTM1', 'PIFO', 'FAM109A', 'ST5', 'ABCA7', 'FAM160A1',
'SAMD15', 'NUAK1', 'GLTP', 'HIST3H2A', 'SCN5A', 'PNPLA5', 'SFRP5', 'CCBE1',
'PTCD1', 'RFTN1', 'SYTL2', 'FAM65B', 'NFKBIZ', 'RHOG', 'KIF3A', 'DYRK1B',
'NXPH2', 'APLN', 'ZNF526', 'NRIP3', 'KCNMA1', 'MTSS1', 'ZNF566', 'TNC',
'GPX2', 'AQP3', 'TSACC', 'SNX15', 'TRIM22', 'THAP6', 'GRIP1', 'DLGAP3',
]
tissues = [
'brain', 'kidney', 'lung', 'heart',
'liver', 'pancreas', 'testis', 'placenta',
]
def draw_heatmap(a):
print(a.head())
def _main():
from random import choice
import numpy as np
from pandas import DataFrame
v = np.random.random([4, len(tissues)]) * 1.2 - 0.6
w = np.random.random([3, len(genes)]) * 0.8 - 0.4
v = np.vstack([choice(v) for x in genes])
w = np.vstack([choice(w) for x in tissues]).T
a = DataFrame(v + w, index=genes, columns=tissues)
draw_heatmap(a)
if __name__ == '__main__':
_main()
Ausführungsergebnis
brain kidney lung heart liver pancreas \
HIST1H4H -0.085630 0.074054 0.058026 -0.142751 -0.767515 -0.348885
SPRN -0.424203 0.251821 -0.012052 -0.037645 -0.000477 0.714727
DNLZ 0.372402 0.532086 0.097971 -0.102806 -0.727570 0.109148
PYCARD -0.561378 0.114647 0.706732 0.681139 0.718306 0.577552
PRDM11 -0.698969 -0.022945 0.240133 0.214540 0.251708 0.439960
testis placenta
HIST1H4H 0.324709 -0.319531
SPRN -0.815679 -0.010529
DNLZ 0.402956 -0.241284
PYCARD -0.728135 0.077015
PRDM11 -0.773637 0.031513
Von nun an werden wir nur noch mit der Funktion "draw_heatmap (a)" spielen.
Wenn Sie vorerst nur die Daten überprüfen möchten, anstatt Materialien zu erstellen, können Sie diese anzeigen, indem Sie die Daten wie folgt in imshow ()
of matplotlib
einfügen.
def draw_heatmap(a):
from matplotlib import pyplot as plt
plt.imshow(a, aspect='auto', interpolation='none')
plt.colorbar()
plt.xticks(range(a.shape[1]), a.columns)
plt.yticks(range(a.shape[0]), a.index)
plt.show()
Wir werden dafür sorgen, dass es etwas besser aussieht als im obigen Beispiel.
from matplotlib.colors import LinearSegmentedColormap
microarray_cmap = LinearSegmentedColormap('microarray', {
'red': [(0.0, 1.0, 1.0), (0.5, 0.2, 0.2), (1.0, 0.0, 0.0)],
'green': [(0.0, 0.0, 0.0), (0.5, 0.2, 0.2), (1.0, 1.0, 1.0)],
'blue': [(0.0, 0.0, 0.0), (0.5, 0.2, 0.2), (1.0, 0.0, 0.0)],
})
def draw_heatmap(a, cmap=microarray_cmap):
from matplotlib import pyplot as plt
plt.imshow(a, aspect='auto', interpolation='none',
cmap=cmap, vmin=-1.0, vmax=1.0)
plt.colorbar()
plt.xticks(range(a.shape[1]), a.columns, rotation=15)
plt.yticks(range(a.shape[0]), a.index, size='small')
plt.gca().get_xaxis().set_ticks_position('none')
plt.gca().get_yaxis().set_ticks_position('none')
plt.show()
Eine Farbkarte, die von rot über schwarz nach grün wechselt, ist nicht in der Voreinstellung von matplotlib enthalten, daher definiere ich sie selbst mit "LinearSegmentedColormap". Wenn 0 vollständig schwarz ist, ist der Helligkeitsunterschied in der Nähe von 0 zu gering, um verstanden zu werden, also wage ich es, das mittlere Dunkelgrau zu machen.
Es ist einfacher zu sehen, indem Gene mit ähnlichen Expressionsmustern geclustert werden.
def draw_heatmap(a, cmap=microarray_cmap):
from matplotlib import pyplot as plt
from scipy.spatial.distance import pdist
from scipy.cluster.hierarchy import linkage, dendrogram
metric = 'euclidean'
method = 'average'
plt.subplot(1, 2, 1)
ylinkage =linkage(pdist(a, metric=metric), method=method, metric=metric)
ydendro = dendrogram(ylinkage, orientation='right', no_labels=True,
distance_sort='descending')
a = a.ix[[a.index[i] for i in ydendro['leaves']]]
plt.subplot(1, 2, 2)
plt.imshow(a, aspect='auto', interpolation='none',
cmap=cmap, vmin=-1.0, vmax=1.0)
plt.colorbar()
plt.xticks(range(a.shape[1]), a.columns, rotation=15)
plt.yticks(range(a.shape[0]), a.index, size='small')
plt.gca().xaxis.set_ticks_position('none')
plt.gca().yaxis.set_ticks_position('none')
plt.gca().invert_yaxis()
plt.show()
Verwenden Sie die Scipy-Funktion, um hierarchisches Clustering durchzuführen und neben dem Dendrogramm zu zeichnen.
dendrogram (..., no_plot = True)
an.Lässt das obige Beispiel gut aussehen.
def draw_heatmap(a, cmap=microarray_cmap):
from matplotlib import pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
from scipy.spatial.distance import pdist
from scipy.cluster.hierarchy import linkage, dendrogram
metric = 'euclidean'
method = 'average'
main_axes = plt.gca()
divider = make_axes_locatable(main_axes)
plt.sca(divider.append_axes("left", 1.0, pad=0))
ylinkage = linkage(pdist(a, metric=metric), method=method, metric=metric)
ydendro = dendrogram(ylinkage, orientation='right', no_labels=True,
distance_sort='descending',
link_color_func=lambda x: 'black')
plt.gca().set_axis_off()
a = a.ix[[a.index[i] for i in ydendro['leaves']]]
plt.sca(main_axes)
plt.imshow(a, aspect='auto', interpolation='none',
cmap=cmap, vmin=-1.0, vmax=1.0)
plt.colorbar(pad=0.15)
plt.gca().yaxis.tick_right()
plt.xticks(range(a.shape[1]), a.columns, rotation=15, size='small')
plt.yticks(range(a.shape[0]), a.index, size='small')
plt.gca().xaxis.set_ticks_position('none')
plt.gca().yaxis.set_ticks_position('none')
plt.gca().invert_yaxis()
plt.show()
make_axes_locatable ()
anstelle vonsubplot ()
.set_axis_off ()
aus und machen Sie die Linie nur mit link_color_func
schwarz.yaxis.tick_right ()
bringt die Beschriftung der y-Achse nach rechts. Da es sich so wie es ist mit der Farbleiste überlappt, wird das Intervall als "Farbleiste (pad = ...)" erweitert.Für Zeitreihendaten ist dies nicht erforderlich, es ist jedoch möglicherweise einfacher zu verstehen, ob die x-Achse auch für Daten für jede Organisation gruppiert ist. Was Sie tun, ist im Grunde das gleiche wie zuvor.
def draw_heatmap(a, cmap=microarray_cmap):
from matplotlib import pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
from scipy.spatial.distance import pdist
from scipy.cluster.hierarchy import linkage, dendrogram
metric = 'euclidean'
method = 'average'
main_axes = plt.gca()
divider = make_axes_locatable(main_axes)
xdendro_axes = divider.append_axes("top", 0.5, pad=0)
ydendro_axes = divider.append_axes("left", 1.0, pad=0)
plt.sca(xdendro_axes)
xlinkage = linkage(pdist(a.T, metric=metric), method=method, metric=metric)
xdendro = dendrogram(xlinkage, orientation='top', no_labels=True,
distance_sort='descending',
link_color_func=lambda x: 'black')
plt.gca().set_axis_off()
a = a[[a.columns[i] for i in xdendro['leaves']]]
plt.sca(ydendro_axes)
ylinkage = linkage(pdist(a, metric=metric), method=method,
metric=metric)
ydendro = dendrogram(ylinkage, orientation='right', no_labels=True,
distance_sort='descending',
link_color_func=lambda x: 'black')
plt.gca().set_axis_off()
a = a.ix[[a.index[i] for i in ydendro['leaves']]]
plt.sca(main_axes)
plt.imshow(a, aspect='auto', interpolation='none',
cmap=cmap, vmin=-1.0, vmax=1.0)
plt.colorbar(pad=0.15)
plt.gca().yaxis.tick_right()
plt.xticks(range(a.shape[1]), a.columns, rotation=15, size='small')
plt.yticks(range(a.shape[0]), a.index, size='x-small')
plt.gca().xaxis.set_ticks_position('none')
plt.gca().yaxis.set_ticks_position('none')
plt.gca().invert_yaxis()
plt.show()
Fügen Sie es danach einfach mit "savefig (" hoge.eps ") und so weiter in das Papier ein.
Übrigens habe ich das Gefühl, dass die Bedeutung von "Dendrogramm (Orientierung = ...)" zwischen Quer- und Hochformat unterschiedlich ist ... Scipy-Fehler?
Recommended Posts