Matplotlib의 빈 크기 (히스토그램)


149

히스토그램을 만들기 위해 matplotlib을 사용하고 있습니다.

출력 함 수와 달리 출력 함의 크기를 수동으로 설정하는 방법이 있습니까?

답변:


270

실제로는 매우 쉽습니다. 빈 수 대신 빈 경계가있는 목록을 제공 할 수 있습니다. 그것들은 또한 불균등하게 분배 될 수 있습니다 :

plt.hist(data, bins=[0, 10, 20, 30, 40, 50, 100])

당신이 그것들을 균등하게 분배하기를 원한다면, 간단히 range를 사용할 수 있습니다 :

plt.hist(data, bins=range(min(data), max(data) + binwidth, binwidth))

원래 답변에 추가

위의 행은 data정수 로 채워진 경우에만 작동 합니다. 으로 macrocosme는 지적 수레를 위해 당신은 사용할 수 있습니다 :

import numpy as np
plt.hist(data, bins=np.arange(min(data), max(data) + binwidth, binwidth))

20
float (.)와 작동하도록 range (...)를 np.arange (...)로 바꿉니다.
macrocosme

6
여기서 binwidth는 무엇입니까? 전에 해당 값을 설정 했습니까?
UserYmY

1
이 예제에서 binwidth는 다음에서 찾을 수 있다고 생각 (data.max() - data.min()) / number_of_bins_you_want합니다. 이 예제를보다 쉽게 ​​이해할 + binwidth수 있도록 변경 될 수 있습니다 1.
Jarad

2
부동 소수점 데이터에 대한 위의 CodingCat의 탁월한 솔루션 외에도 히스토그램 막대가 x- 틱에 막대 경계를 두지 않고 정수 x- 틱 주위에 중심을 두려면 다음 조정을 시도하십시오. bins = np.arange (dmin-0.5, dmax + 0.5 + binwidth, binwidth)
DaveW

3
옵션 lw = 5, color = "white"또는 이와 유사한 인서트는 막대 사이에 흰색 간격을 삽입
PatrickT

13

N 빈의 경우 빈 가장자리는 N + 1 값 목록으로 지정되며, 첫 번째 N은 낮은 빈 가장자리를, +1은 마지막 빈의 상단을 나타냅니다.

암호:

from numpy import np; from pylab import *

bin_size = 0.1; min_edge = 0; max_edge = 2.5
N = (max_edge-min_edge)/bin_size; Nplus1 = N + 1
bin_list = np.linspace(min_edge, max_edge, Nplus1)

linspace는 min_edge에서 max_edge까지 배열을 N + 1 값 또는 N 구간으로 나눈다는 점에 유의하십시오.


1
빈은 두 경계를 모두 포함하는 N + 1 (마지막) 빈을 제외하고는 하한을 포함하고 상한을 배제합니다.
lukewitmer

4

쉬운 방법은 가지고있는 데이터의 최소 및 최대를 계산 한 다음 계산하는 것 L = max - min입니다. 그런 다음 L원하는 빈 너비로 나눕니다 (빈 크기가 의미하는 것으로 가정합니다).이 값의 상한을 빈 수로 사용하십시오.


그것이 바로 내가 생각했던 것입니다. 감사합니다. 더 간단한 방법이 있는지 궁금해했지만 감사하게 보입니다!
Sam Creamer

둥근 숫자를 사용하면이 방법으로 둥근 상자 크기를 얻지 못합니다. 누구든지 그것을 경험 했습니까?
브래드 우 라니

3

나는 일이 자동으로 일어나고 쓰레기통이 "좋은"값으로 떨어지는 것을 좋아합니다. 다음은 꽤 잘 작동하는 것 같습니다.

import numpy as np
import numpy.random as random
import matplotlib.pyplot as plt
def compute_histogram_bins(data, desired_bin_size):
    min_val = np.min(data)
    max_val = np.max(data)
    min_boundary = -1.0 * (min_val % desired_bin_size - min_val)
    max_boundary = max_val - max_val % desired_bin_size + desired_bin_size
    n_bins = int((max_boundary - min_boundary) / desired_bin_size) + 1
    bins = np.linspace(min_boundary, max_boundary, n_bins)
    return bins

if __name__ == '__main__':
    data = np.random.random_sample(100) * 123.34 - 67.23
    bins = compute_histogram_bins(data, 10.0)
    print(bins)
    plt.hist(data, bins=bins)
    plt.xlabel('Value')
    plt.ylabel('Counts')
    plt.title('Compute Bins Example')
    plt.grid(True)
    plt.show()

결과는 빈 크기 간격마다 빈이 있습니다.

[-70. -60. -50. -40. -30. -20. -10.   0.  10.  20.  30.  40.  50.  60.]

계산 된 빈 히스토그램


정확히 내가 찾던 것! 그러나 경우에 따라 부동 소수점 정밀도로 인해 n_bin이 반올림됩니다. 예 :이 desired_bin_size=0.05, min_boundary=0.850, max_boundary=2.05의 계산 n_bins하게 int(23.999999999999993)되는 결과 23 대신 24 때문에 한 빈 너무 적다. 정수 변환하기 전에 반올림은 나를 위해 일한 :n_bins = int(round((max_boundary - min_boundary) / desired_bin_size, 0)) + 1
M. SCHLENKER에게

3

용기를 균일하게하고 샘플에 맞게 Quantile을 사용합니다.

bins=df['Generosity'].quantile([0,.05,0.1,0.15,0.20,0.25,0.3,0.35,0.40,0.45,0.5,0.55,0.6,0.65,0.70,0.75,0.80,0.85,0.90,0.95,1]).to_list()

plt.hist(df['Generosity'], bins=bins, normed=True, alpha=0.5, histtype='stepfilled', color='steelblue', edgecolor='none')

여기에 이미지 설명을 입력하십시오


1
좋은 생각이야 Quantile 목록을 np.arange(0, 1.01, 0.5)또는로 바꿀 수 np.linspace(0, 1, 21)있습니다. 가장자리가 없지만 상자의 면적이 동일하지만 X 축의 너비가 다르다는 것을 알고 있습니까?
Tomasz Gandor

2

OP와 같은 문제가 있었지만 Lastalda가 지정한 방식으로 작동하지 못했습니다. 나는 질문을 올바르게 해석했는지 알지 못하지만 다른 해결책을 찾았습니다 (아마도 그것을하는 것은 정말 나쁜 방법 일 것입니다).

이것이 내가 한 방식입니다.

plt.hist([1,11,21,31,41], bins=[0,10,20,30,40,50], weights=[10,1,40,33,6]);

이것은 이것을 만듭니다 :

matplotlib에서 작성된 히스토그램 그래프를 보여주는 이미지

따라서 첫 번째 매개 변수는 기본적으로 bin을 초기화합니다. 특히 bins 매개 변수에서 설정 한 범위 사이의 숫자를 만듭니다.

이를 설명하려면 첫 번째 매개 변수 ([1,11,21,31,41])의 배열과 두 번째 매개 변수 ([0,10,20,30,40,50])의 'bins'배열을 살펴보십시오. :

  • 첫 번째 배열의 숫자 1은 0과 10 사이입니다 ( 'bins'배열에 있음)
  • 숫자 11 (첫 번째 배열에서)은 11에서 20 사이 ( 'bins'배열에 있음)
  • 숫자 21 (첫 번째 배열에서)은 21에서 30 사이 ( 'bins'배열에 있음) 등입니다.

그런 다음 'weights'매개 변수를 사용하여 각 빈의 크기를 정의합니다. 가중치 매개 변수에 사용되는 배열입니다 : [10,1,40,33,6].

따라서 0 ~ 10 빈에는 값 10이 주어지고 11 ~ 20 빈에는 1의 값이 주어지고 21 ~ 30 빈에는 40의 값이 주어집니다.


3
히스토그램 기능이 어떻게 작동하는지 기본적인 오해가 있다고 생각합니다. 원시 데이터를 기대합니다. 따라서 예제에서 데이터 배열에는 0과 10 사이의 10 개의 값, 10과 20 사이의 1의 값 등이 포함되어야합니다. 그런 다음이 함수는 합산 및 드로잉을 수행합니다. 위에서하고있는 것은 이미 합이 있으므로 "가중치"옵션을 잘못 사용하여 그래프에 삽입하기 때문에 해결 방법입니다. 이것이 혼란을 없애기를 바랍니다.
CodingCat

-1

정수 x 값을 가진 히스토그램의 경우

plt.hist(data, np.arange(min(data)-0.5, max(data)+0.5))
plt.xticks(range(min(data), max(data)))

오프셋 0.5는 빈을 x 축 값의 중심에 둡니다. 이 plt.xticks호출은 모든 정수에 틱을 추가합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.