2014-11-03 203 views
2

我是matplotlib和pyplot的新手,嘗試繪製大型數據集。下面是一個小片段。Python和Matplotlib:減少x刻度標記的數量並刪除零填充

情節起作用,但xtick標記擁擠。

如何減少刻度數?

使用plt.locator_params(nbins=4)返回了一個錯誤:

AttributeError: 'FixedLocator' object has no attribute 'set_params' 

,是有辦法從pyplot內的日期標籤移除0填充?

import matplotlib.pyplot as plt 


x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30] 
xticks = ['01/01', '01/02', '01/03', '01/04', '01/05', '01/06', '01/07', '01/08', '01/09', '01/10', '01/11', '01/12', '01/13', '01/14', '01/15', '01/16', '01/17', '01/18', '01/19', '01/20', '01/21', '01/22', '01/23', '01/24', '01/25', '01/26', '01/27', '01/28', '01/29', '01/30'] 
y = [80, 80, 60, 30, 90, 50, 200, 300, 200, 150, 10, 80, 20, 30, 40, 150, 160, 170, 180, 190, 20, 210, 220, 20, 20, 20, 200, 270, 280, 90, 00] 
y2 = [100, 100, 200, 300, 40, 50, 60, 70, 80, 90, 100, 110, 12, 13, 10, 110, 16, 170, 80, 90, 20, 89, 28, 20, 20, 28, 60, 70, 80, 90, 30] 


plt.plot(x, y) 
plt.plot(x, y2) 
plt.xticks(x, xticks, rotation=90) 
plt.show() 

enter image description here

回答

2

由於matplotlib有一些非常好的工具的日期我覺得很有道理你的日期字符串轉換爲datetime.datetime對象。

然後你可以使用一個方便的日期定位器;在這種情況下DayLocator是最有意義的。爲了避免使用interval kwarg的一些標籤。

然後,從您的xticklabels中刪除前導零,您需要一個自定義格式功能。

import datetime as dt 

import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 
import matplotlib.ticker as tkr 

def xfmt(x,pos=None): 
    ''' custom date formatting ''' 
    x = mdates.num2date(x) 
    label = x.strftime('%m/%d') 
    label = label.lstrip('0') 
    return label 

x = ['01/01', '01/02', '01/03', '01/04', '01/05', '01/06', '01/07', '01/08', '01/09', '01/10', '01/11', '01/12', '01/13', '01/14', '01/15', '01/16', '01/17', '01/18', '01/19', '01/20', '01/21', '01/22', '01/23', '01/24', '01/25', '01/26', '01/27', '01/28', '01/29', '01/30', '01/31'] 
xdates = [dt.datetime.strptime(i,'%m/%d') for i in x] 
y = [80, 80, 60, 30, 90, 50, 200, 300, 200, 150, 10, 80, 20, 30, 40, 150, 160, 170, 180, 190, 20, 210, 220, 20, 20, 20, 200, 270, 280, 90, 00] 
y2 = [100, 100, 200, 300, 40, 50, 60, 70, 80, 90, 100, 110, 12, 13, 10, 110, 16, 170, 80, 90, 20, 89, 28, 20, 20, 28, 60, 70, 80, 90, 30] 

plt.plot(xdates,y) 
plt.plot(xdates,y2) 
plt.setp(plt.gca().xaxis.get_majorticklabels(),rotation=90) 
plt.gca().xaxis.set_major_formatter(tkr.FuncFormatter(xfmt)) 
plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval=4)) 
plt.gca().xaxis.set_minor_locator(mdates.DayLocator()) 
plt.show() 

上面的代碼產生以下情節:

_sompl.png