2017-11-12 20 views
0

내 의도 : 일부 내용을 플롯하고 기본 x-tick 레이블에 해당하는 숫자를 가져 와서 이러한 목록을 색인에 사용하므로 그 날짜를 기본 레이블 대신 넣을 수 있습니다.기본 x-tick 레이블 텍스트를 색인으로 사용하여 눈금 레이블을 다른 텍스트로 업데이트

나는 두 개의 목록이 상상 :

my_data = range(30) 
dates_ls = ['date_str1', 'date_str2', ... , 'date_str30'] 

그때 그냥 기본 x 축에서 숫자 색인 dates_ls을 의미 dates_ls에서 해당 날짜로 X-틱을 대체,이 데이터를 플롯 할 눈금 레이블.

편집 : 나는 목록입니다 URL_names 및 metrics_ls을 통해 반복하고있어, 위의에서

dates_ls = ['dates_' + str(x+1) for x in range(30)] 
metrics_ls = ['sessions', 'pageviews'] 
URL_names = ['URL_1', 'URL_2'] 
DataDict_final = dict() 
for name in URL_names: 
    DataDict_final[name] = {metric: [] for metric in metrics_ls} 
DataDict_final['URL_1']['sessions'] = range(30) # manually define for this example 
DataDict_final['URL_1']['pageviews'] = range(30) 
DataDict_final['URL_2']['sessions'] = range(30) 
DataDict_final['URL_2']['pageviews'] = range(30) 

for cur_page in URL_names: 

    # plot 
    fig, ax = plt.subplots() 
    for i, cur_metric in enumerate(metrics_ls): 
     data2plot = DataDict_final[cur_page] [cur_metric]  
     ax.plot(data2plot, label=cur_metric) 

    # x and y axis limits and labels 
    ax.set_xlim(0, len(DataDict_final[cur_page] [cur_metric])-1)  
    x_labs1 = [int(label.get_position()[0]) for label in ax.get_xticklabels()] 
    x_labs2 = [dates_ls[x] for x in x_labs1] 
    ax.set_xticklabels(x_labs2, fontsize=8, rotation=45, ha='right') 

: 그래서, 문제는 내가 for 루프에있어한다는 사실 때문에 어떻게 든 것으로 보인다 나는 숫자의 단지 목록 인 data2plot을 얻을 수있는 사전 키를 가지고있다. 강조 표시하고 for 루프를 사용하여 코드를 실행하면 잘 동작하지만 여러 개의 숫자를 생성하는 전체 루프를 실행하면 x_labs1은 0의 목록으로 끝나기 때문에 모든 x-tick 레이블은 동일합니다 dates_ls의 첫 번째 항목입니다.

+0

어떤 프로그램에서 + 입력하고 강조 표시 하시겠습니까? 문제를 재현 할 수 있는지 확인하십시오. – ImportanceOfBeingErnest

+0

Spyder 3.1.2를 사용하고 있습니다. – pavlov

+0

OP를 편집하여 여러 줄을 작성하는 for 루프에 있기 때문에 문제가 발생하는 방법을 설명했습니다. 아직 문제를 해결하지는 못했지만 for 루프를 사용하여 작업하고있는 것과 관련이 있습니다. – pavlov

답변

1

질문의 접근 방식은 ticklabels을 결정적으로 설정하는 데 적합하지 않습니다. Ticklabels는 화면상의 위치가 아닌 표시 한 값에 따라 설정해야합니다.

ticklabels를 사용자 정의하려면 FuncFormatter이 도움이되는 경우가 많습니다. x 값을 틱으로 지정하면 원하는 틱 레이블을 반환하는 입력으로 함수를 사용할 수 있습니다.

def fmt(x,pos): 
    if x in range(len(dates_ls)): 
     return dates_ls[int(x)] 
    else: 
     return "" 

# then later 
ax.xaxis.set_major_formatter(FuncFormatter(fmt))  
plt.setp(ax.get_xticklabels(), fontsize=8, rotation=45, ha='right') 

전체 예제 : 이것의 목적은 축에 날짜 시간을 표시하는 경우, 그것은 너무 복잡 것을

import matplotlib.pyplot as plt 
from matplotlib.ticker import FuncFormatter 

dates_ls = ['dates_' + str(x+1) for x in range(30)] 
metrics_ls = ['sessions', 'pageviews'] 
URL_names = ['URL_1', 'URL_2'] 
DataDict_final = dict() 
for name in URL_names: 
    DataDict_final[name] = {metric: [] for metric in metrics_ls} 
DataDict_final['URL_1']['sessions'] = range(30) # manually define for this example 
DataDict_final['URL_1']['pageviews'] = range(30) 
DataDict_final['URL_2']['sessions'] = range(30) 
DataDict_final['URL_2']['pageviews'] = range(30) 

def fmt(x,pos): 
    if x in range(len(dates_ls)): 
     return dates_ls[int(x)] 
    else: 
     return "" 

for cur_page in URL_names: 

    # plot 
    fig, ax = plt.subplots() 
    for i, cur_metric in enumerate(metrics_ls): 
     data2plot = DataDict_final[cur_page] [cur_metric]  
     ax.plot(data2plot, label=cur_metric) 
    # x and y axis limits and labels 
    ax.set_xlim(0, len(DataDict_final[cur_page] [cur_metric])-1) 
    ax.xaxis.set_major_formatter(FuncFormatter(fmt))  
    plt.setp(ax.get_xticklabels(), fontsize=8, rotation=45, ha='right') 

plt.show() 

enter image description here

참고. 대신 datetime 객체를 사용하여 데이터를 직접 플롯하십시오. Datetime example