본문 바로가기
Programming/python

파이썬 python matplotlib 으로 노년 구직자의 희망직종명 파이차트 그리기-2

by 조창대 2021. 7. 22.
반응형

2021.07.19 - [코딩공부] - 파이썬 python matplotlib 으로 노년 구직자의 희망직종명 파이차트 그리기-1 에서 65세 이상 노년 구직자들의 희망직종명 파이차트를 만들기 위해 데이터프레임을 정리해서 

이렇게 각자의 직종을 몇 명이 희망하는지까지 알게 되었다.

이 결과값을 가지고 파이차트를 만들어 보자.

 

matplotlib.pyplot 모듈을 활용하면 되는데, 이 모듈은 명령어 스타일로 동작하는 '함수의 모음집'이라고 생각하면 된다.

pyplot에 포함된 각각의 함수들로 그래프를 만들고 스타일의 변화를 줄 수 있다.

pyplot의 alias(가명)는 보통 plt라고 명명한다.

 

 

기본 그래프 그리기


import matplotlib.pyplot as plt

new=df[condition]['희망직종명'].value_counts().head(5).sort_values()
plt.pie(new)

>>>

>>>

 

plt.plot()을 하면 디폴트값인 선그래프가 나타난다.

지금은 파이차트가 필요하기 때문에 plot 자리에 pie를 입력해주었다.

참고로 막대 그래프는 "bar", 히스토그램은 "hist", 박스 플롯은 "box" 로 입력한다.

 

 

파이조각 시작점 : startangle(시작점 각도 조절)


import matplotlib.pyplot as plt

new=df[condition]['희망직종명'].value_counts().head(5).sort_values()

plt.pie(new,startangle = 90)

>>>

>>>

바람직한 파이차트는 12시 방향 기준으로 큰 비율 → 작은 비율순으로 배치한 차트이다.

제일 큰 범위인 보라색 부분이 아래에 눕혀 있던걸 12시 방향으로 세우기 위해 90도로 꺾었다.

-90으로 하면 보라색 덩어리가 왼쪽으로 서게 된다.

 

 

차트 조각내기 : explode


import matplotlib.pyplot as plt

new=df[condition]['희망직종명'].value_counts().head(5).sort_values()

plt.pie(new,startangle = 90,explode = (0,0,0,0,0.1))

>>>

>>>

차트에서 강조하고 싶은 부분은 조각을 내면 눈에 띄고 효과적이다.

explode=() 의 괄호 안에는 차트의 인수의 수와 동일하게 파라미터를 입력해야 한다.

지금 차트는 화학/환경/에너지 분야 단순 종사원, 주차 관리 안내원, 경비원(건물 관리원), 재가 요양 보호사, 건물 청소원의 순으로 나타나 있어서 explode의 파라미터에도 이 순서가 유효하다.

 

즉, 비율이 가장 높은 건물 청소원 부분을 조각내고 싶으면 건물 청소원이 가장 마지막 순서에 위치해 있으니까 

explode = (0, 0, 0, 0, 0.1) 이렇게 적어주면 된다.

0.1은 다른 인자들과의 간격을 나타내서 0.05, 0.2 등 하고 싶은대로 숫자를 줄였다 늘렸다 할 수 있다.

 

 

차트 그림자 : shadow


import matplotlib.pyplot as plt

new=df[condition]['희망직종명'].value_counts().head(5).sort_values()

plt.pie(new,startangle = 90,explode = (0,0,0,0,0.1),shadow=True)

>>>

>>>

 

 

차트 안에 퍼센트 삽입 : autopct


import matplotlib.pyplot as plt

new=df[condition]['희망직종명'].value_counts().head(5).sort_values()

plt.pie(new,startangle = 90,explode = (0,0,0,0,0.1),shadow=True,autopct='%1.1f%%')

>>>

>>>

파이 차트는 반드시 수치를 표시해야 한다. 

'%1.1f%%'는 비율을 소숫점 첫째 자리까지 나타내달라는 뜻이다.

'%.2f%%'는 소숫점 둘째 자리까지 나타내달라는 뜻이고, '%d%%'는 정수만.

 

위쪽에 2.9%로 글자가 겹치는 지점은 코딩으로 수치를 계단식으로 구현해서 겹치지 않게 할 수 있지만

어렵기 때문에 나중에 'figma'라는 무료로 이용 가능한 온라인 디자인 툴을 이용해 수치들이 겹치지 않도록 수정하겠다.

 

 

차트 조각 색상 바꾸기 : colors


import matplotlib.pyplot as plt

new=df[condition]['희망직종명'].value_counts().head(5).sort_values()

colors = ['saddlebrown', 'lightpink', 'wheat','cornsilk','thistle']
plt.pie(new,startangle = 90,explode = (0,0,0,0,0.1),shadow=True,autopct='%1.1f%%',colors=colors)

>>>

>>>

차트에 내가 원하는 색상을 입혀서 한층 예뻐졌다. 나는 비비드한 색상 계열이 좋아서 담백하게.

코드는 순차적으로 실행되기 때문에 파이차트 코드 위에 colors를 정의해줘야 오류없이 잘 된다.

색상 이름은 아래 CSS 색상표에서 고르자.

 

 

 

텍스트 사이즈 변경 : textprops


import matplotlib.pyplot as plt

new=df[condition]['희망직종명'].value_counts().head(5).sort_values()

colors = ['saddlebrown', 'lightpink', 'wheat','cornsilk','thistle']
plt.pie(new,startangle = 90,explode = (0,0,0,0,0.1),shadow=True,autopct='%1.1f%%',colors=colors,textprops = {'fontsize':13})

>>>

>>>

차트의 텍스트의 크기를 변경하는 함수는 textprops이다.

숫자를 늘렸다 줄였다 해서 조절 가능.

 

 

차트 제목 : plt.title()


import matplotlib.pyplot as plt

new=df[condition]['희망직종명'].value_counts().head(5).sort_values()

colors = ['saddlebrown', 'lightpink', 'wheat','cornsilk','thistle']
plt.pie(new,startangle = 90,explode = (0,0,0,0,0.1),shadow=True,autopct='%1.1f%%',colors=colors,textprops = {'fontsize':13})
plt.title('65세 이상 구직자의 희망직종명 비율')

>>>

>>>

plt.title() 괄호 안에 제목을 쓴다.

제목 코드는 차트 코드 밑에 적어야 하는데, 차트 코드 위에 적으면 제목만 있는 빈 정사각형 공간이 하나 더 생기기 때문이다.

 

 

차트 범례 : legend()


import matplotlib.pyplot as plt

new=df[condition]['희망직종명'].value_counts().head(5).sort_values()

colors = ['saddlebrown', 'lightpink', 'wheat','cornsilk','thistle']
labels=new.index
plt.pie(new,startangle = 90,explode = (0,0,0,0,0.1),shadow=True,autopct='%1.1f%%',colors=colors,textprops = {'fontsize':13})
plt.title('65세 이상 구직자의 희망직종명 비율')
plt.legend(labels=labels, loc='lower left', bbox_to_anchor=(0.95, 0.3))

>>>

>>>

나는 직업명들이 너무 길어서 차트에 라벨을 붙이지 않고 범례를 만들었다.

범례도 어쨌든 라벨들로 구성되어 있기 때문에 차트 코드 위에 labels를 정의해준다. new의 index 값들을 가져오는 것이니 직업명들이 호출된다.

 

plt.legend()의 파라미터로 loc와 bbox_to_anchor 인자들을 써서 위치를 조정할 수 있는데, loc는 범례의 위치를 차트 바운딩 박스 기준으로 위치시키고, bbox_to_anchor(x,y)은 x,y 좌표를 이용해서 원하는 위치에 범례를 놓을 수 있다.

 

loc

'best'            0
'upper right'     1
'upper left'      2
'lower left'      3
'lower right'     4
'right'           5
'center left'     6
'center right'    7
'lower center'    8
'upper center'    9
'center'          10

 

bbox_to_achor

 

 

 

차트 저장하기 : plt.savefig


import matplotlib.pyplot as plt

new=df[condition]['희망직종명'].value_counts().head(5).sort_values()

colors = ['saddlebrown', 'lightpink', 'wheat','cornsilk','thistle']
labels=new.index
plt.pie(new,startangle = 90,explode = (0,0,0,0,0.1),shadow=True,autopct='%1.1f%%',colors=colors,textprops = {'fontsize':13})
plt.title('65세 이상 구직자의 희망직종명 비율')
plt.legend(labels=labels, loc='lower left', bbox_to_anchor=(0.95, 0.3))

plt.savefig("65세 희망직종명.svg", format="svg",facecolor='#eeeeee', bbox_inches='tight')
# plt.savefig("65세 이상.png",facecolor='#eeeeee', bbox_inches='tight')

>>>

차트가 완성되었으면 savefig 함수를 사용해서 저장하자.

jpg, png, svg 등 다양한 형태로 저장할 수 있는데 svg 포맷은 온라인에서도 스타일 편집이 가능한 형태라서 나는 'figma'에서 차트 수치들을 손봐야 하기 때문에 svg로 저장했다. 

facecolor는 차트 그림의 배경색을 설정하고, bbox_inches는 그림의 바운더리를 설정한다.

 

 


 

차트 완성 !

반응형