import matplotlib.pyplot as pltMatplotlib를 사용한 시각화
이제 파이썬(Python)의 시각화를 위한 Matplotlib 패키지를 자세히 살펴보겠습니다. Matplotlib는 NumPy 배열을 기반으로 구축되었으며 더 광범위한 SciPy 스택과 작동하도록 설계된 다중 플랫폼 데이터 시각화 라이브러리입니다. 이는 원래 IPython 커맨드 라인에서 ’gnuplot’을 통해 대화형 MATLAB 스타일 플로팅을 활성화하기 위한 IPython 패치로 2002년 John Hunter에 의해 고안되었습니다. IPython의 창시자인 Fernando Perez는 당시 박사 학위를 마치기 위해 안간힘을 쓰고 있었고 John에게 몇 달 동안 패치를 검토할 시간이 없을 것이라고 말했습니다. John은 이것을 스스로 시작하기 위한 신호로 삼았고 Matplotlib 패키지가 탄생하여 2003년에 버전 0.1이 출시되었습니다. Matplotlib의 개발을 재정적으로 지원하고 기능을 크게 확장한 우주 망원경 과학 연구소(허블 망원경 뒤에 있는 사람들)가 선택한 플로팅 패키지로 채택되었을 때 초기에 힘을 얻었습니다.
Matplotlib의 가장 중요한 기능 중 하나는 다양한 운영 체제 및 그래픽 백엔드에서 잘 작동하는 능력입니다. Matplotlib는 수십 가지 백엔드와 출력 유형을 지원합니다. 즉, 사용 중인 운영 체제나 원하는 출력 형식에 관계없이 작동할 것으로 기대합니다. 이러한 크로스 플랫폼, 모든 사람을 대상으로 하는 접근 방식은 Matplotlib의 가장 큰 장점 중 하나였습니다. 이는 대규모 사용자 기반으로 이어졌고, 이는 다시 활발한 개발자 기반과 파이썬(Python) 과학 세계 내에서 Matplotlib의 강력한 도구와 편재성을 가져왔습니다.
그러나 최근 몇 년 동안 Matplotlib의 인터페이스와 스타일이 시대에 뒤떨어지기 시작했습니다. R 언어의 ggplot 및 ggvis와 같은 최신 도구와 D3js 및 HTML5 캔버스 기반의 웹 시각화 도구 키트는 Matplotlib를 투박하고 구식으로 만드는 경우가 많습니다. 그럼에도 불구하고 저는 잘 테스트된 크로스 플랫폼 그래픽 엔진으로서 Matplotlib의 강점을 무시할 수 없다고 생각합니다. 최신 Matplotlib 버전을 사용하면 새로운 전역 플로팅 스타일을 비교적 쉽게 설정할 수 있으며(Matplotlib 사용자 정의: 구성 및 스타일 시트 참조) 사람들은 더 깨끗하고 현대적인 API를 통해 Matplotlib를 구동하기 위해 강력한 내부 기능을 기반으로 하는 새로운 패키지를 개발해 왔습니다. 예를 들어 Seaborn(Visualization With에서 논의됨) Seaborn), ggpy, HoloViews, 심지어 Pandas 자체도 Matplotlib API 주변의 래퍼로 사용합니다. 이와 같은 래퍼를 사용하더라도 최종 플롯 출력을 조정하기 위해 Matplotlib의 구문을 자세히 살펴보는 것이 여전히 유용한 경우가 많습니다. 이러한 이유로, 새로운 도구로 인해 커뮤니티가 점차 Matplotlib API를 직접 사용하는 것에서 멀어지더라도 Matplotlib 자체는 데이터 시각화 스택의 중요한 부분으로 남을 것이라고 믿습니다.
Matplotlib 일반 팁
Matplotlib을 사용하여 시각화를 만드는 방법에 대해 자세히 알아보기 전에 패키지 사용에 대해 알아야 할 몇 가지 유용한 사항이 있습니다.
Matplotlib 가져오기
NumPy에 ‘np’ 약어를 사용하고 Pandas에 ‘pd’ 약어를 사용하는 것처럼 Matplotlib 가져오기에 몇 가지 표준 약어를 사용합니다.
plt 인터페이스는 이 책의 이 부분 전체에서 볼 수 있듯이 우리가 가장 자주 사용할 인터페이스입니다.
스타일 설정
우리는 plt.style 지시문을 사용하여 그림에 적합한 미적 스타일을 선택합니다. 여기서는 우리가 만드는 플롯이 클래식 Matplotlib 스타일을 사용하도록 보장하는 클래식 스타일을 설정합니다.
plt.style.use("classic")이 장 전체에서 필요에 따라 이 스타일을 조정할 것입니다. 스타일시트에 대한 자세한 내용은 Matplotlib 사용자 정의: 구성 및 스타일 시트를 참조하세요.
쇼 또는 노쇼? 플롯을 표시하는 방법
볼 수 없는 시각화는 별로 쓸모가 없지만 Matplotlib 플롯을 보는 방법은 상황에 따라 다릅니다. Matplotlib을 가장 잘 활용하는 방법은 사용 방법에 따라 다릅니다. 대략적으로 적용 가능한 세 가지 컨텍스트는 스크립트, IPython 터미널 또는 Jupyter 노트북에서 Matplotlib를 사용하는 것입니다.
스크립트에서 플로팅
스크립트 내에서 Matplotlib를 사용하는 경우 plt.show 함수가 도움이 됩니다. plt.show는 이벤트 루프를 시작하고, 현재 활성화된 모든 Figure 객체를 찾고, 그림을 표시하는 하나 이상의 대화형 창을 엽니다.
예를 들어 다음 내용을 포함하는 myplot.py라는 파일이 있습니다.
``파이썬 # 파일: myplot.py matplotlib.pyplot을 plt로 가져오기 numpy를 np로 가져오기
x = np.linspace(0, 10, 100)
plt.plot(x, np.sin(x)) plt.plot(x, np.cos(x))
plt.show()
그런 다음 커맨드 라인 프롬프트에서 이 스크립트를 실행합니다. 그러면 그림이 표시된 창이 열립니다.
$ 파이썬 myplot.py
`plt.show` 명령은 시스템의 대화형 그래픽 백엔드와 상호 작용해야 하기 때문에 내부적으로 많은 작업을 수행합니다.
이 작업의 세부 사항은 시스템마다, 심지어 설치마다 크게 다를 수 있지만 Matplotlib는 이러한 모든 세부 사항을 사용자에게 숨기기 위해 최선을 다합니다.
한 가지 알아두어야 할 점: `plt.show` 명령은 파이썬(Python) 세션당 *한 번만* 사용해야 하며 스크립트의 맨 끝 부분에서 가장 자주 표시됩니다.
여러 개의 'show' 명령을 사용하면 예측할 수 없는 백엔드 종속 동작이 발생할 수 있으므로 대부분 피해야 합니다.
### IPython 셸에서 플로팅
Matplotlib는 IPython 셸 내에서도 원활하게 작동합니다([IPython: Beyond Normal 파이썬(Python)](01.00-IPython-Beyond-Normal-Python.ipynb) 참조).
Matplotlib 모드를 지정하면 IPython은 Matplotlib와 잘 작동하도록 구축되었습니다.
이 모드를 활성화하려면 `ipython`을 시작한 후 `%matplotlib` 매직 명령을 사용합니다.
``ipython
[1]에서: %matplotlib
matplotlib 백엔드 사용: TkAgg
[2]에서: matplotlib.pyplot을 plt로 가져옵니다.
이 시점에서 plt 플롯 명령을 사용하면 Figure 창이 열리고 추가 명령을 실행하여 플롯을 업데이트합니다. 일부 변경 사항(예: 이미 그려진 선의 속성 수정)은 자동으로 그려지지 않습니다. 강제로 업데이트하려면 plt.draw를 사용하세요. IPython의 Matplotlib 모드에서 plt.show를 사용할 필요는 없습니다.
Jupyter 노트북에서 플로팅
Jupyter Notebook은 설명, 코드, 그래픽, HTML 요소 등을 단일 실행 가능 문서로 결합할 수 있는 브라우저 기반 대화형 데이터 분석 도구입니다(IPython: Beyond Normal 파이썬(Python) 참조).
Jupyter 노트북 내에서 대화형으로 플로팅하는 것은 %matplotlib 명령을 사용하여 수행할 수 있으며 IPython 셸과 비슷한 방식으로 작동합니다. 또한 다음 두 가지 옵션을 통해 노트북에 그래픽을 직접 삽입할 수도 있습니다.
%matplotlib inline은 노트북에 포함된 플롯의 정적 이미지로 연결됩니다.%matplotlib 노트북은 노트북 내에 내장된 대화형 플롯으로 이어집니다.
이 책에서는 일반적으로 그림이 정적 이미지로 렌더링되는 기본값을 고수합니다(이 기본 플로팅 예제의 결과는 다음 그림 참조).
%matplotlib inlineimport numpy as np
x = np.linspace(0, 10, 100)
fig = plt.figure()
plt.plot(x, np.sin(x), "-")
plt.plot(x, np.cos(x), "--");
그림을 파일에 저장하기
Matplotlib의 좋은 기능 중 하나는 그림을 다양한 형식으로 저장할 수 있다는 것입니다. 그림 저장은 savefig 명령을 사용하여 수행합니다. 예를 들어 이전 그림을 PNG 파일로 저장하려면 다음을 실행합니다.
fig.savefig("my_figure.png")이제 현재 작업 디렉터리에 my_Figure.png라는 파일이 있습니다.
!ls -lh my_figure.png-rw-r--r-- 1 jakevdp staff 26K Feb 1 06:15 my_figure.png
우리가 생각하는 내용이 포함되어 있는지 확인하기 위해 IPython Image 개체를 사용하여 이 파일의 내용을 표시해 보겠습니다(다음 그림 참조).
from IPython.display import Image
Image("my_figure.png")
savefig에서 파일 형식은 주어진 파일 이름의 확장자로부터 추론됩니다. 어떤 백엔드를 설치했는지에 따라 다양한 파일 형식을 사용합니다. 그림 캔버스 개체의 다음 방법을 사용하여 시스템에서 지원되는 파일 형식 목록을 찾을 수 있습니다.
fig.canvas.get_supported_filetypes(){'eps': 'Encapsulated Postscript',
'jpg': 'Joint Photographic Experts Group',
'jpeg': 'Joint Photographic Experts Group',
'pdf': 'Portable Document Format',
'pgf': 'PGF code for LaTeX',
'png': 'Portable Network Graphics',
'ps': 'Postscript',
'raw': 'Raw RGBA bitmap',
'rgba': 'Raw RGBA bitmap',
'svg': 'Scalable Vector Graphics',
'svgz': 'Scalable Vector Graphics',
'tif': 'Tagged Image File Format',
'tiff': 'Tagged Image File Format'}
그림을 저장할 때 앞에서 설명한 plt.show 또는 관련 명령을 사용할 필요가 없습니다.
하나의 가격으로 두 개의 인터페이스
Matplotlib의 잠재적으로 혼란스러운 기능은 편리한 MATLAB 스타일 상태 기반 인터페이스와 보다 강력한 객체 지향 인터페이스라는 이중 인터페이스입니다. 여기서는 둘 사이의 차이점을 빠르게 강조하겠습니다.
MATLAB 스타일 인터페이스
Matplotlib는 원래 MATLAB 사용자를 위한 파이썬(Python) 대안으로 고안되었으며 구문의 대부분은 이러한 사실을 반영합니다. MATLAB 스타일 도구는 pyplot(plt) 인터페이스에 포함되어 있습니다. 예를 들어 다음 코드는 MATLAB 사용자에게 매우 친숙해 보일 것입니다(다음 그림은 결과를 보여줍니다).
plt.figure() # create a plot figure
# create the first of two panels and set current axis
plt.subplot(2, 1, 1) # (rows, columns, panel number)
plt.plot(x, np.sin(x))
# create the second panel and set current axis
plt.subplot(2, 1, 2)
plt.plot(x, np.cos(x));
이 인터페이스는 상태 저장이라는 점을 인식하는 것이 중요합니다. 이 인터페이스는 모든 ‘plt’ 명령이 적용되는 “현재” 그림과 축을 추적합니다. plt.gcf(현재 그림 가져오기) 및 plt.gca(현재 축 가져오기) 루틴을 사용하여 이에 대한 참조를 얻을 수 있습니다.
이 상태 저장 인터페이스는 간단한 플롯의 경우 빠르고 편리하지만 문제가 발생하기 쉽습니다. 예를 들어 두 번째 패널이 생성되면 어떻게 돌아가서 첫 번째 패널에 무언가를 추가할 수 있습니까? 이는 MATLAB 스타일 인터페이스 내에서 가능하지만 약간 투박합니다. 다행히 더 좋은 방법이 있습니다.
객체 지향 인터페이스
객체 지향 인터페이스는 이러한 보다 복잡한 상황과 그림을 더 세밀하게 제어하려는 경우에 사용합니다. “활성” 도형이나 축의 일부 개념에 의존하는 대신 객체 지향 인터페이스에서 플로팅 기능은 명시적인 Figure 및 Axes 객체의 방법입니다. 다음 그림에 표시된 대로 이 플롯 스타일을 사용하여 이전 플롯을 다시 생성하려면 다음을 수행합니다.
# First create a grid of plots
# ax will be an array of two Axes objects
fig, ax = plt.subplots(2)
# Call plot() method on the appropriate object
ax[0].plot(x, np.sin(x))
ax[1].plot(x, np.cos(x));
단순한 플롯의 경우 어떤 스타일을 사용할지 선택하는 것은 주로 선호도의 문제이지만 플롯이 더 복잡해짐에 따라 객체 지향 접근 방식이 필요합니다. 다음 장에서는 가장 편리한 방법에 따라 MATLAB 스타일 인터페이스와 객체 지향 인터페이스 사이를 전환해 보겠습니다. 대부분의 경우 차이점은 plt.plot을 ax.plot으로 전환하는 것만큼 작습니다. 그러나 다음 장에서 나올 때 강조할 몇 가지 문제가 있습니다.