2

这是我第一次在网上问 Python 问题。我一直都能在这个网站上找到我的问题的答案……直到现在。我正在尝试绘制使用 Index Sequential Method 开发的数据,这是一种将历史数据投影到未来的技术。我有 105 个图表,每个图表涵盖 47 年的数据。第一个图表 x 轴的范围是 1906-1952,第二个是 1907-1953,第三个是 1908-1954,等等。我的问题是当我到 1963 年时,也就是第 47 年回到开始的时候(1906 年)。所以 1963 年的图表 xaxis 看起来像这样:1963, 1964, 1965,...2008,2009,2010,1906。1964 年图表 xaxis 如下所示:1964、1965、1967、...2009、2010、1906、1907。

我可以让数据绘制得很好,我只需要帮助弄清楚如何格式化 xaxis 以在它发生时接受独特的环绕情况。

每页有三个图表(ax1、ax2 和 ax3)。yearList 和 chartList 分别是 x 和 y 数据。下面的代码是创建 yearList 和 chartList 数据集的 for 循环的一部分,它使用错误的 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)
4

2 回答 2

3

您正在制作一个条形图,这意味着除了标签之外,x 位置几乎没有任何意义,所以不要尝试绘制条形与日期的关系,将它们与整数绘制,然后根据需要标记它们:

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)

另请参阅演示和文档set_xticksset_xticklabels

于 2013-09-19T00:54:09.293 回答
2

您可以使用 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])
于 2013-09-18T23:54:28.540 回答