2011-11-04 27 views
10

我在使用x軸上的日期使用多個小圖時遇到了問題。在x軸上有日期的小區圖

我使用的是here的matplotlib示例。我已經修改它以包含另一個子圖(被繪製的數據是相同的)。這是我得到的輸出:

enter image description here

蜱只出現在第二次要情節。爲什麼?我怎樣才能讓它們出現在兩個子圖上?

這是我修改過的源代碼。我添加了代碼,在源代碼的中途在if區塊中包含新的子區塊。

#!/usr/bin/env python 
""" 
Show how to make date plots in matplotlib using date tick locators and 
formatters. See major_minor_demo1.py for more information on 
controlling major and minor ticks 

All matplotlib date plotting is done by converting date instances into 
days since the 0001-01-01 UTC. The conversion, tick locating and 
formatting is done behind the scenes so this is most transparent to 
you. The dates module provides several converter functions date2num 
and num2date 

""" 
import datetime 
import numpy as np 
import matplotlib 
import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 
import matplotlib.mlab as mlab 
import matplotlib.cbook as cbook 

years = mdates.YearLocator() # every year 
months = mdates.MonthLocator() # every month 
yearsFmt = mdates.DateFormatter('%Y') 

# load a numpy record array from yahoo csv data with fields date, 
# open, close, volume, adj_close from the mpl-data/example directory. 
# The record array stores python datetime.date as an object array in 
# the date column 
#datafile = cbook.get_sample_data('goog.npy') 
datafile = 'goog.npy' 
r = np.load(datafile).view(np.recarray) 

fig = plt.figure() 
ax = fig.add_subplot(211) 
ax.plot(r.date, r.adj_close) 


# format the ticks 
ax.xaxis.set_major_locator(years) 
ax.xaxis.set_major_formatter(yearsFmt) 
ax.xaxis.set_minor_locator(months) 

datemin = datetime.date(r.date.min().year, 1, 1) 
datemax = datetime.date(r.date.max().year+1, 1, 1) 
ax.set_xlim(datemin, datemax) 

# format the coords message box 
def price(x): return '$%1.2f'%x 
ax.format_xdata = mdates.DateFormatter('%Y-%m-%d') 
ax.format_ydata = price 
ax.grid(True) 

second = True 
if second: 
    years = mdates.YearLocator() # every year 
    months = mdates.MonthLocator() # every month 
    yearsFmt = mdates.DateFormatter('%Y') 

    ax = fig.add_subplot(212) 
    ax.plot(r.date, r.adj_close) 

    # format the ticks 
    ax.xaxis.set_major_locator(years) 
    ax.xaxis.set_major_formatter(yearsFmt) 
    ax.xaxis.set_minor_locator(months) 

    datemin = datetime.date(r.date.min().year, 1, 1) 
    datemax = datetime.date(r.date.max().year+1, 1, 1) 
    ax.set_xlim(datemin, datemax) 

    # format the coords message box 
    ax.format_xdata = mdates.DateFormatter('%Y-%m-%d') 
    ax.format_ydata = price 
    ax.grid(True) 

# rotates and right aligns the x labels, and moves the bottom of the 
# axes up to make room for them 
fig.autofmt_xdate() 

plt.show() 

回答

11

我發現了罪魁禍首。這是autofmt_xdate函數:

日期ticklabels經常重疊,所以它是旋轉它們並將它們對齊它們很有用。此外,一個常見用例是一些共享xax的子圖,其中x軸是日期數據。蜱標通常很長,它有助於將它們旋轉到底部的子圖上,並在其他子圖上關閉它們,並關閉xlabels。

這是一個「功能」。您可以通過每個插曲後,插入碼達到同樣的效果:

plt.xticks(rotation=30) 
+0

附加說明:如果您使用單獨的數字爲每一個情節,這就需要你叫'plt.figure()'再次之前完成。 – thegrinner