2017-11-22 1 views
1

전설 순서가 가장 최근의 관측 순위에 의해 결정되는 간단한 범프 차트를 만들려고합니다. 나는 판다 (pandas) DataFrame "y"와 같은 줄을 가로 지르는 랭킹을 가지고있다.matplotlib 범례의 아이템을 동적으로 재주문하는 방법은 무엇입니까?

In[231]: y 
Out[231]: 
Currency AUD CAD CHF EUR GBP JPY NOK NZD SEK USD 
2017-09-08 5.0 1.0 8.0 3.0 9.0 7.0 4.0 6.0 2.0 10.0 
2017-09-22 8.0 2.0 10.0 1.0 5.0 9.0 4.0 6.0 3.0 7.0 
2017-10-06 4.0 5.0 10.0 2.0 7.0 9.0 3.0 8.0 1.0 6.0 
2017-10-20 3.0 4.0 10.0 1.0 7.0 5.0 6.0 9.0 2.0 8.0 
2017-11-03 5.0 3.0 10.0 1.0 9.0 7.0 2.0 8.0 4.0 6.0 
2017-11-17 5.0 4.0 10.0 1.0 9.0 7.0 3.0 8.0 2.0 6.0 

내가 지금까지 사용했던 코드 :

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 

fig = plt.figure(figsize=(8.5,8.5)) 
ax = fig.add_subplot(111) 

l1,l2,l3,l4,l5,l6,l7,l8,l9,l10 = ax.plot_date(y.index.to_pydatetime(), y, '*-') 
ax.xaxis.set_major_locator(mdates.WeekdayLocator(byweekday=(4),interval=2)) 
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %d')) 
ax.yaxis.set_ticks(np.arange(1, 11, 1)) 
ax.set_title('Sample Chart', fontsize=20) 
plt.gca().invert_yaxis() 
fig.legend([l1,l2,l3,l4,l5,l6,l7,l8,l9,l10], ['AUD','CAD','CHF','EUR','GBP','JPY','NOK','NZD','SEK','USD'], 'right', fontsize=16, frameon=False, labelspacing=1.4) 
plt.tight_layout(pad=10) 

fig.png

의 출력을 생성하는 내 질문 2017 '에서 마지막 관찰을 기반으로 전설의 순서를 변경하는 방법입니다 -11-17? 즉, 나는 EUR, SEK, NOK 등을 원한다. 나는 정적 알파벳 순서를 원하지 않는다. 본질적으로 fig.legend에서 [l4, l9, l7, ..., l3]이 필요하지만,이 목록은 행이 'y'에 추가 될 때 순서가 변경됩니다. 적절한 순서로 목록을 생성 할 수는 있지만 fig.legend는 요소가 인용 부호로 묶인 목록을 허용하지 않습니다. 즉, [ 'l4', 'l9', 'l7', ..., 'l3'].

내가 완전히 잘못 될 수 있으므로 도움이 될 것입니다.

답변

0

데이터 프레임의 마지막 (또는 다른) 행을 정렬 한 결과로 레이블 목록뿐만 아니라 범례 핸들로 사용할 줄 목록을 정렬해야합니다.

lines = ax.plot_date(...) 
lastrow = y.iloc[-1,:].values 
order = np.argsort(lastrow) 
fig.legend(np.array(lines)[order], y.columns[order]) 

전체 예제 :

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 

fig, ax = plt.subplots(figsize=(6.4,3)) 

lines = ax.plot_date(y.index.to_pydatetime(), y, '*-') 
ax.xaxis.set_major_locator(mdates.WeekdayLocator(byweekday=(4),interval=2)) 
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %d')) 
ax.yaxis.set_ticks(np.arange(1, 11, 1)) 

plt.gca().invert_yaxis() 

lastrow = y.iloc[-1,:].values 
order = np.argsort(lastrow) 
fig.legend(np.array(lines)[order], y.columns[order], loc='right', frameon=False) 
plt.subplots_adjust(right=0.85) 
plt.show() 

enter image description here

+0

완벽하게 작동합니다, 감사합니다! – RHoward