빅데이터/Data Visualization
데이터 시각화 05 - Matplotlib (저장/텍스트/여러 데이터/막대그래프)
H-V
2022. 1. 21. 19:37
유투버 '나도코딩'님 강의 참조
01 Matplotlib 저장
plt.plot(x,y);
plt.savefig('graph.png')
# 크기를 조절하여 저장
plt.plot(x,y);
plt.savefig('graph.png', dpi=100)
02 텍스트
- 그래프 내에 원하는 텍스트를 넣을 때 사용
x = [1,2,3]
y = [2,4,8]
plt.plot(x,y, marker='o');
for idx, txt in enumerate(y): # for 순서, 텍스트 in enumerate('순서대로 불러올 값')
plt.text(x[idx], y[idx], txt)
# x[0] = 1 , y[0] = 2, text[0] = 2
# x[1] = 2 , y[1] = 4, text[0] = 4
# x[2] = 3 , y[2] = 8, text[0] = 8
- 인덱스 + 값 + enumerate() 을 써서 포문을 돌림
- 'enumerate()' - 리스트, 튜플, 문자열에 순서를 넣어주는 함수, 즉 'y'의 리스트 값을 순서대로 들고 올 수 있음
- matplotlib 라이브러리의 .text()를 이용하여 텍스트를 찍는데 '그래프 상의 x 위치, y 위치, 그리고 삽입할 텍스트를 순서대로 입력
- 이때 enumerate()를 써서 괄호안의 값을 순서대로 받는 경우에는 x위치, y위치를 잘 지정해야 오류가 안난다
(예: enumerate(y) 값을 순서대로 돌리는데 x위치에 y위치를 넣으면 오류가 터진다) - x와 y값에 찍힌 부분에 텍스트를 찍으므로 정확한 x,y위치가 들어가야 한다!!
▶ 여기서 텍스트가 겹쳐있으니 잘 보이도록 해보자
plt.plot(x,y, marker='o');
# 텍스트 설정을 좀 더 디테일 하기 위한 설정
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.xticks([1, 1.5, 2, 2.5, 3])
plt.yticks([2,4,8,6,10]);
for idx, txt in enumerate(y): # for 순서, 텍스트 in enumerate('순서대로 불러올 값')
plt.text(x[idx], y[idx]+0.2, txt, ha='center', color='red') #ha = horizontal 로 텍스트 위치 설정 가능
- x,y 축 라벨을 주면서 어디가 어디인지 확인
- 텍스트가 튀어나가니 y축을 길게 늘여뜨리면 안으로 들어 온다
02 여러 데이터 그리기
#Covid-19 백신 종류별 접종 인구
days = [1,2,3] # 일자
az = [2,4,8] # 단위 만명, 1일부터 3일까지 AZ 접종 인구
pfizer = [5,1,3]
moderna = [1, 2, 5]
plt.figure(figsize=(10, 5))
plt.plot(days, az, label='AZ')
plt.plot(days, pfizer, label='PFIZER', marker='o', linestyle='--')
plt.plot(days, moderna, label='MODERNA', marker='v', ls='-.')
plt.legend(ncol=3);
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.yticks(range(1,13));
for idx, txt in enumerate(az):
plt.text(days[idx], az[idx]+0.3, txt, ha='center')
for idx, txt in enumerate(pfizer):
plt.text(days[idx], pfizer[idx]+0.3, txt, ha='center')
for idx, txt in enumerate(moderna):
plt.text(days[idx], moderna[idx]+0.3, txt, ha='center');
▶ 데이터에 대한 텍스트값 넣기가 약간 헷갈린다.
- 중요 포인트는 어느 데이터의 텍스트값을 순서대로 들고올거냐이다. 즉 enumerate('값')에 어떤 데이터의 값이 순서대로 올거냐를 잘 판단 해야 한다.
- 또한 축에도 어떤 값이 들어가냐가 중요하다. 'plt.plot(x값,y값)' 을 잘 봐야 한다.
(x값에 days 가 들어가고 y값에 각 백신이 들어가는 형태)
03 막대 그래프
- 막대를 활용하여 데이터를 시각적으로 표시하는 그래프
- 막대그래프는 x축이 label, y축이 value가 된다
- 일반 꺾은선 그래프는 .plot, 막대그래프는 .bar로 만든다
labels = ['Kang', 'Seo', 'Jung'] # 이름
values = [190, 187, 184] # 키
plt.bar(labels, values)
labels = ['Kang', 'Seo', 'Jung'] # 이름
values = [190, 187, 184] # 키
colors=['r','g','b'] # plt를 선언할때 색을 지정 할 수 있지만, 이렇게 변수화도 가능하다.
plt.bar(labels, values, color = colors, alpha=0.3)
labels = ['Kang', 'Seo', 'Jung'] # 이름
values = [190, 187, 184] # 키
plt.bar(labels, values)
plt.ylim(175, 195) # ylim(시작값, 끝값) 으로 밸류값 조정 가능
# Bar굵기 및 x축 텍스트 기울기
plt.bar(labels, values, width=0.5)
plt.xticks(rotation=45) #축의 텍스트를 기울 수 있음
plt.yticks(rotation=45);
#x축에 들어갈 값 바꾸는 방법
ticks = ['No.1', 'No.2', 'No.3'] #번호
labels = ['Kang', 'Seo', 'Jung'] # 이름
values = [190, 187, 184] # 키
plt.bar(labels, values)
plt.xticks(labels,ticks);
▶ 막대그래프 심화
# 옆으로 누은 막대그래프
plt.barh(labels, values)
plt.xlim(175, 195) #값 조절
# 막대 꾸미기
bar = plt.bar(labels, values)
bar[0].set_hatch('/')
bar[1].set_hatch('x')
bar[2].set_hatch('..')
- 추가적인 헤치 스타일은 다음 링크 참조 (https://matplotlib.org/devdocs/gallery/shapes_and_collections/hatch_style_reference.html)
# 막대에 글자 넣기
bar = plt.bar(labels, values)
plt.ylim(175, 195)
for idx, rect in enumerate(bar):
plt.text(idx, rect.get_height()+0.5, values[idx], ha='center', color='r')
- 꺾은선 그래프와 같이 텍스트를 넣는 형식의 개념은 같다 .text(x축, y축, 텍스트 값)
- 꺾은선과 다른 점은 막대 그래프가 꺾은선처럼 이어져서 표시가 되는게 아닌 하나의 막대가 하나의 정보를 표시하기때문에 x축은 idx를 받아서 각각의 막대 위치 0,1,2,3,4 표시
- 객체의 치수로 값을 표시하면 된다. 자세한 정보는 링크 참조(https://wikidocs.net/76945)
즉 y축에 나올 값은 막대의 치수 = 막대의 정보 이므로 치수를 원하는것을 들고 오면 된다. - 아래 사진을 보면 왜 .get_height()이 되는지 알 수 있다.
- 구글링을 좀 해보면 어떤 사람들은 x축의 값도 x좌표를 정확히 구한뒤 계산을 하는 방식을 쓰는데 더 어렵다. 그냥 인덱싱으로 위치를 잡아주면 알아서 들어간다.