matplotlib 히스토그램의 세로축과 가로축이 기분 나쁘기 때문에 좋은 느낌

16864 단어 파이썬matplotlib
Python의 matplotlib로 히스토그램을 잘 그리는 것입니다만, 그 세로축·가로축이 때때로 마음에 들지 않기 때문에, 그것을 미세 조정하기 위한 메모입니다.

hist의 세로축과 가로축



예로서 다음과 같은 그래프를 보여드리겠습니다.
%matplotlib inline
import matplotlib.pyplot as plt
from scipy import stats

norm_rvs = stats.norm.rvs(loc=50, scale=30, size=100, random_state=0)
plt.hist(norm_rvs, bins=10, alpha=0.5, ec='navy')
plt.show()



이것을 보면,
  • 우에~응, 히스토그램의 막대의 틈이 어중간한 장소에 있어 기분 나쁜 요!
  • 우에~응, 세로축의 눈금이 정수가 아니면 기분 나쁜 요!

  • 라는 것입니다.

    세로축의 눈금을 정수로 만들고 싶습니다.



    다음과 같이 히스토그램 막대의 틈과 높이에 대한 정보를 얻을 수 있습니다.
    Y, X, _ = plt.hist(norm_rvs, bins=10, alpha=0.5, ec='navy')
    print(X)
    print(Y)
    plt.show()
    
    [-26.58969448 -12.12146116   2.34677216  16.81500548  31.2832388
      45.75147212  60.21970544  74.68793876  89.15617208 103.6244054
     118.09263872]
    [ 1.  5.  7. 13. 17. 18. 16. 11.  7.  5.]
    



    그 정보를 이용해 세로축을 정수로 해 봅니다.
    import numpy as np
    
    Y, X, _ = plt.hist(norm_rvs, bins=10, alpha=0.5, ec='navy')
    y_max = int(max(Y)) + 1
    plt.yticks(np.arange(0, y_max, 2)) # 1刻みにしても見にくいので2刻みにします
    plt.show()
    



    막대의 구분을 좋은 느낌으로 하고 싶다



    가로축 범위를 지정하여 bin의 개수를 좋은 느낌으로 조정합니다.
    Y, X, _ = plt.hist(norm_rvs, bins=13, alpha=0.5, ec='navy', range=(-10, 120))
    print(X)
    print(Y)
    y_max = int(max(Y)) + 1
    plt.yticks(np.arange(0, y_max, 2))
    plt.show()
    
    [-10.   0.  10.  20.  30.  40.  50.  60.  70.  80.  90. 100. 110. 120.]
    [ 3.  5.  6. 10. 11.  9. 15. 13.  9.  6.  5.  5.  2.]
    



    여러 히스토그램을 좋은 느낌으로 만들고 싶습니다.



    이제 여러 히스토그램을 나란히 비교하고 싶을 때가 있습니다.
    norm_rvs2 = stats.norm.rvs(loc=75, scale=55, size=100, random_state=0)
    
    plt.hist(norm_rvs, bins=10, alpha=0.5, ec='navy')
    plt.hist(norm_rvs2, bins=10, alpha=0.5, ec='red')
    plt.show()
    



    이런 식으로 기분 나쁜 요~! 라는 경향이 있습니다. 이것도 똑같이 좋은 느낌으로 해 봅시다.
    bins = 20
    range=(-50, 200)
    
    Y1, X1, _ = plt.hist(norm_rvs, bins=bins, alpha=0.5, ec='navy', range=range)
    Y2, X2, _ = plt.hist(norm_rvs2, bins=bins, alpha=0.5, ec='red', range=range)
    y_max = int(max(max(Y1), max(Y2))) + 1
    plt.yticks(np.arange(0, y_max, 2))
    plt.show()
    



    개인적으로는, 다음과 같이 세로로 늘어놓는 편을 좋아합니다.
    bins = 20
    range=(-50, 200)
    
    fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(8,8))
    Y1, X1, _ = axes[0].hist(norm_rvs, bins=bins, alpha=0.5, ec='navy', range=range)
    Y2, X2, _ = axes[1].hist(norm_rvs2, bins=bins, alpha=0.5, ec='red', range=range)
    y_max = int(max(max(Y1), max(Y2))) + 1
    axes[0].set_ylim([0, y_max])
    axes[1].set_ylim([0, y_max])
    axes[0].set_yticks(np.arange(0, y_max, 2))
    axes[1].set_yticks(np.arange(0, y_max, 2))
    plt.show()
    



    현장에서 이상입니다!

    좋은 웹페이지 즐겨찾기