2013-09-24 375 views
5

我获得了几个月的数据,但在几个月之间失踪。如果我将整个数据集绘制在一个绘图(大量空白空间)中,这看起来很奇怪。 我写了小示例脚本来展示它是如何工作的(基于:Python/Matplotlib - Is there a way to make a discontinuous axis?不连续时间序列在x轴上的日期绘制

问题:我无法使x轴使用相同的日期格式!斧头或ax2是正确的,但从来都没有。 你有什么想法吗?

import numpy as np 
import matplotlib as mpl 
import matplotlib.pyplot as plt 
import datetime 

def getDates(startdate, enddate): 
    days = (enddate + datetime.timedelta(days=1) - startdate).days 
    dates = [ startdate + datetime.timedelta(days=x) for x in range(0,days) ] 
    return dates 

dates1 = getDates(datetime.datetime(2013,1,1), datetime.datetime(2013,1,31)) 
dates2 = getDates(datetime.datetime(2013,3,1), datetime.datetime(2013,3,31)) 
dates = dates1+dates2 
data = np.arange(len(dates)) 

Locator = mpl.dates.DayLocator(interval=5) 
Formatter = mpl.dates.DateFormatter('%d-%m-%y') 

fig,(ax,ax2) = plt.subplots(1,2,sharey=True) 
fig.subplots_adjust(wspace=0.05) 
fig.set_size_inches(10,3) 
ax.plot(dates, data) 
ax2.plot(dates, data) 
ax.legend(loc=1) 
ax.set_ylim(0, 61) 
ax.set_xlim(datetime.datetime(2013,1,1), datetime.datetime(2013,1,31)) 
ax2.set_xlim(datetime.datetime(2013,3,1), datetime.datetime(2013,3,31)) 
labels = ax.get_xticklabels() 
for label in labels: label.set_rotation(30) 
labels = ax2.get_xticklabels() 
for label in labels: label.set_rotation(30) 
ax.spines['right'].set_visible(False) 
ax2.spines['left'].set_visible(False) 
ax.tick_params(right='off') 
ax2.tick_params(left='off') 
ax2.yaxis.tick_right() 
ax.xaxis.set_major_locator(Locator) 
ax.xaxis.set_major_formatter(Formatter) 
ax2.xaxis.set_major_locator(Locator) 
ax2.xaxis.set_major_formatter(Formatter) 
plt.savefig("test.png", bbox_inches='tight') 

结果: Result

+3

请不要崩溃'for'循环到一条线,这是不好的风格,可以迷惑你的读者(像我) – tacaswell

回答

5

你找到关于matplotlib的内部一个有趣的细节。您传递给set_major_locator的定位器对象是轴所使用的对象找出在哪里放置它的刻度。两个axes都使用相同的定位器对象。作为绘图的一部分,定位器生成一个列表,显示蜱应该基于轴的界限,当第二个轴完成后,第一个轴上没有蜱。你只需要传递不同的(单独实例化)定位器对象,在这里完成copy

import datetime 
import copy 

def getDates(startdate, enddate): 
    days = (enddate + datetime.timedelta(days=1) - startdate).days 
    dates = [ startdate + datetime.timedelta(days=x) for x in range(0, days) ] 
    return dates 

dates1 = getDates(datetime.datetime(2013, 1, 1), datetime.datetime(2013, 1, 31)) 
dates2 = getDates(datetime.datetime(2013, 3, 1), datetime.datetime(2013, 3, 31)) 
dates = dates1+dates2 
data = np.arange(len(dates)) 

Locator = mpl.dates.DayLocator(interval=5) 
Formatter = mpl.dates.DateFormatter('%d-%m-%y') 

fig, (ax, ax2) = plt.subplots(1, 2, sharey=True, tight_layout=True) 
fig.subplots_adjust(wspace=0.05) 
fig.set_size_inches(10, 3, forward=True) 

ax.plot(dates, data) 
ax2.plot(dates, data) 

ax.legend(loc=1) 
ax.set_ylim(0, 61) 
ax.set_xlim(datetime.datetime(2013, 1, 1), datetime.datetime(2013, 1, 31)) 
ax2.set_xlim(datetime.datetime(2013, 3, 1), datetime.datetime(2013, 3, 31)) 

labels = ax.get_xticklabels() 
for label in labels: 
    label.set_rotation(30) 
labels = ax2.get_xticklabels() 
for label in labels: 
    label.set_rotation(30) 

ax.spines['right'].set_visible(False) 
ax2.spines['left'].set_visible(False) 
ax.tick_params(right='off') 
ax2.tick_params(left='off') 
ax2.yaxis.tick_right() 


# note the copy here 
ax.xaxis.set_major_locator(copy.copy(Locator)) 
ax.xaxis.set_major_formatter(copy.copy(Formatter)) 
ax2.xaxis.set_major_locator(copy.copy(Locator)) 
ax2.xaxis.set_major_formatter(copy.copy(Formatter)) 

enter image description here

+0

作品,谢谢! – HyperCube

相关问题