2015-12-03 19 views
8

Ich habe mit Python, Pandas und Seaborn gearbeitet, um eine Heatmap mit verschiedenen Colormaps/Spalten zu erhalten. Dank this Frage habe ich folgendes:Plotten sortiert Heatmap (x, y) Werte Farben

Beispieldatenrahmen (sample.csv):

X,a,b,c 
A,0.5,0.7,0.4 
B,0.9,0.3,0.8 
C,0.3,0.4,0.7 

Grundstück Heatmap mit Seaborn

import pandas as pd 
import matplotlib as mpl 
# Set new Backend to Use Seaborn 
# mpl.use('Agg') 
import seaborn as sns 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 
import colorsys 

# Working example data: 
df = pd.DataFrame([[0.5,0.7,0.4],[.9,.3,.8],[.3,.4,.7]],['A','B','C'])  

# Get Color List 
N = 3 
COL = [colorsys.hsv_to_rgb(x*1.0/N, 0.7, 0.5) for x in range(N)] 

with sns.axes_style('white'): 

    for i, name in enumerate(df.columns): 

     # Create cmap 
     colors = COL[i] 
     cmap = sns.light_palette(colors, input='rgb', reverse=False, as_cmap=True) 

     sns.heatmap(df.mask(df.isin(df[name])!=1), 
        cbar=False, 
        square=True, 
        annot=False, 
        cmap=cmap, 
        linewidths=0.1) 
plt.show() 

Dieses eine Heatmap mit verschiedenen Farbtabellen erzeugen/Spalte (die Werte dienen nur zur Verdeutlichung des Problems):

enter image description here

Nun möchte Ich mag die gleiche Handlung mit dem sortierten Datenrahmen wie produzieren:

X,col1,col2,col3 
A,0.7,0.5,0.4 
B,0.9,0.8,0.3 
C,0.7,0.4,0.3 

Des Versuch, die ursprüngliche Farbe des Paares (Index, Spalte) zu halten, wie die folgenden erwarteten Entwurf Ausgabe (Werte sind Richtwerte, was ich sind brauchen würde nur die Farben):

enter image description here

EDIT:

Einige Tippfehler wurden korrigiert, jetzt ist df der Datenrahmen, der die Arbeitsmatrix darstellt.

+0

ich nicht sicher bin ich das Problem hier verstanden, verließ ich eine vorläufige Antwort, aber ich würde diese Frage bearbeiten klarer zu machen, wo Sie sind und welche genaue Problem Sie konfrontiert sind – rll

+0

ein [minimales Arbeitsbeispiel] Stellen (http://stackoverflow.com/help/mcve) mit dem, was du bisher gemacht hast, damit ich verstehen kann, was eigentlich dein Problem ist – rll

+0

Ich dachte, dass meine zweite Bearbeitung geholfen hätte. Das Arbeitsbeispiel ist noch da, ich kann eine Ausgabe nicht reproduzieren, da es mein Problem ist. –

Antwort

2

Sie könnten einmal über das Array iterieren und die Farben erhalten, die jedem Wert entsprechen, und sie in einem NxMx3 (Bild) -Array speichern. Dann sortiere das Array und das Bild auf die gleiche Weise, z. Holen Sie die Sortierindizes aus dem ursprünglichen Array und wenden Sie sie auf das Bildfeld an. Dann können Sie das Bild anzeigen mit plt.imshow Sie können dann mit matplotlib Etikett hinzufügen, Zecken usw.

Diese so aussehen könnte: Sie sollten zunächst eine NxMx3 Array erstellen, die Farben zu speichern.

im = np.zeros((df.shape[0], df.shape[1], 3))

Sie können dann jede Spalte iterieren und skalieren Sie den Wert von 0 bis 255, z.B.

color_index = (value-min(column))/(max(column)-min(column)*255

dann können Sie

color = cmap(color_index)

im[col_index, row_index, :] = color

verwenden, wenn Sie über jede Spalte wiederholt haben, haben Sie alle gespeicherten Farben in im

Der resultierende Code wäre:

import pandas as pd 
import matplotlib as mpl 
# Set new Backend to Use Seaborn 
# mpl.use('Agg') 
import seaborn as sns 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 
import colorsys 
import numpy as np 

# Working example data: 
df = pd.DataFrame([[0.5,0.7,0.4],[.9,.3,.8],[.3,.4,.7]],['A','B','C'])  

# Get Color List 
N = 3 
COL = [colorsys.hsv_to_rgb(x*1.0/N, 0.7, 0.5) for x in range(N)] 

im = np.zeros((df.shape[0], df.shape[1], 4)) 

with sns.axes_style('white'): 

    for i, name in enumerate(df.columns): 

     # Create cmap 
     colors = COL[i] 
     cmap = sns.light_palette(colors, input='rgb', reverse=False, as_cmap=True) 
     values = np.array(df[name]) 
     color_indices = (values-np.min(values))/(np.max(values)-np.min(values)) 
     im[:,i,:] = cmap(color_indices) 

im2 = im.copy() 
for i, name in enumerate(df.T.columns): 
    values = np.array(df.T[name]) 
    print(values) 
    sorting = np.argsort(values) 
    print("sorting", sorting) 
    im2[i, ::-1, :] = im[i, sorting, :] 
plt.imshow(im2, interpolation="nearest") 
plt.grid(False) 
plt.show() 
+0

Danke, ich habe darüber nachgedacht, aber wie kann ich Zugang zu den Farben für jede Position haben? Das wäre sehr nützlich. –

+0

Sieht vielversprechend aus, aber macht es Ihnen etwas aus, ein komplettes Beispiel und eine Ausgabe zu liefern? Du bist nahe dran, das Kopfgeld zu gewinnen! :-) –

+0

So, jetzt habe ich ein Arbeitscode Beispiel hinzugefügt. – Randrian

1

Mit seaborn heatmap müssen Sie nur die verschiedenen Farbkarten bereitstellen und unabhängig von der Reihenfolge vmin und vmax einstellen. Eigentlich

Vmin, Vmax: Schwimmer, optional

Werte der colormap zu verankern, sonst werden sie von den Daten und andere Schlüsselwort Argumente abgeleitet.

Was bedeutet, dass Sie sollten nicht die Min-/Max-Werte angeben müssen, wenn Sie sie außerhalb Ihrer Datenpunkte wollen.

Verwandte Themen