[Python] 파이썬 matplotlib 설치 및 사용방법 예제 총정리
파이썬에서 데이터(자료)를 시각화 하기 위해 그래프를 그릴 수 있습니다. 그래프를 그리기 위해서는 matplotlib 모듈을 설치하면 가능합니다. 데이터를 그래프화 함으로 써 데이터에 대한 분석이 가능해지고, 데이터의 패턴을 파악할 수 있습니다.
명령프롬프트(cmd) 창을 열고 pip install matplotlib 명령어를 실행하여 설치합니다. 이미 설치가 되어있는 경우 아래와 같은 설치 로그를 볼 수 있습니다.
Microsoft Windows [Version 10.0.19042.685]
(c) 2020 Microsoft Corporation. All rights reserved.
C:Usersilike>pip install matplotlib
Requirement already satisfied: matplotlib in c:usersilikeappdatalocalprogramspythonpython39libsite-packages (3.3.3)
Requirement already satisfied: kiwisolver>=1.0.1 in c:usersilikeappdatalocalprogramspythonpython39libsite-packages (from matplotlib) (1.3.1)
Requirement already satisfied: python-dateutil>=2.1 in c:usersilikeappdatalocalprogramspythonpython39libsite-packages (from matplotlib) (2.8.1)
Requirement already satisfied: cycler>=0.10 in c:usersilikeappdatalocalprogramspythonpython39libsite-packages (from matplotlib) (0.10.0)
Requirement already satisfied: numpy>=1.15 in c:usersilikeappdatalocalprogramspythonpython39libsite-packages (from matplotlib) (1.19.3)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 in c:usersilikeappdatalocalprogramspythonpython39libsite-packages (from matplotlib) (2.4.7)
Requirement already satisfied: pillow>=6.2.0 in c:usersilikeappdatalocalprogramspythonpython39libsite-packages (from matplotlib) (8.0.1)
Requirement already satisfied: six in c:usersilikeappdataroamingpythonpython39site-packages (from cycler>=0.10->matplotlib) (1.15.0)
Requirement already satisfied: six in c:usersilikeappdataroamingpythonpython39site-packages (from cycler>=0.10->matplotlib) (1.15.0)
WARNING: You are using pip version 20.3.1; however, version 20.3.3 is available.
You should consider upgrading via the 'c:usersilikeappdatalocalprogramspythonpython39python.exe -m pip install --upgrade pip' command.
C:Usersilike>
설치가 완료되었다면 모듈을 import 하여 테스트를 시작해봅니다.
plot()함수가 그래프를 그려주는 함수입니다. show()함수는 GUI기반의 프로그램을 실행시켜 그래프를 보여줍니다.
axis(x-min, x-max, y-min, y-max)함수는 x축과 y축의 범위를 지정할 수 있습니다.
대각선 그래프를 하나 그려봅니다. 하나의 리스트만 가지고 그래프를 그리면, x축은 자동으로 생성해줍니다. y축의 범위가 7까지 보여지게 됩니다. x축은 자동으로 생성해주었음으로 7이 아닙니다.
import numpy as np
import matplotlib.pyplot as pyplot
a = [1, 2, 3, 4, 5, 6, 7]
#a = [x for x in range(0, 20)]
#b = [x*(-2) for x in range(0, 20)]
print(a)
pyplot.plot(a)
pyplot.show()
[실행결과]
[1, 2, 3, 4, 5, 6, 7]
이번에는 x축과 y축의 데이터를 모두 주고 그래프를 그립니다. plot()함수에 값을 하나면 주면 y축 자료로 사용됩니다.
import numpy as np
import matplotlib.pyplot as pyplot
a = [1, 2, 3, 4, 5, 6, 7]
b = [2, 4, 6, 8, 10, 12, 14]
pyplot.plot(a, b)
pyplot.show()
x축과 y축의 데이터의 개수는 동일해야합니다. 그렇지 않으면 ValueError: x and y must have same first dimension, but have shapes (7,) and (5,) 오류가 발생합니다.
Traceback (most recent call last):
File "C:pythonWorkspacemain.py", line 8, in <module>
pyplot.plot(a, b)
File "C:UsersilikeAppDataLocalProgramsPythonPython39libsite-packagesmatplotlibpyplot.py", line 2840, in plot
return gca().plot(
File "C:UsersilikeAppDataLocalProgramsPythonPython39libsite-packagesmatplotlibaxes_axes.py", line 1743, in plot
lines = [*self._get_lines(*args, data=data, **kwargs)]
File "C:UsersilikeAppDataLocalProgramsPythonPython39libsite-packagesmatplotlibaxes_base.py", line 273, in __call__
yield from self._plot_args(this, kwargs)
File "C:UsersilikeAppDataLocalProgramsPythonPython39libsite-packagesmatplotlibaxes_base.py", line 399, in _plot_args
raise ValueError(f"x and y must have same first dimension, but "
ValueError: x and y must have same first dimension, but have shapes (7,) and (5,)
이번에는 axis()함수를 사용하여 x축과 y축의 범위를 지정해봅니다. 인자값으로 튜플자료형이나 리스트 자료형이 와야합니다. x축은 0에서 10까지 , y축은 0에서 30까지 범위를 지정하였습니다. xlim()함수와 ylim()함수를 사용하여 동일하여 axis()함수와 동일한 결과을 얻을 수 있습니다.
import numpy as np
import matplotlib.pyplot as pyplot
a = [1, 2, 3, 4, 5, 6, 7]
b = [1, 8, 10, 12, 14, 20, 22]
pyplot.plot(a, b)
pyplot.axis((0, 10, 0, 30)) #list or tuple
#pyplot.xlim(0, 10)
#pyplot.ylim(0, 30)
pyplot.show()
axis()함수의 인자값 타입을 잘 못 지정하면 TypeError: cannot unpack non-iterable int object
The above exception was the direct cause of the following exception: 오류가 발생합니다.
C:UsersilikeAppDataLocalProgramsPythonPython39python.exe C:/python/Workspace/main.py
C:pythonWorkspacemain.py:7: MatplotlibDeprecationWarning: Passing more than one positional argument to axis() is deprecated and will raise a TypeError two minor releases later.
pyplot.axis(0, 10, 0, 30) #list or tuple
Traceback (most recent call last):
File "C:UsersilikeAppDataLocalProgramsPythonPython39libsite-packagesmatplotlibaxes_base.py", line 1794, in axis
xmin, xmax, ymin, ymax = limits
TypeError: cannot unpack non-iterable int object
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:pythonWorkspacemain.py", line 7, in <module>
pyplot.axis(0, 10, 0, 30) #list or tuple
File "C:UsersilikeAppDataLocalProgramsPythonPython39libsite-packagesmatplotlibpyplot.py", line 2461, in axis
return gca().axis(*args, emit=emit, **kwargs)
File "C:UsersilikeAppDataLocalProgramsPythonPython39libsite-packagesmatplotlibaxes_base.py", line 1796, in axis
raise TypeError('the first argument to axis() must be an '
TypeError: the first argument to axis() must be an interable of the form [xmin, xmax, ymin, ymax]
Process finished with exit code 1
그래프 스타일(style)을 변경하는 방법
지금까지 테스트한 그래프는 기본 그래프로 파란색에 실선이였습니다. 이 그래프의 디폴트값, 즉 기본값은 "b-"입니다.
그래프의 선의 색상과 마크(mark)모양을 변경할 수 있습니다.
구분 | 설명 |
color | b : blue g : green r : red c : cyan m : magenta y : yellow k : black w : white |
line style | - (solid line style) -- (dashed line style) -. (dash-dot line style) : (dotted line style) |
marker style | o (circles marker) + (plus symbols) x (crosses) d (diamond symbols) s (square) ^ (triangle up) p (pentagon marker) h (hexagon1 marker) | vline marker _ hline marker 1 tri_down marker |
import numpy as np
import matplotlib.pyplot as pyplot
a = [1, 2, 3, 4, 5, 6, 7]
b = [1, 8, 10, 12, 14, 20, 22]
pyplot.plot(a, b, 'r-o') #실선
pyplot.plot(a, b, 'r--o') # 끊어진 선
pyplot.axis((0, 10, 0, 30)) #list or tuple
pyplot.show()
import numpy as np
import matplotlib.pyplot as pyplot
a = [1, 2, 3, 4, 5, 6, 7]
b = [1, 8, 10, 12, 14, 20, 22]
pyplot.plot(a, b, 'r-.o') #선점
pyplot.plot(a, b, 'r:o') #점선
pyplot.axis((0, 10, 0, 30)) #list or tuple
pyplot.show()
그래프에 라벨(label) 붙이는 방법
title()함수를 사용하여 그래프의 상단에 제목을 붙입니다. xlabel()함수는 x축, ylabel()함수는 y축에 라벨을 붙일 수 있습니다. text()함수는 지정한 좌표 위치에 라벨을 표기합니다.
import matplotlib
import numpy as np
import matplotlib.pyplot as pyplot
import matplotlib.font_manager as fm
a = ["12.16", "212.17", "12.18", "12.19", "12.21", "12.22", "2020.12.23"]
b = [1, 8, 10, 12, 14, 20, 40]
font_prop = fm.FontProperties(fname="C:/Windows/Fonts/gulim.ttc").get_name()
matplotlib.rc('font', family=font_prop)
#pyplot.plot(a, b, 'r-.o')
pyplot.plot(a, b, 'r')
pyplot.axis((0, 10, 0, 70)) #list or tuple
pyplot.title("LG전자 주가 그래프")
pyplot.ylabel("주가(단위:만)")
pyplot.xlabel("날짜")
pyplot.text(2, 42, "상한가: LG전자, 세계적 자동차 부품업체와 합작사 설립")
pyplot.show()
여러개의 그래프를 그리는 방법
plot()함수를 여러개 사용하거나 하나에 여러개의 그래프 데이터를 입력해주면 됩니다.
import numpy as np
import matplotlib.pyplot as pyplot
a = np.arange(1, 5)
b = np.arange(3, 7)
pyplot.plot(a, b, 'r')
pyplot.plot(a, b**2, 'b-s')
pyplot.plot(a, a**3, 'c:^')
pyplot.show()
그래프가 여러개인경우 그래프를 구분하기위해 label를 사용하여 legend()함수를 호출하면 구분정보를 추가할 수 있습니다.
import numpy as np
import matplotlib.pyplot as pyplot
a = np.arange(1, 5)
b = np.arange(3, 7)
pyplot.plot(a, b, 'r')
pyplot.plot(a, b**2, 'b-s', label="$b^2$")
pyplot.plot(a, a**3, 'c:^', label="let go")
pyplot.legend()
pyplot.show()
matplotlib 그리드 표시하는 방법
그래프에 그리드(Grid, 격자)를 표시하려면 grid()함수값을 True로 설정하면 가능합니다. axis='x'를 설정할 경우 x축( 세로 향)에만 그리드를 표시합니다. axis='y'를 설정하면 y축(가로방향)으로만 그리드를 표시합니다.
import numpy as np
import matplotlib.pyplot as pyplot
a = [1, 2, 3, 4, 5, 6, 7]
b = [1, 8, 10, 12, 14, 20, 22]
pyplot.plot(a, b, 'r-o') #실선
pyplot.axis((0, 10, 0, 30)) #list or tuple
pyplot.grid(True)
#pyplot.grid(True, axis='x')
#pyplot.grid(True, axis='y')
pyplot.show()
이번에는 막대그래프를 그려볼까요?
import numpy as np
import matplotlib.pyplot as pyplot
x = np.arange(1, 5)
y = x*3
pyplot.bar(x, y)
pyplot.show()
matplotlib 한글 폰트 오류처리
한글로 라벨을 표기할 경우 한글 깨짐 현상이 발생합니다. 별도의 설정이 필요합니다.
한글폰트를 지정하기 위해서는 matplotlib의 font_manager 모듈을 import 하여 fontProperties()함수를 사용하여 폰트 경로를 지정합니다. 그리고 난 후 matplotlib.rc()함수에 family폰트로 지정해주면 처리됩니다.
font_prop = fm.FontProperties(fname="C:/Windows/Fonts/gulim.ttc").get_name()
matplotlib.rc('font', family=font_prop)
defalut font 와 폰트 사이즈(font size)를 확인하는 방법
import matplotlib.pyplot
print('# 폰트 사이즈')
print(matplotlib.pyplot.rcParams['font.size'])
print('# 폰트')
print(matplotlib.pyplot.rcParams['font.family'])
컴퓨터에 설치되어 있는 폰트 리스트 가져오기 (font list)
import matplotlib.pyplot as pyplot
import matplotlib.font_manager as fm
font_list = fm.findSystemFonts(fontpaths=None, fontext='ttf')
print(font_list)
[REFERENCE]
matplotlib.org/tutorials/introductory/pyplot.html#sphx-glr-tutorials-introductory-pyplot-py