2016-10-13 4 views
0

Ich habe einen Tornado-Plot erstellt, der von here inspiriert wurde. Es hat Eingangsvariablen auf der y-Achse (a1, b1, c1 ...) und ihre jeweiligen Korrelationskoeffizienten neben ihnen. Siehe Bild unten:Python: Verbinden von Listenwerten mit Array-Werten

enter image description here

ich dann die Korrelationskoeffizienten in einer Weise sortiert, dass der höchste Absolutwert ohne ihr Vorzeichen zu verlieren zuerst aufgetragen wird, dann wird die nächste höchste und so weiter. mit sorted(values,key=abs, reverse=True). Sehen Sie das Ergebnis unter

enter image description here

Wenn Sie bemerken, im zweiten Bild, obwohl die Bars in der absoluten absteigenden Reihenfolge sortiert wurden, das y-Achse Etikett immer noch die gleichen bleiben.

Frage: Wie mache ich die Y-Achse Label (Variable) Verbindung mit dem Korrelationskoeffizienten, so dass es immer seinen Korrelationskoeffizienten entspricht.

Unten ist mein Code:

import numpy as np 
from matplotlib import pyplot as plt 

#####Importing Data from csv file##### 
dataset1 = np.genfromtxt('dataSet1.csv', dtype = float, delimiter = ',', skip_header = 1, names = ['a', 'b', 'c', 'x0']) 
dataset2 = np.genfromtxt('dataSet2.csv', dtype = float, delimiter = ',', skip_header = 1, names = ['a', 'b', 'c', 'x0']) 
dataset3 = np.genfromtxt('dataSet3.csv', dtype = float, delimiter = ',', skip_header = 1, names = ['a', 'b', 'c', 'x0']) 

corr1 = np.corrcoef(dataset1['a'],dataset1['x0']) 
corr2 = np.corrcoef(dataset1['b'],dataset1['x0']) 
corr3 = np.corrcoef(dataset1['c'],dataset1['x0']) 
corr4 = np.corrcoef(dataset2['a'],dataset2['x0']) 
corr5 = np.corrcoef(dataset2['b'],dataset2['x0']) 
corr6 = np.corrcoef(dataset2['c'],dataset2['x0']) 
corr7 = np.corrcoef(dataset3['a'],dataset3['x0']) 
corr8 = np.corrcoef(dataset3['b'],dataset3['x0']) 
corr9 = np.corrcoef(dataset3['c'],dataset3['x0']) 

np.set_printoptions(precision=4) 
variables = ['a1','b1','c1','a2','b2','c2','a3','b3','c3'] 
base = 0 
values = np.array([corr1[0,1],corr2[0,1],corr3[0,1], 
        corr4[0,1],corr5[0,1],corr6[0,1], 
        corr7[0,1],corr8[0,1],corr9[0,1]]) 
values = sorted(values,key=abs, reverse=True) 
# The y position for each variable 
ys = range(len(values))[::-1] # top to bottom 
# Plot the bars, one by one 
for y, value in zip(ys, values): 
    high_width = base + value 
    #print high_width 

    # Each bar is a "broken" horizontal bar chart 
    plt.broken_barh(
     [(base, high_width)], 
     (y - 0.4, 0.8), 
     facecolors=['red', 'red'], # Try different colors if you like 
     edgecolors=['black', 'black'], 
     linewidth=1) 
# Draw a vertical line down the middle 
plt.axvline(base, color='black') 
# Position the x-axis on the top/bottom, hide all the other spines (=axis lines) 
axes = plt.gca() # (gca = get current axes) 
axes.spines['left'].set_visible(False) 
axes.spines['right'].set_visible(False) 
axes.spines['top'].set_visible(False) 
axes.xaxis.set_ticks_position('bottom') 
# Make the y-axis display the variables 
plt.yticks(ys, variables) 

plt.ylim(-2, len(variables)) 
plt.show() 

Vielen Dank im Voraus

+3

Etwas wie 'zip (* sortiert (zip (Variablen, Werte), Schlüssel = Lambda x: abs (x [1]))) [0]' –

+0

@PatrickHaugh: Ihr Vorschlag hat funktioniert. Ich musste nur die Reihenfolge umkehren, um das gewünschte Ergebnis zu erhalten. Schätzen Sie Ihre Hilfe dabei. Vielen Dank! –

Antwort

0

Verwendung build-in Zip-Funktion - gibt eine Liste von Tupeln, wobei der i-te Tupel das i-te Element enthält aus jede der Argumentfolgen oder Iterablen. Beachten Sie jedoch, dass die zurückgegebene Liste auf die Länge der kürzesten Argumentsequenz gekürzt wird.

Verwandte Themen