17

既にビニングされたデータでヒストグラムを取得しようとしています。私はこれを使用しようとしていますが、塗りつぶされたヒストグラムではなく、例からこのようなbar()階段状のヒストグラムを作成する方法がわかりません。

ここに画像の説明を入力

4

4 に答える 4

8

データをオフセットして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')

プロット:

ここに画像の説明を入力してください

于 2012-07-02T16:26:54.773 に答える
3

最も簡単な解決策は、ビン化されたデータセットをビン化されていない加重データセット (要素数 == ビン数) に変換することです。ビン化されていないデータセットは、ビンの中心に等しいデータ値と、各ビンの値に等しい重みで構成されます。たとえば、ビン化されたデータが、

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()

それが役立つことを願っています!

于 2013-10-14T13:10:28.633 に答える
0

何らかの理由で、試してみると最後のビンが適切に閉じられません。最後の行が表示されている場合、以前の回答からは見えないため、私が望むことを行う独自の関数を作成することにしました。

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

追加される20300はそれぞれ私のビンサイズと終了値であり、誰かがこれを使用したい場合は調整する必要があります。x_inputy_inputは からの戻り値ですnp.histogram。私の結果のプロット(青で、上記の関数でプロットされた等高線。赤で、同じデータの棒グラフ):

ヒストグラムの等高線図の結果

于 2015-02-12T15:23:46.653 に答える
0

付属のソース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ビットは実際に線を引くものです。

于 2012-07-02T16:16:22.277 に答える