1. ホーム
  2. python

[解決済み] ヒストグラムをY軸をパーセントでプロットする(FuncFormatterを使用?)

2022-02-17 02:42:54

質問

1000から20000までの数字のデータのリストがあります。

data = [1000, 1000, 5000, 3000, 4000, 16000, 2000]

を使ってヒストグラムをプロットすると hist() 関数では、Y軸は1ビン内の値の出現回数を表します。出現回数の代わりに、出現率を表示したいのですが。

上のプロットのコード。

f, ax = plt.subplots(1, 1, figsize=(10,5))
ax.hist(data, bins = len(list(set(data))))

私は、この ポスト を使用した例を説明しています。 FuncFormatter しかし、私の問題にどのように適応させればよいのかがわかりません。何かお手伝いやご指導をいただければ幸いです :)

EDITです。 の主な問題点は to_percent(y, position) 関数が使用する FuncFormatter . yはy軸の与えられた1つの値に対応すると思います。この値を要素の総数で割る必要があるのですが、どうやらこの関数に渡すことはできないようです...。

EDIT 2: 現在のソリューションは、グローバル変数が使用されているため、私は嫌いです。

def to_percent(y, position):
    # Ignore the passed in position. This has the effect of scaling the default
    # tick locations.
    global n

    s = str(round(100 * y / n, 3))
    print (y)

    # The percent symbol needs escaping in latex
    if matplotlib.rcParams['text.usetex'] is True:
        return s + r'$\%$'
    else:
        return s + '%'

def plotting_hist(folder, output):
    global n

    data = list()
    # Do stuff to create data from folder

    n = len(data)
    f, ax = plt.subplots(1, 1, figsize=(10,5))
    ax.hist(data, bins = len(list(set(data))), rwidth = 1)

    formatter = FuncFormatter(to_percent)
    plt.gca().yaxis.set_major_formatter(formatter)

    plt.savefig("{}.png".format(output), dpi=500)

EDIT 3: を使った方法 density = True

実際に望む出力(グローバル変数によるメソッド)。

解決方法は?

他の答えは、まったく複雑なようです。絶対量ではなく比率を示すヒストグラムは、データを 1/n ここで n はデータポイントの数である。

次に PercentFormatter は、比率を示すために使用することができます(例. 0.45 ) をパーセンテージで表示します ( 45% ).

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

data = [1000, 1000, 5000, 3000, 4000, 16000, 2000]

plt.hist(data, weights=np.ones(len(data)) / len(data))

plt.gca().yaxis.set_major_formatter(PercentFormatter(1))
plt.show()

ここでは、7つの値のうち3つが最初のビンにあること、つまり3/7=43%であることがわかります。