2017-03-16 9 views
4

私はちょうどmatplotlib 2.0にアップグレードしました。私は狂気のような気分です。私は、リニアスケールでy軸とlog10スケールでx軸を持つ対数線形プロットを作成しようとしています。以前は、次のコードは、私は私のダニをしたい場所を正確に私が指定することが許されているだろう、と私は彼らのラベルがあることを望むもの:Matplotlib:x-limitsを設定すると、目盛りのラベルも表示されますか?

import matplotlib.pyplot as plt 

plt.plot([0.0,5.0], [1.0, 1.0], '--', color='k', zorder=1, lw=2) 

plt.xlim(0.4,2.0) 
plt.ylim(0.0,2.0) 

plt.xscale('log') 

plt.tick_params(axis='x',which='minor',bottom='off',top='off') 

xticks = [0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0] 
ticklabels = ['0.4', '0.6', '0.8', '1.0', '1.2', '1.4', '1.6', '1.8', '2.0'] 
plt.xticks(xticks, ticklabels) 

plt.show() 

しかし、matplotlibの2.0で、これは今の重複ダニのセットを得るために私を引き起こし

enter image description here

しかし、私は「plt.xlim(0.4,2.0)」の行をコメントアウトし、それが自動的に軸の範囲を決定させる場合は、重複がない:matplotlibのは明らかにダニを自動作成したいラベル私は欲しいものを手に入れます:

enter image description here

しかし、私は今x軸の制限が無用だから動作しません。

アイデア?

編集:将来的にインターネットを検索しているユーザーにとって、これは実際にはmatplotlib自体のバグであると確信しています。私はv.1.5.3に戻りました。この問題を回避するだけです。

答えて

3

重複する追加のティックラベルは、プロット内に存在するマイナーティックラベルから発生します。

plt.gca().xaxis.set_minor_formatter(matplotlib.ticker.NullFormatter()) 

が質問から完全なコードは、その後かもしれ

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

x = np.linspace(0,2.5) 
y = np.sin(x*6) 
plt.plot(x,y, '--', color='k', zorder=1, lw=2) 

plt.xlim(0.4,2.0) 

plt.xscale('log') 

xticks = [0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0] 
ticklabels = ['0.4', '0.6', '0.8', '1.0', '1.2', '1.4', '1.6', '1.8', '2.0'] 
plt.xticks(xticks, ticklabels) 

plt.gca().xaxis.set_minor_formatter(matplotlib.ticker.NullFormatter()) 

plt.show() 

enter image description here

コードのようになります。それらを取り除くためには、一つはNullFormatterにマイナーフォーマッタを設定することができます文字列としてxticklabelsを設定していないので、より直感的です。FixedLocatorScalarFormatterを使用すると次のようになります。
このコードは、上記と同じプロットを生成します。

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

x = np.linspace(0,2.5) 
y = np.sin(x*6) 
plt.plot(x,y, '--', color='k', zorder=1, lw=2) 

plt.xlim(0.4,2.0) 
plt.xscale('log') 

xticks = [0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0] 

xmajorLocator = matplotlib.ticker.FixedLocator(locs=xticks) 
xmajorFormatter = matplotlib.ticker.ScalarFormatter() 
plt.gca().xaxis.set_major_locator(xmajorLocator) 
plt.gca().xaxis.set_major_formatter(xmajorFormatter) 
plt.gca().xaxis.set_minor_formatter(matplotlib.ticker.NullFormatter()) 

plt.show() 
関連する問題