2013-09-18 2 views
2

Это мой первый вопрос, задающий вопрос Python онлайн. Я всегда мог найти ответы на свои вопросы на этом сайте ... до сих пор. Я пытаюсь построить данные, которые были разработаны с использованием метода последовательностей индексов, который является методом прогнозирования исторических данных в будущем. У меня есть 105 диаграмм, каждый из которых содержит 47 лет данных. Первая диаграмма x-axis варьируется от 1906-1952, второй 1907-1953, от 1908-1954 и т. Д. Моя проблема заключается в том, когда я добираюсь до 1963 года, когда 47-й год возвращается к началу (1906). Таким образом, график xaxis 1963 года будет выглядеть так: 1963, 1964, 1965, ... 2008,2009,2010,1906. Диаграмма xaxis 1964 года будет выглядеть так: 1964, 1965, 1967, ... 2009, 2010, 1906, 1907.Пользовательский X-Axis Диапазон дат Использование Matplotlib

Я могу получить данные для построения штрафа, мне просто нужно выяснить, как отформатировать xaxis чтобы принять уникальную обертку, когда это происходит.

Есть три диаграммы на странице (ax1, ax2 и ax3). yearList и chartList - это данные x и y, соответственно. Код ниже является частью цикла for, который создает наборы данных yearList и chartList и создает диаграммы с неправильными ярлыками xaxis.

import matplotlib, pyPdf 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 
import matplotlib.ticker as tkr 
from matplotlib.ticker import MultipleLocator 
import matplotlib.figure as figure 

plt.rcParams['font.family'] = 'Times New Roman' 
locator = mdates.YearLocator(2) 
minorLocator = MultipleLocator(1) 
dateFmt = mdates.DateFormatter('%Y') 
datemin = min(yearList) 
datemax = max(yearList) 

fig, (ax1, ax2, ax3) = plt.subplots(3,1,sharex=False) 
#3X3 Top to bottom 
ax1.bar(yearList1, chartList1, width=200, align='center') 
ax2.bar(yearList2, chartList2, width=200, align='center') 
ax3.bar(yearList3, chartList3, width=200, align='center') 

axList = [ax1, ax2, ax3] 

for ax in axList: 
    ax.xaxis.set_major_locator(locator) 
    ax.xaxis.set_major_formatter(dateFmt) 
    ax.xaxis.set_minor_locator(minorLocator) 
    ax.set_xlim(datemin - timedelta(365), datemax + timedelta(365)) 
    ax.grid(1) 
    ax.set_ylim(0,30) 
    ax.set_yticks(np.arange(0, 31, 5)) 
    ax.yaxis.set_minor_locator(minorLocator) 
    #Rotate tick labels 90 degrees 
    xlabels = ax.get_xticklabels() 
     for label in xlabels: 
      label.set_rotation(90) 
     fig.tight_layout() 

plt.subplots_adjust(right=0.925) 
plt.savefig('%s\\run.pdf' % outDir) 
+0

Что это эти данные, которые вы хотите обернуть так? – tacaswell

ответ

2

Вы делаете гистограмму, что означает, что х-posistion практически не имеет никакого значения в сторону от этикетки, так что не пытайтесь построить бруски против их дата, сюжет их против целых чисел, а затем маркировать их, как вы хотите:

from itertools import izip 

fig, axeses = plt.subplots(3,1,sharex=False) 
#3X3 Top to bottom 

for yl, cl, ax in izip([yearList1, yearList2, yearList3], 
         [chartList1, chartList2, chartist3], 
         axeses): 
    ax.bar(range(len(cl)), cl, align='center') 
    ax.set_ylim(0,30) 
    ax.set_yticks(np.arange(0, 31, 5)) 
    ax.yaxis.set_minor_locator(minorLocator) 

    xlabels = [dateFmt(xl) for xl in yl] # make a list of formatted labels 
    ax.set_xticks(range(len(cl))) # put the tick markers under your bars 
    ax.set_xticklabels(xlabels) # set the labels to be your formatted years 
    #Rotate tick labels 90 degrees 
    for label in ax.get_xticklabels(): 
     label.set_rotation(90) 

# you only need to do this once 
fig.tight_layout() 

fig.subplots_adjust(right=0.925) 
fig.savefig('%s\\run.pdf' % outDir) 

см также demo и документы set_xticks и set_xticklabels

+0

Спасибо! Это отлично поработало. – user2793356

1

Вы можете использовать функцию ax.set_ticklabels() для установки меток.

Пример:

fig = plt.figure() 
ax = fig.add_subplot(1,1,1) 
ax.plot([1, 2, 3, 4], [10, 20, 25, 30]) 
ax.xaxis.set_ticklabels(["foo" , "bar", "ouch"]) 
plt.show() 

set_ticklabels

Таким образом, просто добавьте преобразование, что вам нужно, и создать список этикеток.

может быть что-то вроде этого:

range = 47 
yearList = [1967, 1968,..., last year] 
range_of_years = map(lambda x: range(year,year + range), yearList) 
for i in range(len(axis_list)): 
    axis_list[i].xaxis.set_ticklabels(years_list[i]) 
Смежные вопросы