matplotlib로 그래프 그리기¶
모듈¶
In [1]:
import matplotlib.pyplot as plt # conda install matplotlib도 가능
In [2]:
import numpy as np
선 그래프¶
기본적인 선 그래프 그리기¶
- 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]:
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]:
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()
여러 그래프 그리기¶
- plt.figure()
- 새로운 그래프 창을 생성
- 이후의 plot()은 새로운 그래프 창에 그려짐
In [11]:
plt.plot(x, y1) # 처음 그리기 함수를 수행하면 그래프 창이 자동으로 생성됨
plt.figure() # 새로운 그래프 창을 생성함
plt.plot(x, y2) # 새롭게 생성된 그래프 창에 그래프를 그림
plt.show()
- 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()
하나의 그래프 창을 분할하여 사용하기¶
- 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()
출력 범위 지정하기¶
- plt.xlim(xmin, xmax) # x축의 좌표 범위 지정
- plt.ylim(ymin, ymax) # y축의 좌표 범위 지정
현재 출력 범위 얻기¶
- [xmin, xmax] = plt.xlim()
- [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() # 출력 범위 지정
- 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() # 혼합
- plt.xlabel(문자열)
- plt.ylabel(문자열)
- plt.title(문자열)
- 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()'도 가능
범례¶
- plt.legend(['str1', 'str2', … ]) # 범례
- 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)
문자열¶
- 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()
산점도¶
산점도¶
- 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()
'인터페이스 개발 > Python' 카테고리의 다른 글
Python - 파일[예제] - Database Application (0) | 2020.07.29 |
---|---|
Python - 파일[데이터베이스] - MySQL/MariaDB, 테이블 생성, 데이터 삽입, 테이블 조회, 수정 및 삭제 (0) | 2020.07.29 |
Python - [추가] - 배열 데이터를 효과적으로 다루는 NumPy (0) | 2020.07.28 |
Python - 고급 문법[데코레이터] - 일급 시민, 지역 함수, 함수 데코레이터, 클래스 데코레이터 (0) | 2020.07.28 |
Python - 고급 문법[반복자] - 열거 가능 객체, 제너레이터 (0) | 2020.07.28 |
댓글