34

私は2つのデータ配列を持つpythonを使用してプロジェクトを行っています。それらをpcおよびpncと呼びましょう。これらの両方の累積分布を同じグラフにプロットする必要があります。pcの場合、(x,y) では、 pcの y 点はx 未満の値を持つ必要があります。pncの場合、(x,y) では、 pncの y 点はx よりも大きい値を持つ必要があります

ヒストグラム関数を使ってみました - pyplot.hist. 私がやりたいことを行うためのより良い簡単な方法はありますか? また、x 軸の対数スケールでプロットする必要があります。

4

5 に答える 5

42

あなたは近かった。plt.hist を numpy.histogram として使用しないでください。これにより、値とビンの両方が得られます。累積を簡単にプロットできます。

import numpy as np
import matplotlib.pyplot as plt

# some fake data
data = np.random.randn(1000)
# evaluate the histogram
values, base = np.histogram(data, bins=40)
#evaluate the cumulative
cumulative = np.cumsum(values)
# plot the cumulative function
plt.plot(base[:-1], cumulative, c='blue')
#plot the survival function
plt.plot(base[:-1], len(data)-cumulative, c='green')

plt.show()

ここに画像の説明を入力

于 2013-03-14T20:02:08.310 に答える
29

ヒストグラムを使用すると、実際には不必要に重く、不正確になります (ビニングによってデータが曖昧になります)。すべての x 値を並べ替えることができます。各値のインデックスは、より小さい値の数です。この短くて単純なソリューションは次のようになります。

import numpy as np
import matplotlib.pyplot as plt

# Some fake data:
data = np.random.randn(1000)

sorted_data = np.sort(data)  # Or data.sort(), if data can be modified

# Cumulative counts:
plt.step(sorted_data, np.arange(sorted_data.size))  # From 0 to the number of data points-1
plt.step(sorted_data[::-1], np.arange(sorted_data.size))  # From the number of data points-1 to 0

plt.show()

さらに、データが離散的な場所にあるため、より適切なプロット スタイルは実際plt.step()には ではなく です。plt.plot()

結果は次のとおりです。

ここに画像の説明を入力

EnricoGiampieri の回答の出力よりも不規則であることがわかりますが、これは実際のヒストグラムです (おおよそのあいまいなバージョンではなく)。

PS : SebastianRaschka が指摘したように、最後のポイントは理想的には合計カウントを表示する必要があります (合計カウント-1 ではなく)。これは、次の方法で実現できます。

plt.step(np.concatenate([sorted_data, sorted_data[[-1]]]),
         np.arange(sorted_data.size+1))
plt.step(np.concatenate([sorted_data[::-1], sorted_data[[0]]]),
         np.arange(sorted_data.size+1))

非常に多くのポイントがありdata、ズームしないと効果が見えませんが、データに数ポイントしか含まれていない場合は、合計数の最後のポイントが重要になります。

于 2014-03-23T08:56:32.677 に答える