2011-11-04 12 views
10

X eksenindeki tarihlerle birden çok alt çizim kullanma konusunda sorun yaşıyorum.X ekseni üzerindeki tarihler içeren alt harfler

here'dan matplotlib örneğini kullanıyorum. Başka bir altpipi içerecek şekilde değiştirdim (çizilen veriler aynıdır). Bu benim çıkış olarak alıyorum budur:

enter image description here

kene sadece ikinci subplot görünür. Niye ya? Onları her iki alt uçta da nasıl gösterebilirim?

Değiştirilmiş kaynağım. Kaynağın yarısına doğru if bloğuna yeni bir altpip eklemek için kod ekledim.

#!/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() 

cevap

11

Sorunu buldum. Bu autofmt_xdate işlevidir:

Tarih Çizelgeleri genellikle üst üste biner, bu nedenle bunları döndürmek ve doğru hizalamak yararlıdır. Ayrıca, ortak bir kullanım durumu, x ekseninin tarih verisi olduğu paylaşılan xax'lara sahip birtakım alt piksellerdir. Çizgiler genellikle uzun, ve bunları alt altpipte döndürmeye ve diğer alt uçlara kapatmaya ve ayrıca xlabels'i kapatmaya yardımcı olur.

Bu "özellik" dir. Her subplot sonra bu kodu ekleyerek aynı etkiyi elde edebilirsiniz:

plt.xticks(rotation=30) 
+0

Ek not: Eğer her bir parsel için ayrı rakamlar kullanırsanız, bu 'plt.figure()' tekrar aramadan önce yapılması gerekmektedir. – thegrinner

İlgili konular