Python

[데이터 시각화] matplotlib, 그래프 범례 밖으로 넣기, 산점도 색깔 넣기, 그림크기 변경figsize

summerorange 2022. 4. 19. 14:54
반응형

Pandas에서 내장되어 있는 데이터 시각화 도구 툴을 간단하게 보겠습니다~!

우선 라이브러리 불러오기

import numpy as np
import pandas as pd
%matplotlib inline

%matplotlib 이 부분은 jupyter notebook에서 그래프가 바로 나타나게 하는 코드이다. 주피터 노트북에서만 주로 쓰이니 다른 도구를 쓰고 있다면 해당 코드는 굳이 쓸 필요가 없음.

데이터 시각화 툴인데. 이 중 가장 많이 썼던 건 선 그래프와 산점도, 이상치를 보기 위해서 박스 플럿을 많이 봤었다. 그 외에 히스토그램 또는 막대 그래프도 자주 쓸 것같다. 둘의 차이점은 히스토그램은 연속된 값들을 표현할 때 쓰고, 막대 그래프는 분리된 값들을 표현하는데 쓴다. 이 중에서 잘 쓰고 중요한 부분만 포스팅하려고 한다. 

df.plot.hist() 히스토그램
df.plot.bar() 막대 그래프
df.plot.barh() 가로 막대 그래프
df.plot.line() 선 그래프
df.plot.area() 누적 그래프
df.plot.scatter() 산점도
df.plot.box() 박스 플럿
df.plot.kde() Kernal Density Estimation
df.plot.hexbin() hexbin 플럿
df.plot.pie() 파이 차트

이외에도 Heatmap, Scatter Matrix, Parallel Plot, Contour plot 등이 있는데 이 부분은 추가로 seaborn 라이브러리를 추가해주어야 한다.

import seaborn as sns

<Histogram>

먼저, 히스토그램을 살펴보면 다음과 같음. 

df1['A'].plot.hist(bins=10, edgecolor='w', grid=True)

다음과 같이 결과가 나타나는데 해당 grid를 없애고 싶으면 grid=False 를 넣거나 그냥 비워두면 된다. bins 는 총 몇 개의 막대를 표시할 것인지를 정하는 것이고, 선 테두리 색깔도 정리할 수 있다. 'b'는 black, 'g' green 'r'-red 등의 색이 있음 그냥 숫자인 '0.9'로 표시하면 회색의 진하기에 따른 선 색깔이 나타난다.

xlabel, ylabel을 추가하고 싶다면

df1['A'].hist(grid=True).set(ylabel="Frequency")

와 같이 set을 넣고 추가하면 된다.

<막대 그래프 Bar Graph>

정말 간단한 막대 그래프는 그냥 데이터를 불러오고 다음과 같이 .plot.bar()로 쳐서 간단히 불러올 수 있다.

df = pd.DataFrame([[5.1, 3.5, 0], [4.9, 3.0, 0], [7.0, 3.2, 1],
                   [6.4, 3.2, 1], [5.9, 3.0, 2]],
                  columns=['length', 'width', 'species'])
df.plot.bar()

좀 더 파라미터값을 조정하고, 제목 넣고, x축 이름, y축 이름 설정하고, 그림 크기 설정하고, 범례를 바깥으로 뺀다고 가정하고 설정하면 다음과 같다.

bargraph = df2.plot.bar(stacked=True, title="Bar Graph Test", figsize=(10, 5))
bargraph.legend(loc=4, bbox_to_anchor=(1.2,0.1))
bargraph.set(xlabel="xlabel", ylabel="ylabel")

stacked 부분을 true로 변경해서 해당 데이터를 위쪽으로 쌓았다. 그리고 legend값으로 범례 위치를 조정해주었다. set을 설정하면 축의 이름을 설정할 수 있다. loc는 범례 위치를 우측 하단에 넣고, bbox_to_anchor로 범례를 바깥으로 조정해주었다. 대략 저값으로 하면 범례 위치가 바깥으로 나갈 겁니다.

loc는 matplotlib 사이트에 가면 뭘 위치로 정했는지 알 수 있다. 그래도 손수 번역을 해서 하단에 작성했습니당. loc로 위치 설정할 때0~10까지 설정할 수 있고, 0은 최적의 위치를 반환한다. 

0 최적 위치
1 우측 상단
2 좌측 상단
3 좌측 하단
4 우측 하단
5 우측
6 좌측 중간
7 우측 중간
8 중간 아래
9 중간 위
10 중간

loc만 조정할 경우 범례는 그래프 안에서 움직이게 된다. 바깥으로 빼고 싶을 때는 bbox_to_anchor 값으로 x축과 y축의 위치를 설정하면 된다.

<선 그래프Line graph>

선 그래프를 그릴 때도 다음과 같이 기본 옵션으로 그려주는 경우도 있는데, 보통 그림 크기와 선의 굵기를 변경할 일이 생긴다.

df2.plot.line()
df2.plot.line(figsize=(12, 4), lw=3)

굵기는 lw 파라미터 값으로 조정해주면 되고 만약 모양을 변경하고 싶을 때는 ls 값을 변경해서 넣어주면 된다.

df2.plot.line(figsize=(12, 4), lw=3, ls=":")

ls(linestyle): '-' 는 디폴트 값, '--' dash, '-.' 선과 점이 함께. ':' 점선, 

c(color): w, r, b, g, c, m, y, k, w 등

lw(linewidth): float값으로 넣을 수 있음

일부분의 열만 그리고 싶을 때는 다음과 같이 y 파라미터를 설정해서 해당 값만 나타나게 할 수 있음.

df2.plot.line(y=['a','b','c'],figsize=(12,3),lw=2);

<산점도 Scatter Plot>

정말 자주 쓰는 시각화 툴이다. seaborn이 좀 더 색감이 좋아서 seaborn 쓰기도 하는데 이 포스팅에서는 기본 내장되어 있는 걸로 코드를 써보기로 한다.

df = pd.DataFrame([[5.1, 3.5, 0], [4.9, 3.0, 0], [7.0, 3.2, 1], [6.4, 3.2, 1], [5.9, 3.0, 2]],columns=['length', 'width', 'species'])
ax1 = df.plot.scatter(x='length', y='width', c='DarkBlue', figsize=(5,3))

x축, y축의 값과 c는 color인데 w, b, r 등등 red 이런식으로 써도 되고, 색깔을 지정할 수 있다. 

그런데 이러한 2차원 그래프를 그리는 것뿐만 아니라 종류에 따라서 가로와 세로가 어떻게 달라지는지 시각화를 할 경우가 있다. 그 때도 c를 넣어서 쓴다.

ax2 = df.plot.scatter(x='length', y='width',c='species',colormap='rainbow')

이런 식으로 보면 특정 종에 따라서 가로와 세로 길이가 어떻게 분포되어 있는지 볼 수 있다. 저 색깔 map은 여러가지 있다. 색깔이 뭐뭐 있는지를 어떻게 확인할 수 있냐면 일부로 오타를 내보면 된다 ;-> 

앞에 대문자로 썼더니 다음과 같이 친절하게 value값 에러났다고 알려준다. 종류가 정말 정말 많으니 마음에 드는 거 쓰면 된다.

또 size marker 를 조정해서 알 수 있는 방법도 있다. 

df.plot.scatter(x='length', y='width', s=(df['species']+5)*50, c='species', cmap='coolwarm')

이런 식으로 크기를 조정할 수 있다. species에 + 5하고 *50해주었는데 species를 0, 1, 2로 정해주다보니 0은 곱하면 0이 되니 숫자를 임의로 더해주었다. species라는 column 값을 기준으로 색을 칠하고 마커를 하라는 코드이다.

def add_something(value):
    return value+5

df1.plot.scatter(x='A',y='B',s=df1['C'].apply(add_something)*50, alpha=0.2);

이런 식으로 함수를 짜서 구하는 방법도 있다. 아니면 lambda x: x+5 이렇게 써도 같다.

<박스플럿 Box Plot>

이상치 구할 때 자주 쓴다... 자주 썼던 기억이 난다. 

df2.boxplot()

이라고 치거나 아님 df2.plot.box()로 쳐도 된다.

다음과 같은 그래프가 나타나는데 초록색은 median 중앙값이다.

특정 종에 따라서 groupby로 묶어서 length, width 값을 보고 싶을 때는 다음과 같은 코드를 쓴다

df.boxplot(by='species', grid=True, figsize=(7, 4))

이 중에서 length 값만 보고 싶을 때는 데이터 프레임 형식으로 다시 만들어주고 다음과 같은 코드를 짜면 된다.

df[['length','species']].boxplot(by='species', grid=False);

- 끗 -

참고사이트:

https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.legend.html

 

matplotlib.pyplot.legend — Matplotlib 3.5.1 documentation

Place a legend on the Axes. The call signatures correspond to the following different ways to use this method: 1. Automatic detection of elements to be shown in the legend The elements to be added to the legend are automatically determined, when you do not

matplotlib.org

https://matplotlib.org/2.0.2/users/colormaps.html

 

Choosing Colormaps — Matplotlib 2.0.2 documentation

Here we examine the lightness values of the matplotlib colormaps. Note that some documentation on the colormaps is available ([list-colormaps]). Qualitative Qualitative colormaps are not aimed at being perceptual maps, but looking at the lightness paramete

matplotlib.org

 

반응형