Matplotlib의 빈 크기(히스토그램)
저는 히스토그램을 만들기 위해 매트플롯립을 사용하고 있습니다.
빈의 수와 반대로 빈의 크기를 수동으로 설정할 수 있는 방법이 있습니까?
사실, 이것은 꽤 쉽습니다. 빈의 수 대신 빈 경계가 있는 목록을 제공할 수 있습니다.이들은 불균등하게 분배될 수도 있습니다.
plt.hist(data, bins=[0, 10, 20, 30, 40, 50, 100])
동일한 분포를 원할 경우 범위를 사용하면 됩니다.
plt.hist(data, bins=range(min(data), max(data) + binwidth, binwidth))
원래 답변에 추가됨
위의 라인은 다음과 같습니다.data
정수로만 채워집니다.매크로코스메가 지적한 바와 같이 플로트에 대해 다음을 사용할 수 있습니다.
import numpy as np
plt.hist(data, bins=np.arange(min(data), max(data) + binwidth, binwidth))
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는 N+1 값 또는 N 빈으로 분할된 min_edge에서 max_edge까지의 배열을 생성합니다.
저는 분위수를 사용하여 샘플에 균일하고 적합한 빈을 만듭니다.
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')
내 생각에 가장 쉬운 방법은 당신이 가지고 있는 데이터의 최소와 최대를 계산한 다음 계산하는 것입니다.L = max - min
그럼 네가 나눕니다L
원하는 빈 너비만큼(빈 크기를 의미하는 것으로 가정함) 이 값의 상한을 빈 수로 사용합니다.
저는 자동적으로 일어나는 일들과 쓰레기통이 "좋은" 값으로 떨어지는 것을 좋아합니다.다음은 꽤 잘 작동하는 것 같습니다.
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.]
OP와 동일한 문제가 있었지만(내 생각에는!), Lastalda가 지정한 방식으로 작동하지 못했습니다.제가 질문을 제대로 해석했는지는 모르겠지만, 다른 해결책을 찾았습니다(아마도 정말 나쁜 방법일 것입니다).
이것이 제가 한 방법입니다.
plt.hist([1,11,21,31,41], bins=[0,10,20,30,40,50], weights=[10,1,40,33,6]);
이는 다음과 같은 결과를 낳습니다.
따라서 첫 번째 매개 변수는 기본적으로 빈을 '초기화'합니다. 저는 특히 빈 매개 변수에 설정한 범위 사이에 있는 숫자를 만들고 있습니다.
이를 입증하려면 첫 번째 매개변수의 배열([1,11,21,31,41])과 두 번째 매개변수의 'bins' 배열([0,10,20,30,40,50])을 확인합니다.
- (첫 번째 배열에서) 숫자 1은 0과 10 사이에 있습니다('빈' 배열에서).
- 숫자 11(첫 번째 배열에서)은 11에서 20 사이('빈' 배열에서)입니다.
- 숫자 21(첫 번째 배열에서)은 21에서 30('빈' 배열에서) 사이에 있습니다.
그런 다음 'weights' 매개 변수를 사용하여 각 빈의 크기를 정의합니다.무게 매개변수 [10,1,40,33,6]에 사용되는 배열입니다.
따라서 0에서 10까지의 빈에는 10, 11에서 20까지의 빈에는 1, 21에서 30까지의 빈에는 40의 값이 주어집니다.
이 답변은 @ 매크로코스메 제안을 지원합니다.
저는 히트맵을 hist2d plot으로 사용하고 있습니다.또한 카운트 값이 없는 경우 cmin=0.5를 사용하고 색상은 cmap을 사용하며, r은 주어진 색상의 반대를 나타냅니다.
# np.arange(data.min(), data.max()+binwidth, binwidth)
bin_x = np.arange(0.6, 7 + 0.3, 0.3)
bin_y = np.arange(12, 58 + 3, 3)
plt.hist2d(data=fuel_econ, x='displ', y='comb', cmin=0.5, cmap='viridis_r', bins=[bin_x, bin_y]);
plt.xlabel('Dispalcement (1)');
plt.ylabel('Combine fuel efficiency (mpg)');
plt.colorbar();
시각화 측면에서도 edgecolor='white', linewidth=2를 추가할 수 있으며 빈을 구분합니다.
date_binned = new_df[(new_df['k']>0)&(new_df['k']<360)]['k']
plt.hist(date_binned, bins=range(min(date_binned), max(date_binned) + binwidth, binwidth), edgecolor='white', linewidth=2)
정수 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
정수에 표시를 합니다.call " " " 는 " " " 입니다.
언급URL : https://stackoverflow.com/questions/6986986/bin-size-in-matplotlib-histogram
'programing' 카테고리의 다른 글
도커선.도커 예외:서버 API 버전을 가져오는 중 오류 발생 (0) | 2023.06.04 |
---|---|
팬더를 사용하여 날짜 및 시간 열 결합 (0) | 2023.06.04 |
Java Apache POI Excel PDF로 저장 (0) | 2023.06.04 |
Firebase 분석에서 Floatter 화면을 추적하려면 어떻게 해야 합니까? (0) | 2023.06.04 |
루비 객체가 부울 객체인지 확인하는 방법 (0) | 2023.06.04 |