Heatmap mit Dendrogramm in Python + Matplotlib

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.

Datenaufbereitung

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.

Zur schnellen Anzeige

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()

fig01.png

Lass es gut aussehen

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()

fig02.png

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.

Cluster

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.

fig03.png

Lass es gut aussehen

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()

fig04.png

Die x-Achse ist ebenfalls gruppiert.

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()

fig05.png

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

Heatmap mit Dendrogramm in Python + Matplotlib
Heatmap von Python + matplotlib
Betreiben Sie LibreOffice mit Python
Schaben mit Chromedriver in Python
Umgang mit Sounds in Python
Scraping mit Selen in Python
Scraping mit Tor in Python
Kombiniert mit Ordnungszahl in Python
Erstellen Sie eine Plotanimation mit Python + Matplotlib
Python-Grafikhandbuch mit Matplotlib.
Testen mit Zufallszahlen in Python
GOTO in Python mit erhabenem Text 3
Arbeiten mit LibreOffice in Python: Importieren
Scraping mit Selen in Python (Basic)
Numer0n mit Elementen, die mit Python erstellt wurden
Öffnen Sie UTF-8 mit Stückliste in Python
Verwenden Sie rospy mit virtualenv in Python3
Verwenden Sie Python in pyenv mit NeoVim
Lesen Sie Dateien parallel zu Python
Passwort für Lehrbuch mit Python generieren
Verwenden Sie OpenCV mit Python 3 in Window
Bis zum Umgang mit Python in Atom
Zeichne Riapnov Fractal mit Python, matplotlib
Wenn matplotlib nicht mit python2.7 funktioniert
Führen Sie mit Python, matplotlib, einen logarithmischen Normalwahrscheinlichkeitsplot durch
Der erste Schritt von Python Matplotlib
Beginnen Sie mit Python mit Blender
Arbeiten mit DICOM-Bildern in Python
Anzeigen von LaTeX-Notationsformeln in Python, matplotlib
Holen Sie sich mit Python zusätzliche Daten zu LDAP
Spiralbuch in Python! Python mit einem Spiralbuch! (Kapitel 14 ~)
Versuchen Sie, sich mit Python bei qiita anzumelden
[Python] Legen Sie den Diagrammbereich mit matplotlib fest
Python3> im Schlüsselwort> Wahr mit teilweiser Übereinstimmung?
Exklusive Steuerung mit Sperrdatei in Python
Anzeigen des Candlestick-Diagramms in Python (Matplotlib-Edition)
Geräteüberwachung durch On-Box Python von IOS-XE
Versuchen Sie, mit Binärdaten in Python zu arbeiten
Zeichnen Sie Nozomi Sasaki in Excel mit Python
Tipps zum Umgang mit Binärdateien in Python
Ich habe eine Heatmap mit Seaborn [Python] gezeichnet.
Zeigen Sie Python 3 im Browser mit MAMP an
So arbeiten Sie mit BigQuery in Python
Trump-Klasse in Python (mit Vergleich)
Umgang mit "Jahren und Monaten" in Python
Verarbeiten Sie mehrere Listen mit for in Python
Ersetzen Sie Nicht-ASCII durch reguläre Ausdrücke in Python
[Python] Lassen Sie uns matplotlib mit Japanisch kompatibel machen
Einzeiler webServer (mit CGI) in Python
Beginnen wir mit TopCoder in Python (Version 2020)
Verarbeiten Sie Bilder in Python ganz einfach mit Pillow
So betreiben Sie die Zeitstempelstation in Python
Rufen Sie APIGateWay mit APIKey in Python-Anforderungen auf
Lesen von Zeichen in Bildern mit Python OCR
Einführung von sip-4.14 in der Python3.2.2-Umgebung mit MacOS 10.7.4
Warum kann ich matplotlib nicht mit Python installieren? !!