본문 바로가기
인터페이스 개발/Python

Python - [추가] - 데이터 시각화 Matplot

by cooluk 2020. 7. 28.

matplotlib로 그래프 그리기

모듈

In [1]:
import matplotlib.pyplot as plt  # conda install matplotlib도 가능
In [2]:
import numpy as np

선 그래프

기본적인 선 그래프 그리기

  1. plt.plot([x,] y[, fmt])
    • x : x축 좌표의 값 시퀀스 데이터
    • y : y축 좌표의 값 시퀀스 데이터
    • fmt : format string
In [3]:
data1 = [10, 14, 19, 20, 25]
In [4]:
plt.plot(data1)
plt.show()  # Jupyter 브라우저 안에서 실행(pycham에서는 새창)
In [ ]:
%matplotlib qt  # 새창에서 보기
In [5]:
plt.plot(data1)  # 별도의 창
Out[5]:
[<matplotlib.lines.Line2D at 0x24095663908>]
In [ ]:
%matplotlib inline  # 브라우저 보기
In [ ]:
 
In [6]:
x = np.arange(-4.5, 5, 0.5) # 배열 x 생성. 범위: [-4.5, 5), 0.5씩 증가
y = 2*x**2 # 수식을 이용해 배열 x에 대응하는 배열 y 생성
[x,y]
Out[6]:
[array([-4.5, -4. , -3.5, -3. , -2.5, -2. , -1.5, -1. , -0.5,  0. ,  0.5,
         1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5]),
 array([40.5, 32. , 24.5, 18. , 12.5,  8. ,  4.5,  2. ,  0.5,  0. ,  0.5,
         2. ,  4.5,  8. , 12.5, 18. , 24.5, 32. , 40.5])]
In [7]:
plt.plot(x,y)
plt.show()

하나의 그래프 창에 여러 개의 데이터를 선 그래프로 표시하는 방법(1)

plt.plot([x1,] y1 [,fmt1])

plt.plot([x2,] y2 [,fmt2])

:

plt.plot([xn,] yn [,fmtn])

plt.show()

In [8]:
x = np.arange(-4.5, 5, 0.5)
y1 = 2*x**2
y2 = 5*x + 30
y3 = 4*x**2 + 10
In [9]:
plt.plot(x, y1)
plt.plot(x, y2)
plt.plot(x, y3)
plt.show()

하나의 그래프 창에 여러 개의 데이터를 선 그래프로 표시하는 방법(2)

plt.plot(x1, y1 [,fmt1], x2, y2 [,fmt2], … , xn, yn [,fmtn])

In [10]:
plt.plot(x, y1, x, y2, x, y3)
plt.show()

여러 그래프 그리기

  1. plt.figure()
    • 새로운 그래프 창을 생성
    • 이후의 plot()은 새로운 그래프 창에 그려짐
In [11]:
plt.plot(x, y1) # 처음 그리기 함수를 수행하면 그래프 창이 자동으로 생성됨
plt.figure() # 새로운 그래프 창을 생성함
plt.plot(x, y2) # 새롭게 생성된 그래프 창에 그래프를 그림
plt.show()
  1. plt.figure(n)
    • n번째 새로운 그래프 창을 생성
    • 이미 생성되어 있으면 해당 그래프 창 선택됨
    • 이후의 plot()은 n번째 그래프 창에 그려짐
In [12]:
# 데이터 생성
x = np.arange(-5, 5, 0.1)
y1 = x**2 -2
y2 = 20*np.cos(x)**2 # NumPy에서 cos()는 np.cos()으로 입력
plt.figure(1) # 1번 그래프 창을 생성함
plt.plot(x, y1) # 지정된 그래프 창에 그래프를 그림
plt.figure(2) # 2번 그래프 창을 생성함
plt.plot(x, y2) # 지정된 그래프 창에 그래프를 그림
plt.figure(1) # 이미 생성된 1번 그래프 창을 지정함
plt.plot(x, y2) # 지정된 그래프 창에 그래프를 그림
plt.figure(2) # 이미 생성된 2번 그래프 창을 지정함
plt.clf() # 2번 그래프 창에 그려진 모든 그래프를 지움
plt.plot(x, y1) # 지정된 그래프 창에 그래프를 그림
plt.show()

하나의 그래프 창을 분할하여 사용하기

  1. plt.subplot(m, n, p)
    • m x n 행렬로 이뤄진 하위 그래프 중에서
    • p번 위치(1부터 시작)에 그래프 창 지정
In [13]:
# 데이터 생성
x = np.arange(0, 10, 0.1)
y1 = 0.3*(x-5)**2 + 1
y2 = -1.5*x + 3
y3 = np.sin(x)**2 # NumPy에서 sin()은 np.sin()으로 입력
y4 = 10*np.exp(-x) + 1 # NumPy에서 exp()는 np.exp()로 입력
# 2 × 2 행렬로 이뤄진 하위 그래프에서 p에 따라 위치를 지정
plt.subplot(2,2,1) # p는 1
plt.plot(x,y1)
plt.subplot(2,2,2) # p는 2
plt.plot(x,y2)
plt.subplot(2,2,3) # p는 3
plt.plot(x,y3)
plt.subplot(2,2,4) # p는 4
plt.plot(x,y4)
plt.show()

출력 범위 지정하기

  1. plt.xlim(xmin, xmax) # x축의 좌표 범위 지정
  2. plt.ylim(ymin, ymax) # y축의 좌표 범위 지정

현재 출력 범위 얻기

  1. [xmin, xmax] = plt.xlim()
  2. [ymin, ymax] = plt.ylim()
In [14]:
x = np.linspace(-4, 4,100) # [-4, 4] 범위에서 100개의 값 생성
y1 = x**3
y2 = 10*x**2 - 2
plt.plot(x, y1, x, y2)
plt.show()  # 아무 작업 안했을 때

그래프 꾸미기

출력 형식 지정

In [15]:
plt.plot(x, y1, x, y2)
plt.xlim(-1, 1)
plt.ylim(-3, 3)
plt.show()  # 출력 범위 지정
  1. fmt = '[color][line_style][marker]'
    • color : b, g, r, c, m, y, k, w
    • line_style : -(실선), --(파선), :(점선), -.(파선 점선 혼합선)
    • marker
    • 강의노트 22p 표 참고
In [16]:
x = np.arange(0, 5, 1)
y1 = x
y2 = x + 1
y3 = x + 2
y4 = x + 3
In [17]:
plt.plot(x, y1, x, y2, x, y3, x, y4)
plt.show()  # 아무 것도 안했을 때
In [18]:
plt.plot(x, y1, 'm', x, y2,'y', x, y3, 'k', x, y4, 'c')
plt.show()  # 색 출력 형식 지정
In [19]:
plt.plot(x, y1, '-', x, y2, '--', x, y3, ':', x, y4, '-.')
plt.show()  # 선 종류 출력 형식 지정
In [20]:
plt.plot(x, y1, 'o', x, y2, '^',x, y3, 's', x, y4, 'd')
plt.show()  # 점 종류 출력 형식 지정
In [21]:
plt.plot(x, y1, '>--r', x, y2, 's-g', x, y3, 'd:b', x, y4, '-.Xc')
plt.show()  # 혼합

라벨, 제목, 격자, 범례, 문자열 표시

라벨

  1. plt.xlabel(문자열)
  2. plt.ylabel(문자열)
  3. plt.title(문자열)
  4. plt.grid(True) # plt.grid() - 격자 출력
In [23]:
x = np.arange(-4.5, 5, 0.5)
y = 2*x**3
plt.plot(x,y)
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()

제목

In [24]:
plt.plot(x,y)
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.title('Graph title')
plt.show()

grid

In [25]:
plt.plot(x,y)
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.title('Graph title')
plt.grid(True) # 'plt.grid()'도 가능

범례

  1. plt.legend(['str1', 'str2', … ]) # 범례
  2. plt.legend(['str1', 'str2', … ], loc=위치) # 범례 위치
    • best 0
    • upper right 1
    • upper left 2
    • lower left 3
    • lowr right 4
    • right 5
    • center left 6
    • center right 7
    • lower center 8
    • upper center 9
    • center 10
In [26]:
x = np.arange(0, 5, 1)
y1 = x
y2 = x + 1
y3 = x + 2
y4 = x + 3
plt.plot(x, y1, '>--r', x, y2, 's-g', x, y3, 'd:b', x, y4, '-.Xc')
plt.legend(['data1', 'data2', 'data3', 'data4'])
plt.show()
In [29]:
plt.plot(x, y1, '>--r', x, y2, 's-g', x, y3, 'd:b', x, y4, '-.Xc')
plt.legend(['data1', 'data2', 'data3', 'data4'], loc = 'lower right')
plt.show()

한글 추가

In [34]:
import matplotlib  # 한글 사용시 임폴드 해주어야함

matplotlib.rcParams['font.family'] = 'Malgun Gothic' # '맑은 고딕'으로 설정
#  rcParams은 dic 이다.
matplotlib.rcParams['axes.unicode_minus'] = False  # 한글을 사용할 때는 이렇게
In [33]:
plt.plot(x, y1, '>--r', x, y2, 's-g', x, y3, 'd:b', x, y4, '-.Xc')
plt.legend(['데이터1', '데이터2', '데이터3', '데이터4'], loc = 'best')
plt.xlabel('X 축')
plt.ylabel('Y 축')
plt.title('그래프 제목')
plt.grid(True)

문자열

  1. plt.text(x, y, '문자열)
In [35]:
plt.plot(x, y1, '>--r', x, y2, 's-g', x, y3, 'd:b', x, y4, '-.Xc')
plt.text(0, 6, "문자열 출력 1")
plt.text(0, 5, "문자열 출력 2")
plt.text(3, 1, "문자열 출력 3")
plt.text(3, 0, "문자열 출력 4")
plt.show()

산점도

산점도

  1. plt.scatter(x, y [, s=size_n, c=colors, marker='marker_stirng', alpha=alpha_f)
    • 기본 값 : s=40, c='b', marker='o', alpha=1 (alpha : 투명도)
In [36]:
height = [165, 177, 160, 180, 185, 155, 172] # 키 데이터
weight = [62, 67, 55, 74, 90, 43, 64] # 몸무게 데이터
plt.scatter(height, weight)
plt.xlabel('Height(m)')
plt.ylabel('Weight(Kg)')
plt.title('Height & Weight')
plt.grid(True)

마커 크기와 컬러 변경

In [37]:
plt.scatter(height, weight, s=500, c='r') # 마커 크기는 500, 컬러는 붉은색
plt.show()

점 마다 마커의 크기와 컬러 변경 (list 이용)

In [38]:
size = 100 * np.arange(1,8) # 데이터별로 마커의 크기 지정
colors = ['r', 'g', 'b', 'c', 'm', 'k', 'y'] # 데이터별로 마커의 컬러 지정
plt.scatter(height, weight, s=size, c=colors)
plt.show()

예제

In [39]:
city = ['서울', '인천', '대전', '대구', '울산', '부산', '광주']
# 위도(latitude)와 경도(longitude)
lat = [37.56, 37.45, 36.35, 35.87, 35.53, 35.18, 35.16]
lon = [126.97, 126.70, 127.38, 128.60, 129.31, 129.07, 126.85]
# 인구 밀도(명/km^2): 2017년 통계청 자료
pop_den = [16154, 2751, 2839, 2790, 1099, 4454, 2995]
size = np.array(pop_den) * 0.2 # 마커의 크기 지정
colors = ['r', 'g', 'b', 'c', 'm', 'k', 'y'] # 마커의 컬러 지정
plt.scatter(lon, lat, s=size, c=colors, alpha=0.5)
plt.xlabel('경도(longitude)')
plt.ylabel('위도(latitude)')
plt.title('지역별 인구 밀도(2017)')
for x, y, name in zip(lon, lat, city):
 plt.text(x, y, name) # 위도 경도에 맞게 도시 이름 출력
plt.show()

댓글