matplotlib에서 히스토그램의 왼쪽 세로축을 빈도, 오른쪽 세로축을 상대 빈도로 만듭니다.

이 기사에서 할 일



이 기사의 속편입니다 → "matplotlib에서 히스토그램의 종축을 상대 도수(기둥 높이의 합계=1)나 상대 도수 밀도(히스토그램 전체의 면적=1)로 한다"

matplotlib에서 히스토그램
  • 왼쪽 세로축을 빈도 (matplotlib의 기본값)
  • 오른쪽의 세로축을 상대 도수(기둥 높이의 합계=1)

  • 으로 그립니다. 다만, 사도적인 방법일지도 모릅니다.

    참고 페이지(감사합니다)



    [python] matplotlib에서 왼쪽과 오른쪽에 두 개의 축이있는 그래프를 작성하는 방법

    소스 코드 (Jupyter Notebook) 및 그리기 결과



    데이터 건수는 7500건으로, 평균치 50, 표준 편차 10의 정규 난수로 했습니다.
    먼저 다음 파이썬 코드를 실행해 보겠습니다.
    
    #%%
    
    import numpy as np
    import matplotlib.pyplot as plt
    
    
    #%%
    
    # データ作成
    μ = 50
    σ = 10
    data = [ np.random.normal(μ, σ) for i in range(7500) ]
    
    
    #%%
    
    # 階級数
    num_bins = 20
    
    # グラフ描画
    fig = plt.figure(figsize=(12, 8))
    plt.legend()
    plt.xlabel('x', fontsize=18)
    plt.title('null', fontsize=18)
    
    # (1) 縦軸を度数にしたヒストグラム
    ax1 = fig.add_subplot(111)
    ax1.set_ylabel('frequency', fontsize=18)
    ax1.grid(True, color="dimgray")
    ax1.set_axisbelow(True)    # gridを最背面に移動
    ax1.hist(data, bins=num_bins, rwidth=0.5, align="mid")
    
    # (2) 縦軸を相対度数にしたヒストグラム
    ax2 = ax1.twinx()
    ax2.set_ylabel('relative frequency', fontsize=18)
    ax2.grid(True, color="lightgrey", linestyle="--")
    ax2.set_axisbelow(True)    # gridを最背面に移動
    weights = np.ones_like(data) / len(data)
    ax2.hist(data, bins=num_bins, weights=weights, rwidth=0.5, align="right", color="red")
    



    세로축=도수의 기둥을 디폴트의 색으로, 세로축=상대도수의 기둥을 빨강으로, 좌우에 나란히 묘화 했습니다.
    이 양자의 높이가 동일하게 보이는 것을 사람이 확인합니다

    빈도와 상대 빈도의 기둥 높이가 동일하게 보이면 기둥 색을 일치시킵니다.
    "color="red""를 지정하지 않고 ax2.hist()를 호출합니다.



    ax2의 Grid선이, ax1의 기둥보다 앞에 표시되어 버렸습니다.
    이 가로선을 보이지 않으려면 다음 코드를 추가하여 ax1과 동일한 그래프를 덮어 쓰기로 결정했습니다.
    
    # (3) (1)の見栄えを調整
    ax3 = ax1.twinx()
    ax3.set_yticklabels([]) 
    ax3.hist(data, bins=num_bins, rwidth=0.5, align="mid")
    



    완성판의 코드 전체는 이하와 같습니다.
    
    #%%
    
    import numpy as np
    import matplotlib.pyplot as plt
    
    
    #%%
    
    # データ作成
    μ = 50
    σ = 10
    data = [ np.random.normal(μ, σ) for i in range(7500) ]
    
    
    #%%
    
    # 階級数
    num_bins = 20
    
    # グラフ描画
    fig = plt.figure(figsize=(12, 8))
    plt.legend()
    plt.xlabel('x', fontsize=18)
    plt.title('null', fontsize=18)
    
    # (1) 縦軸を度数にしたヒストグラム
    ax1 = fig.add_subplot(111)
    ax1.set_ylabel('frequency', fontsize=18)
    ax1.grid(True, color="dimgray")
    ax1.set_axisbelow(True)    # gridを最背面に移動
    ax1.hist(data, bins=num_bins, rwidth=0.5, align="mid")
    
    # (2) 縦軸を相対度数にしたヒストグラム
    ax2 = ax1.twinx()
    ax2.set_ylabel('relative frequency', fontsize=18)
    ax2.grid(True, color="lightgrey", linestyle="--")
    ax2.set_axisbelow(True)    # gridを最背面に移動
    weights = np.ones_like(data) / len(data)
    ax2.hist(data, bins=num_bins, weights=weights, rwidth=0.5, align="right")
    
    # (3) (1)の見栄えを調整
    ax3 = ax1.twinx()
    ax3.set_yticklabels([]) 
    ax3.hist(data, bins=num_bins, rwidth=0.5, align="mid")
    

    사도적인 느낌이므로, 정공법이 있으면 가르쳐 주었으면 합니다.

    좋은 웹페이지 즐겨찾기