막대그래프(barplot) 그리기
막대그래프는 변수를 두 개 이상의 그룹으로 구분하여 각 그룹에 대응되는 빈도를 시각적으로 나타낼 수 있습니다. 예를 들어 100명에 대한 점수를 그룹 A, B, C, D 분류하여 각 그룹에 포함된 빈도를 시각화 하면 다음과 같습니다.
import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams['font.family'] ='NanumGothic' plt.rcParams['axes.unicode_minus'] =False
자료는 다음과 같이 생성하였습니다.
np.ranodm.randint(시작, 마지막, 크기)
를 사용하여 50, 100 사이의 정수를 무작위로 100개를 추출pd.cut(x, bins=4, labels=['D', 'C', 'B', 'A'], retbins=True)
함수를 사용하여 4개의 그룹으로 목록화
각 그룹의 이름은 인수 labels에 전달
각 그룹의 경계값을 알기 위해 인수 retbins=True 지정
이 함수는 변환된 값들과 각 그룹의 경계값을 반환- 목록화한 변수들에 대해 각 그룹에 대응하는 빈도수는 DataFrame의 메소드
.value_counts()
를 산출
np.random.seed(3) d=np.random.randint(50, 101, 100) d1=pd.cut(d, bins=4, labels=['D', 'C', 'B', 'A'], retbins=True) d1[0]
['A', 'C', 'D', 'D', 'D', ..., 'B', 'B', 'A', 'D', 'B'] Length: 100 Categories (4, object): ['D' < 'C' < 'B' < 'A']
print(np.around(d1[1], 0)) # 목록들의 범위
[ 50. 62. 75. 88. 100.]
d2=d1[0].value_counts() d2
D 19 C 21 B 31 A 29 Name: count, dtype: int64
막대 그래프는 matplotlib 패키지의 barplot() 함수를 사용합니다.
- matplotlib.pyplot.bar(x, height, width=0.8, align='center', …)
- x: x 축에 대한 값들로서 이산변수, 명목변수 모두 가능
- height: x에 대응하는 y값
- width: 막대의 너비
- align: x값에 대한 막대의 위치, "center"와 "edge"
plt.figure(figsize=(4, 3)) bar=plt.bar(d2.index, d2, color="brown", alpha=0.6) for i in bar: height=i.get_height() ix=i.get_x() plt.text(ix+0.2, height+1, height, color="brown") plt.xlabel("group") plt.ylabel("freq.", rotation="horizontal", labelpad=10) plt.ylim(0, 37) plt.show()
그래프 객체는 다양한 메소드나 속성을 가집니다. 그 메소드 중 위 코드의 .get_height()는 x에 대응하는 y(height) 값을 나타냅니다. 위 코드에서는 이 수치들을 각 막대의 위 쪽에 나타내기 위해 적용하였습니다.
함수의 인수 width와 align를 적용한 조정은 다음과 같습니다.
fig, axs=plt.subplots(1,2, figsize=(4, 2)) axs[0].bar(d2.index, d2, color="brown", width=0.5, align="edge", alpha=0.6) axs[1].bar(d2.index, d2, color="brown", width=1, alpha=0.6) plt.show()
막대를 수평으로 정렬하기 위해 barh(x, width, height=0.8)
를 적용합니다. 막대의 너비는 height로 조절합니다.
plt.figure(figsize=(3,2)) plt.barh(d2.index, d2, color="g", height=0.7, alpha=0.6) plt.show()
같은 지표에 대한 다중 막대를 작성할 수 있습니다. 다음은 100 × 3의 자료에 대해 각 열을 3개의 구간으로 구분하여 각각의 빈도를 생성한 것입니다. 사실 데이터 유형은 히스토그램에 더 적합하지만 다중 막대를 나타내기 위해 적용한 것입니다. 다음 그래프와 같이 각 막대의 위치를 조정하기 위해 각 열의 x 값들을 조정하였습니다.
x=np.random.randint(1, 100, size=(100, 3)) y=np.linspace(1, 100, 5) plt.figure(figsize=(3,2)) col=['g','b','r'] l=0 for i in range(x.shape[1]): y1, x1=np.histogram(x[:,i], y) plt.bar(x1[:-1]+l, y1, color=col[i], width=7) l+=7 plt.xlabel("계급") plt.ylabel("빈도", rotation="horizontal", labelpad=10) plt.show()
위 그래프는 각 그룹의 막대를 병렬로 나타낸 것입니다. 다음은 각 그룹의 높이를 직렬로 나타내는 것으로 bar()
함수의 인수 bottom으로 조정할 수 있습니다. 첫그룹의 경우 높이는 0에서 시작하고 두번째 그룹은 첫 그룹을 경계로 작성합니다.
a=np.array([[26, 25, 28, 21],[19, 27, 28, 26], [27, 25, 21, 27]]).T b=["A", "B", "C", "D"] plt.figure(figsize=(3,2)) plt.bar(b, a[:,0], color="g") plt.bar(b, a[:,1], color="b", bottom=a[:,0]) plt.bar(b, a[:,2], color="r", bottom=a[:,0]+a[:,1]) plt.xlabel("계급") plt.ylabel("빈도", rotation="horizontal", labelpad=10) plt.show()
두 그룹에 대한 비교를 위해 "Back-to-Back" 그래프를 작성할 수 있습니다. barh()
함수를 적용하며 한 그룹은 positive 구역, 다른 그룹은 negative 구역에 작성합니다. 그러므로 음의 구역에 작성하는 막대의 너비(x의 크기)는 "-value"와 같이 음수로 지정합니다.
plt.figure(figsize=(3,2)) plt.barh(b, a[:,1], color="b") plt.barh(b, -a[:,2], color="r") plt.xlabel("빈도") plt.xticks(np.arange(-30, 30, 5), size="8") plt.ylabel("계급", rotation="horizontal", labelpad=10) plt.show()
댓글
댓글 쓰기