既にビニングされたデータでヒストグラムを取得しようとしています。私はこれを使用しようとしていますが、塗りつぶされたヒストグラムではなく、例からこのようなbar()
階段状のヒストグラムを作成する方法がわかりません。
4 に答える
データをオフセットしてplot
代わりに使用することで、不正行為を行うことができます。
from matplotlib import pyplot
import numpy as np
#sample data:
x = np.arange(30)
y = np.cumsum(np.arange(30))
#offset the x for horizontal, repeat the y for vertical:
x = np.ravel(zip(x,x+1))
y = np.ravel(zip(y,y))
pyplot.plot(x,y)
pyplot.savefig('plt.png')
プロット:
最も簡単な解決策は、ビン化されたデータセットをビン化されていない加重データセット (要素数 == ビン数) に変換することです。ビン化されていないデータセットは、ビンの中心に等しいデータ値と、各ビンの値に等しい重みで構成されます。たとえば、ビン化されたデータが、
binedges = [0.0, 1.0, 2.0, 3.0]
ybinned = [11., 22., 33.]
対応する加重データセットは、
y = [0.5, 1.5, 2.5]
weights = [11., 22., 33.]
ビンの中心を使用する選択は任意であることに注意してください。ビン内の任意のポイントを使用できます。ビニングされていないデータセットを生成したら、通常の matplotlib ヒストグラム プロット (Axes.hist) を使用できます。
Python での実装例は次のとおりです。
def plot_binned_data(axes, binedges, data,
*args, **kwargs):
#The dataset values are the bin centres
x = (binedges[1:] + binedges[:-1]) / 2.0
#The weights are the y-values of the input binned data
weights = data
return axes.hist(x, bins=binedges, weights=weights,
*args, **kwargs)
histtype="step"
必要なステップ ヒストグラムの作成を含め、すべての Axes.Histogram プロット オプションに完全にアクセスできるようになりました。
この関数を使用した例は、次のようになります。
import numpy
import matplotlib.pyplot as plt
#Create a dataset
dataset = numpy.random.normal(size=100)
#Bin the dataset
binedges = numpy.linspace(-5.0, 5.0, num=10)
y, binedges = numpy.histogram(dataset, binedges)
#Plot the dataset
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
plot_binned_data(ax, binedges, y, histtype="step")
plt.show()
それが役立つことを願っています!
何らかの理由で、試してみると最後のビンが適切に閉じられません。最後の行が表示されている場合、以前の回答からは見えないため、私が望むことを行う独自の関数を作成することにしました。
def make_bar_contour_plot(ax,x_input,y_input):
x = list(np.ravel(zip(x_input[:-1],x_input[:-1]+1)))[1:]
x += [x[-1]+20] + [300]
y = list(np.ravel(zip(y_input,y_input))) +[0]
ax.plot(x,y,ls='steps')
return ax
追加される20
と300
はそれぞれ私のビンサイズと終了値であり、誰かがこれを使用したい場合は調整する必要があります。x_input
とy_input
は からの戻り値ですnp.histogram
。私の結果のプロット(青で、上記の関数でプロットされた等高線。赤で、同じデータの棒グラフ):
付属のソースhttp://matplotlib.sourceforge.net/examples/pylab_examples/histogram_demo_extended.htmlから
これが彼らがそのグラフをどのように描いたかです:
[をちょきちょきと切る]
そして、あなたが望むビットは
pylab.hist(x, bins=bins, histtype='step')
^
right here
編集: hist() がどのように機能するかを知りたい場合は、ソースを見てください。これは、matplotlib/axes.py の 7407 行目から定義されています。
7724行目を見ると、
x = np.zeros( 2*len(bins), np.float )
y = np.zeros( 2*len(bins), np.float )
N バーの場合、bins は N+1 値の numpy.ndarray であり、各バーのエッジです。各バーの値を対にし (これは、fraxel が下の np.ravel で行っていることです)、データポイントをバーの半分左にシフトして中央に配置します。
x[0::2], x[1::2] = bins, bins
x -= 0.5*(bins[1]-bins[0])
各バーの高さを設定します。対になっていますが、(x 値に対して) 1 つオフセットして、ステップ効果を生成します。
# n is an array of arrays containing the number of items per bar
patches = [] # from line 7676
for m, c in zip(n, color):
y[1:-1:2], y[2::2] = m, m
patches.append(self.fill(x, y, closed=False, edgecolor=c, fill=False))
self.fill
ビットは実際に線を引くものです。