2017-05-19 8 views
2

ヒストグラムをプロットするためにデータを既にビンしています。このため私はplt.bar()機能を使用しています。私はプロットの両方の軸を対数スケールに設定したいと思います。両方の軸を棒グラフに設定するmatploblib

plt.bar(x, y, width=10, color='b', log=True)を設定するとy軸にログを設定できますが、x軸の対数は設定できません。 残念ながら、plt.xscale('log')を試しましたが、これは正しく動作しません。 x軸のティックは消え、バーのサイズは等幅ではありません。

enter image description here

私は任意の助けいただければ幸いです。

答えて

1

デフォルトでは、barプロットのバーの幅は0.8です。したがって、それらは対数スケールでより小さいx値に対してより大きく現れる。一定の幅を指定する代わりに、ビンの辺の間の距離を使用し、これをwidth引数に指定すると、バーは正しい幅になります。これを行うにはalign"edge"に設定する必要があります。

import matplotlib.pyplot as plt 
import numpy as np; np.random.seed(1) 

x = np.logspace(0, 5, num=21) 
y = (np.sin(1.e-2*(x[:-1]-20))+3)**10 

fig, ax = plt.subplots() 
ax.bar(x[:-1], y, width=np.diff(x), log=True,ec="k", align="edge") 
ax.set_xscale("log") 
plt.show() 

enter image description here

私は、対数スケールのために不足しているticklabelsを再現することはできません。これは、質問に表示されていないコードの設定や古いmatplotlibバージョンが使用されていることが原因である可能性があります。ここの例は、matplotlib 2.0でうまく動作します。

0

目標は、データポイントが等間隔でないと仮定すると、等しい幅のバーを持っている場合は、最も適切な解決策は、プロットの定数c適切ため plt.bar(x, y, width=c*np.array(x), color='b', log=True)として幅を設定することです。アラインメントは何でもかまいません。

関連する問題