2016-06-23 21 views
0

matplotlibの日付範囲に対して一連の値をプロットしたいとします。私はbaseの目盛りを7に変更し、毎週の始めに1チック(plticker.IndexLocator, base = 7)を得ました。問題は、set_xticklabels関数がbaseパラメータを受け入れないことです。その結果、2番目のティック(2週目の始めの8日目を表す)は、私の日付範囲リストから2日目にラベル付けされ、8日目では表示されません(画像参照)。Matplotlib:軸の目盛と軸目盛のラベルと同じ "基本"と "オフセット"パラメータを取得する方法

与える方法set_xticklabelsbaseのパラメータはありますか?ここで

はコードです:ここでは

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に日付のリストを渡す必要があります。

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

私が気づい(numpyの持つ唯一のダミーデータを生成するため)、最小、パンダ、独立した例ではあなたはまた、set_xticklabelsへの呼び出しでティックラベルのローテーションを設定すると、これは今失うでしょう。代わりにfig.autofmt_xdateを使用することをお勧めします。これは、この目的のために正確に設計されているように見えます。

0

感謝 - あなたのソリューションは完璧に動作します。他の人が将来的に同じ問題に遭遇した場合のために:私は、上記溶液を導入だけでなく、目盛ラベルがそれぞれのチックに(その左端で)所望の回転を維持し、また、整列するようにいくつかのコードを追加しました。 、ニシキヘビではないかもしれないベストプラクティスではないかもしれないが、それは

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") 
の作品
関連する問題