2016-06-23 189 views
0

我想在matplotlib中針對日期範圍繪製一系列值。我將勾選base參數更改爲7,以在每週開始時得到一個勾號(plticker.IndexLocator, base = 7)。問題是set_xticklabels函數不接受base參數。因此,第二個記號(代表第2周開始的第8天)在我的日期範圍列表中標記爲第2天,而不是第8天(如圖所示)。Matplotlib:如何爲座標軸和座標軸刻度標籤獲取相同的「基準」和「偏移量」參數

如何給set_xticklabels a base參數?

下面是代碼:

my_data = pd.read_csv("%r_filename_%s_%s_%d_%d.csv" % (num1, num2, num3, num4, num5), dayfirst=True) 
my_data.plot(ax=ax1, color='r', lw=2.) 
loc = plticker.IndexLocator(base=7, offset = 0) # this locator puts ticks at regular intervals 
ax1.set_xticklabels(my_data.Date, rotation=45, rotation_mode='anchor', ha='right') # this defines the tick labels 
ax1.xaxis.set_major_locator(loc) 

這裏的情節:

Plot

回答

0

您ticklabels壞了的原因是setting manual ticklabels decouples the labels from your data。正確的做法是根據您的需要使用Formatter。由於您有每個數據點的標籤列表,因此您可以使用IndexFormatter。這似乎是在網上無證,但它有一個幫助:

class IndexFormatter(Formatter) 
| format the position x to the nearest i-th label where i=int(x+0.5) 
| ... 
| __init__(self, labels) 
| ... 

所以,你只需要您的日期列表傳遞給IndexFormatter。具有最小,大熊貓無關的例子(與numpy的僅用於生成虛擬數據):

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


# create dummy data  
x = ['str{}'.format(k) for k in range(20)] 
y = np.random.rand(len(x)) 

# create an IndexFormatter with labels x 
x_fmt = mpl.ticker.IndexFormatter(x) 

fig,ax = plt.subplots() 
ax.plot(y) 
# set our IndexFormatter to be responsible for major ticks 
ax.xaxis.set_major_formatter(x_fmt) 

這應該讓您的數據和對標籤,即使勾選持倉變化:

result

我注意到你也可以在set_xticklabels的調用中設置標籤標籤的旋轉角度,你現在就會失去這個。我建議使用fig.autofmt_xdate來代替它,它似乎是專門爲此目的而設計的,而不會混淆您的ticklabel數據。

0

非常感謝 - 您的解決方案完美的作品。對於其他人在將來遇到同樣問題的情況:我已經實現了上述解決方案,但還添加了一些代碼,以便滴答標籤保持所需的旋轉狀態並且還將(與它們的左端)對齊到相應的滴答。可能不是pythonic,可能不是最佳實踐,但它的工作原理

x_fmt = mpl.ticker.IndexFormatter(x) 
ax.set_xticklabels(my_data.Date, rotation=-45) 
ax.tick_params(axis='x', pad=10) 
ax.xaxis.set_major_formatter(x_fmt) 
labels = my_data.Date 
for tick in ax.xaxis.get_majorticklabels(): 
    tick.set_horizontalalignment("left") 
相關問題