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
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
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
Etwas wie 'zip (* sortiert (zip (Variablen, Werte), Schlüssel = Lambda x: abs (x [1]))) [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! –