2017-09-30 1 views
1

Ich habe eine Korrelationsmatrix, die ich mit Matplotlib visualisieren möchte. Ich kann eine Heatmap-Style-Figur erstellen, aber ich habe Probleme damit, wie ich die Labels haben möchte. Ich bin nicht einmal sicher, ob das möglich ist, aber das ist, was ich versuche zu tun und es scheint nicht zu funktionieren:Matplotlib Korrelationsmatrix Heatmap mit gruppierten Farben als Labels

Meine Korrelationsmatrix ist 150 X 150. Auf entweder X oder Y (oder beides ... das ist egal) Achse, ich möchte die Beschriftungen gruppieren und sie dann einfach mit einer Farbe oder einem weißen Etikett auf einem farbigen Hintergrund beschriften.

Um zu verdeutlichen, möchte ich sagen, ich hätte gerne 1-15 als "Gruppe 1" und entweder einfach ein blauer Balken oder "Gruppe 1" Text auf einem blauen Balken. Dann 16-20 als "Gruppe 2" auf einen roten Balken oder einfach einen roten Balken. Etc, durch alle Elemente in der Matrix.

Ich habe sowohl bei der Gruppierung von Achsenbeschriftungen als auch bei der Farbgebung versagt. Jede Hilfe würde sehr geschätzt werden. Mein Code ist unten, obwohl es ziemlich einfach ist und ich weiß nicht, ob es helfen wird.

import matplotlib.pyplot as plt 
import matplotlib.cm as cm 
import numpy as np 

# COREELATION MATRIX TEST # 
corr = np.genfromtxt(csv_path,delimiter=',') 
fig = plt.figure() 
ax1 = fig.add_subplot(111) 
cmap = cm.get_cmap('jet', 30) 
cax = ax1.imshow(corr, cmap=cmap) 
ax1.grid(True) 
plt.title('THIS IS MY TITLE') 
fig.colorbar(cax, ticks=[-1,-0.8,-0.6,-0.4,-0.2,0.0,0.2,0.4,0.6,0.8,1.0]) 
plt.show() 
+0

Wie funktioniert die Eingangsdaten aussehen und was ist der Gruppierungsparameter? Bitte geben Sie ein [mcve] mit einigen Beispieldaten an und erklären Sie, wie das Diagramm aussehen soll. Möglicherweise hilft auch eine einfache Zeichnung dessen, was Sie möchten, um die gewünschte Handlung zu verstehen. – ImportanceOfBeingErnest

+0

Ich habe ein Bild online gefunden, das ähnliche Daten zeigt und was ich gerne machen würde: [link] https://www.researchgate.net/profile/Deanna_Greene/publication/292707637/figure/fig5/AS:[email protected]/ Abbildung-1-Gruppen-Durchschnitt-264-ROI264-ROI-Korrelationsmatrizen-show-the-expected-network.png) In diesem Beispiel haben sie rote Linien und Beschriftungen (wie "Default Mode" und "Visual"). Ich möchte meine Variablen auf die gleiche Weise gruppieren, aber anstatt der roten Linien in der Matrix wäre das Etikett eher ein Farbfeld. Ähnlich wie die Farbleiste auf der Seite, aber mit manuell eingestellten Farben. – iamdamion

Antwort

1

Sie können Hilfsachsen neben dem Plot erstellen und farbige Balkenplots zu ihnen plotten. Durch Drehen der Achsenstacheln werden diese Balken wie Beschriftungsfelder angezeigt.

enter image description here

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.axes_grid1 import make_axes_locatable 

# COREELATION MATRIX TEST # 
corr = 2*np.random.rand(150,150)-1 
# labels [start,end] 
labels = np.array([[0,15],[16,36],[37,82],[83,111],[112,149]]) 
colors = ["crimson", "limegreen","gold","orchid","turquoise"] 

fig, ax = plt.subplots() 

im = ax.imshow(corr, cmap="Blues") 

ax.set_title('THIS IS MY TITLE') 
fig.colorbar(im, ticks=[-1,-0.8,-0.6,-0.4,-0.2,0.0,0.2,0.4,0.6,0.8,1.0]) 

# create axes next to plot 
divider = make_axes_locatable(ax) 
axb = divider.append_axes("bottom", "10%", pad=0.06, sharex=ax) 
axl = divider.append_axes("left", "10%", pad=0.06, sharey=ax) 
axb.invert_yaxis() 
axl.invert_xaxis() 
axb.axis("off") 
axl.axis("off") 


# plot colored bar plots to the axes 
barkw = dict(color=colors, linewidth=0.72, ec="k", clip_on=False, align='edge',) 
axb.bar(labels[:,0],np.ones(len(labels)), 
     width=np.diff(labels, axis=1).flatten(), **barkw) 
axl.barh(labels[:,0],np.ones(len(labels)), 
     height=np.diff(labels, axis=1).flatten(), **barkw) 

# set margins to zero again 
ax.margins(0) 
ax.tick_params(axis="both", bottom=0, left=0, labelbottom=0,labelleft=0) 
# Label the boxes 
textkw = dict(ha="center", va="center", fontsize="small") 
for k,l in labels: 
    axb.text((k+l)/2.,0.5, "{}-{}".format(k,l), **textkw) 
    axl.text(0.5,(k+l)/2., "{}-{}".format(k,l), rotation=-90,**textkw) 

plt.show()