Python

[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

wikidocs.net/book/5011

 

Leave a Reply

error: Content is protected !!