2016-06-22 7 views
1

den folgenden Datenrahmen Gegeben:Matplotlib Farbe y-tick Labels über die Schleife

import pandas as pd 
import numpy as np 
df=pd.DataFrame({'A':['A','B','C','D','E','F','G','H','I','J','K','L','M','N'], 
       'B':[20,25,39,43,32,17,40, 40, 34, 56, 76, 23, 54, 34]}) 

Ich möchte ein Blasendiagramm erstellen, in dem jedes Y-tick Etikett die gleiche Farbe wie der jeweilige Punkt. Der Code unten funktioniert gut, wenn ich nur 4 Reihen von Daten und 4 Farben in meiner Farbliste gesagt habe. Aus irgendeinem Grund, wenn ich mehr als 9 Reihen von Daten (und Farben in meiner Farbliste) habe, braucht es nur die ersten 9 Elemente von Farben in der Zeile l.set_color (i). Irgendwelche Gedanken, warum dies geschieht? Ist es eine Einschränkung von zip beim Iterieren? Bezogen auf den Datenrahmen?

import matplotlib.pyplot as plt 
import matplotlib.ticker as mtick 
labels=df.A[::-1] 
vals=df.B[::-1] 
ind=np.arange(len(labels)) 
colors1=['r','g','b','c','y','y','y','g','b','c','y','y','y','g'] 
fig, ax = plt.subplots(1, 1, figsize = (6,4)) 
for i in ind: 
    plt.plot(vals[i],i,marker='o',markeredgecolor='none', markersize=17, alpha=.5, linestyle='none', color=colors1[i]) 
ax.tick_params(axis='x',which='both',bottom='on',top='off',color='grey',labelcolor='grey') 
ax.tick_params(axis='y',which='both',left='off',right='off',color='grey',labelcolor='grey') 
ax.spines['top'].set_visible(False);ax.spines['right'].set_visible(False); 
ax.spines['bottom'].set_visible(False);ax.spines['left'].set_visible(False) 

ax.set_xlim([0,50]) 
ax.set_ylim([min(ind)-1,max(ind)+1]) 
fontcols=colors1[::-1] 
for l,i in zip(ax.yaxis.get_ticklabels(),fontcols): 
    l.set_color(i) 
    l.set_fontsize(11) 
    print(l,i) #This shows that only 9 members are being colored for some reason 
plt.yticks(ind,labels,fontsize=14) 

plt.show() 

enter image description here

Vielen Dank im Voraus!

Antwort

1

Sie müssen nur die yticks einstellen, bevor Sie versuchen und die Farben einstellen. So wie es ist, erstellt matplotlib standardmäßig 9 Ticks, Sie legen ihre Farben fest, und dann sagen Sie, dass Sie 14 Ticks danach haben möchten. Mit nur ein wenig Neuordnen, es funktioniert alles:

import matplotlib.pyplot as plt 
import matplotlib.ticker as mtick 
import pandas as pd 
import numpy as np 
df=pd.DataFrame({'A':['A','B','C','D','E','F','G','H','I','J','K','L','M','N'], 
       'B':[20,25,39,43,32,17,40, 40, 34, 56, 76, 23, 54, 34]}) 

labels=df.A[::-1] 
vals=df.B[::-1] 
ind=np.arange(len(labels)) 
colors1=['r','g','b','c','y','y','y','g','b','c','y','y','y','g'] 
fig, ax = plt.subplots(1, 1, figsize = (6,4)) 
for i in ind: 
    plt.plot(vals[i],i,marker='o',markeredgecolor='none', markersize=17, alpha=.5, linestyle='none', color=colors1[i]) 
ax.tick_params(axis='x',which='both',bottom='on',top='off',color='grey',labelcolor='grey') 
ax.tick_params(axis='y',which='both',left='off',right='off',color='grey',labelcolor='grey') 
ax.spines['top'].set_visible(False);ax.spines['right'].set_visible(False); 
ax.spines['bottom'].set_visible(False);ax.spines['left'].set_visible(False) 

ax.set_xlim([0,80]) # I increased this to fit all your data in 
ax.set_ylim([min(ind)-1,max(ind)+1]) 
fontcols=colors1  # NOTE: you don't need to reverse this 
plt.yticks(ind,labels,fontsize=14) 
for l,i in zip(ax.yaxis.get_ticklabels(),fontcols): 
    l.set_color(i) 
    l.set_fontsize(11) 
    print(l,i) 

plt.show() 

enter image description here

Beachten Sie auch, brauchen Sie nicht die Farbe Liste zu umkehren, bevor Sie die Zecke Farben

+0

Einstellung Wow, danke! Klappt wunderbar. –

Verwandte Themen