yooonicode
python 데이터 분석 - ch 5 본문
📖 5-1
맷플롯립 그래프 담는 객체인
1. 피겨 - 모든 그래프 구성 요소를 담고 있는 최상위 객체
scatter()로 산점도를 그릴 때 자동으로 피겨 객체가 생성됨, figure() 함수로 명시적으로 활용하면 다양한 옵션 활용 가능
2. rcParams
3. 서브플롯
- figsize 매개변수의 지정으로 산점도 사이즈 조절 가능(인치 단위)
print(plt.rcParams['figure.figsize'])
// 윗 코드 이용하여 맷플롯립 기본 그래프 크기 확인 가능
- plt.show() 호출시 figure()로 만든 피겨 객체는 자동으로 소멸됨
- 그래프 사진을 오른쪽 클릭 후 실제 자로 재보면 실제 사이즈보다 작음
➡️ DPI(dot per inch)의 차이, 맷플롯립의 기본 DPI는 72로 노트북의 DPI보다 작음
print(plt.rcParams['figure.dpi'])
// 현재 맷플롯립의 기본 그래프크기 확인
> 인치보다는 픽셀 크기로 다루는 것이 편리함, figsize는 인치 단위로 값을 지정해야하기 때문에 원하는 픽셀 값을 DPI로 나누어 구할 수 있음. 900*600 크기의 그래프를 그리고 싶다면 두 픽셀의 값을 72로 나누어 figsize에 전달
➡️ 픽셀 값을 DPI값으로 나누면 인치 값 구할 수 있음
확인 결과 900*600 픽셀이 아님 ➡️ 코랩 노트북은 기본적으로 출력시에 그래프 주변 공백을 최소화하는 타이트 레이아웃을 사용하기 때문
✔️ 코랩 노트북의 타이트 레이아웃을 사용하지 않으려면 맷플롯립 그래프를 그릴 때 bbox_inches를 None으로 지정해야
figsize 그대로 둔 후 dpi 매개변수를 지정하여 인치당 픽셀 수를 두 배로 늘려서 그래프를 두 배 키움
그래프 안의 모든 구성요소도 함께 커졌음, 마커의 크기 및 x축, y축의 크기가 커졌음
- figsize는 캔버스 크기라면 DPI는 그래프 확대하는 돋보기
2. rcParams 객체
- 맷플롯립 그래프의 기본값을 관리하는 객체
- 객체에 담긴 값을 출력하는 것 뿐 아니라 새로운 값으로 바꾸어 이후 그려지는 모든 그래프에 적용할 수 있음
- 그래프 해상도를 높이기 위해 DPI 기본값 높이기
- 산점도 마커를 별모양으로 바꾸기(기본값 동그라미)
- 기본값 수정 대신에 scatter() 함수의 marker 매개변수로 마커의 모양을 지정하면 됨
➡️ 기본값을 무시하고 marker 매개변수의 지정 값을 이용함
3. 서브플롯
- 맷플롯립의 Axes 클래스의 객체를 말하며 하나의 서브플롯은 두개 이상의 축을 포함함
- 3차원 그래프라면 세개의 축이 존재
- 각 축에는 눈금, 틱이 표시되며 축의 이름을 나타내는 레이블이 있음
✔️ 하나의 피겨 객체에 두 개 서브플롯 추가하기 - subplots()
- 매개변수에 2를 넣어 두 개의 서브플롯을 그린 후, scatter와 hist 함수 호출
- 히스토그램의 y축은 로그 스케일로 지정
- subplots도 피겨 크리 조정 가능함(figsize), 제목 지정 가능(set_title())
- 서브플롯을 가로로 출력하는 법
matplotlib.pyplot.figure() - 피겨 객체 만들어 반환
matplotlib.pyplot.subplots() - 서브플롯 생성 후 반환
Axes.set_x(or y)scale() - x축 또는 y축의 스케일 지정
Axes.set_title()
Axes.set_x(or y)label()
📖 5-2 선 / 막대 그래프 그리기
- 데이터 다운로드 후 연도별 발행도서 개수와 주제별 도서 개수를 구하기
- 발행년도에 따라서 연도별 도서 갯수를 구하고, 시간순으로 배치하여 (sort_index())
- 2650년이 말이 안되므로 2030년 이하인 데이터만 추려줌
✔️ 주제별 도서 개수 구하기
- 주제분류번호의 첫번째 글자는 십진분류코드, 첫 글자만 선택하여 value_counts()
- 단, 열에 NaN이 포함되어 있으므로 -1을 반환하게끔 걸러냄
✔️ 주제분류번호 열의 값을 받아 첫 글자를 반환하는 함수 선언 후에 apply()에 넣어 반복 적용
➡️ 8로 시작하는 도서인 문학 도서가 제일 많음을 확인, 인덱스 순서대로 정렬하지 않음
명목형 데이터와 순서형 데이터
명목형 : 순서를 매길 수 없는 성별이나 국가
순서형 : 순서가 있는 데이터, 만족도 등 순서형이라면 그래프 표현 전에 순서대로 정렬하여야 함
- 주제분류번호는 명목형이므로 sort하지 않음
✔️ 선 그래프 그리기 - plot()
- 그래프 해상도 위하여 기본 DPI 100으로 설정
- plot()의 매개변수에 연도, 도서 개수를 지정하여 선 그래프를 그리기
- 제목, 축 이름 지정 ⭐ 서브플롯과 다르게 title(), xlabel(), ylabel() 사용하여 저장
- 선 모양, 색 배꾸기
linestyle 매개변수의 기본값은 '-' (':' - 점선, '-' - 쇄선, '--' : 파선)
color 매개변수는 hex코드 전달 또한 색 이름 지정 (blue, magenta, cyan, yellow, black, white, green, red - b,m,c,y,bl(bk인가?), w, g, r로 축약 가능)
marker 매개변수 존재
✔️ 눈금 개수 조절, 마커에 텍스트 표시
눈금 개수 조절 - xticks(), yticks(), 서브플롯에는 set_xticks(), set_yticks()
+ range() 함수의 사용을 통해 10년씩 건너뜀, 슬라이스 연산자를 사용하여 다섯개씩 건너뛰며 count_by_year 값 선택
+ 시리즈 객체의 items() 활용하여 인덱스와 값을 감싼 튜플 얻어내기
- 그래프 값 표시에는 annotate() : 첫 매개변수에 나타낼 문자열, 두 번째에 xy좌표를 튜플로 지정
- 마커 옆에 텍스트가 바로 있음, 떼어놓기 위해서 xytext 매개변수를 사용함
annotate()는 마커와 동일한 좌표 시스템을 사용하므로 조금 띄워보는 시
- x축으로 1만큼, y축으로 10만큼 떨어뜨림
‼️ y축의 스케일이 크기때문에 상대적 위치를 포인트, 픽셀 단위로 지정하는 것이 효과적
⭐ xytext 매개변수와 함께 textcoords 매개변수를 사용하여 상대 위치, offset points 지정
+ 1포인트는 1/72 inch, 픽셀 단위로 지정하고 싶다면 offset pixels로
✔️ 막대 그래프 그리기 - bar()
- 막대 중앙으로 텍스트 위치 옮기고, 색상 바꾸기
> annotate()의 ha 매개변수를 center로 지정(기본값 right)
> 텍스트 겹치는 경우 방지 위하여 fontsize로 크기 줄이기
> 텍스트 색깔 color='green'으로 지정
> 기본 bar width 0.8인데 두께를 줄이고 color = 'blue'
✔️ 가로 막대 그래프 그리기 - barh()
- 두께를 나타내기 위해 width 아닌 height 매개변수 사용, x축 y축의 이름 변경
- annotate() 사용시에도 x값과 y값 변경되어 idx,val 아닌 val, idx로 변경하여 사용해야함
- ha 아닌 va 매개변수로 기본값 baseline, center로 변경함(top, bottom도 존재함)
✔️ 이미지 출력 및 저장
- PIL, Pilow 패키지를 이용할 수도 있음
- 이미지 저장
- 그래프를 이미지로 저장 - savefig()
sol1) savefig(저장할 이름, dpi = )
sol2) rcParams['savefig.dpi']로 DPI지정, 기본값은 figure로 피겨의 DPI를 따라감
- 마지막의 가로 막대를 저장하려면 show() 함수 호출 전에 savefig()하여 피겨 객체 소멸 전에 저장되도록 함
DPI가 높다면 인쇄물에 충분한 고해상도 이미지 얻기 가능
'데이터분석' 카테고리의 다른 글
python 데이터 분석 ch 7-1, 7-2 (0) | 2023.09.30 |
---|---|
python 데이터 분석 - ch 6 (0) | 2023.09.22 |
python 데이터 분석 - ch 4 (1) | 2023.09.15 |
python 데이터 분석 - ch 3 (0) | 2023.09.15 |
python 데이터 분석 - ch1, 2 (1) | 2023.09.09 |