메모
전체 예제 코드를 다운로드 하려면 여기 를 클릭 하십시오.
플롯의 수명 주기 #
이 튜토리얼은 Matplotlib를 사용하여 단일 시각화의 시작, 중간 및 끝을 보여주는 것을 목표로 합니다. 일부 원시 데이터로 시작하여 사용자 지정 시각화 그림을 저장하여 끝냅니다. 그 과정에서 Matplotlib를 사용하여 몇 가지 깔끔한 기능과 모범 사례를 강조하려고 합니다.
메모
이 튜토리얼은 Chris Moffitt의 훌륭한 블로그 게시물을 기반으로 합니다 . Chris Holdgraf에 의해 이 튜토리얼로 변환되었습니다.
명시적 대 암시적 인터페이스에 대한 참고 사항 #
Matplotlib에는 두 가지 인터페이스가 있습니다. 명시적 인터페이스와 암시적 인터페이스 간의 장단점에 대한 설명은 Matplotlib 애플리케이션 인터페이스(API) 를 참조하십시오 .
명시적 객체 지향(OO) 인터페이스에서 인스턴스를 직접 활용
axes.Axes
하여 인스턴스에서 시각화를 구축합니다
figure.Figure
. pyplot
MATLAB에서 영감을 받아 모델링한 암시적 인터페이스에서는 "현재 축"에 플로팅하기 위해 모듈에 캡슐화된 전역 상태 기반 인터페이스를 사용합니다
. pyplot 인터페이스에 대한 자세한 내용은 pyplot 자습서 를 참조하십시오 .
대부분의 용어는 간단하지만 기억해야 할 주요 사항은 다음과 같습니다.
그림은 하나 이상의 축을 포함할 수 있는 최종 이미지입니다.
축은 개별 플롯을 나타냅니다(플롯의 x/y축을 나타내는 "축"이라는 단어와 혼동하지 마십시오).
우리는 Axes에서 직접 플로팅을 수행하는 메서드를 호출하므로 플롯을 사용자 지정할 때 훨씬 더 유연하고 강력합니다.
메모
일반적으로 플로팅을 위해 암시적 pyplot 인터페이스보다 명시적 인터페이스를 선호합니다.
우리의 데이터 #
이 자습서가 파생된 게시물의 데이터를 사용합니다. 여러 회사의 판매 정보가 포함되어 있습니다.
import numpy as np
import matplotlib.pyplot as plt
data = {'Barton LLC': 109438.50,
'Frami, Hills and Schmidt': 103569.59,
'Fritsch, Russel and Anderson': 112214.71,
'Jerde-Hilpert': 112591.43,
'Keeling LLC': 100934.30,
'Koepp Ltd': 103660.54,
'Kulas Inc': 137351.96,
'Trantow-Barrows': 123381.38,
'White-Trantow': 135841.99,
'Will LLC': 104437.60}
group_data = list(data.values())
group_names = list(data.keys())
group_mean = np.mean(group_data)
시작하기 #
이 데이터는 그룹당 하나의 막대가 있는 막대 그래프로 자연스럽게 시각화됩니다. 객체 지향 접근 방식으로 이를 수행하기 위해 먼저 figure.Figure
및
의 인스턴스를 생성합니다 axes.Axes
. Figure는 캔버스와 같으며 Axes는 특정 시각화를 만들 캔버스의 일부입니다.
메모
그림에는 여러 개의 축이 있을 수 있습니다. 이를 수행하는 방법에 대한 정보는 조밀한 레이아웃 튜토리얼 을 참조하십시오 .
fig, ax = plt.subplots()
이제 Axes 인스턴스가 있으므로 그 위에 플로팅할 수 있습니다.
fig, ax = plt.subplots()
ax.barh(group_names, group_data)
<BarContainer object of 10 artists>
스타일 제어 #
필요에 맞게 시각화를 조정할 수 있도록 Matplotlib에서 사용할 수 있는 다양한 스타일이 있습니다. 스타일 목록을 보려면 를 사용할 수 있습니다
style
.
print(plt.style.available)
['Solarize_Light2', '_classic_test_patch', '_mpl-gallery', '_mpl-gallery-nogrid', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn-v0_8', 'seaborn-v0_8-bright', 'seaborn-v0_8-colorblind', 'seaborn-v0_8-dark', 'seaborn-v0_8-dark-palette', 'seaborn-v0_8-darkgrid', 'seaborn-v0_8-deep', 'seaborn-v0_8-muted', 'seaborn-v0_8-notebook', 'seaborn-v0_8-paper', 'seaborn-v0_8-pastel', 'seaborn-v0_8-poster', 'seaborn-v0_8-talk', 'seaborn-v0_8-ticks', 'seaborn-v0_8-white', 'seaborn-v0_8-whitegrid', 'tableau-colorblind10']
다음을 사용하여 스타일을 활성화할 수 있습니다.
plt.style.use('fivethirtyeight')
이제 위의 플롯을 다시 만들어 어떻게 보이는지 살펴보겠습니다.
fig, ax = plt.subplots()
ax.barh(group_names, group_data)
<BarContainer object of 10 artists>
스타일은 색상, 선 너비, 배경 등과 같은 많은 것을 제어합니다.
플롯 사용자 지정 #
이제 우리가 원하는 일반적인 모양의 플롯이 있으므로 인쇄할 준비가 되도록 미세 조정해 보겠습니다. 먼저 레이블이 더 명확하게 표시되도록 x축에서 레이블을 회전해 보겠습니다. axes.Axes.get_xticklabels()
다음 메서드 를 사용하여 이러한 레이블에 액세스할 수 있습니다 .
fig, ax = plt.subplots()
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
여러 항목의 속성을 한 번에 설정하고 싶을 때 이 pyplot.setp()
기능을 사용하면 편리합니다. 이것은 Matplotlib 객체의 목록(또는 많은 목록)을 가져오고 각각의 스타일 요소를 설정하려고 시도합니다.
fig, ax = plt.subplots()
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')
[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]
이렇게 하면 하단의 일부 레이블이 잘린 것 같습니다. 우리는 Matplotlib에게 우리가 생성한 그림의 요소를 위한 공간을 자동으로 만들도록 지시할 수 있습니다. 이를 위해 autolayout
rcParams의 값을 설정합니다. rcParams로 플롯의 스타일, 레이아웃 및 기타 기능을 제어하는 방법에 대한 자세한 내용은
스타일 시트 및 rcParams로 Matplotlib 사용자 지정 을 참조하세요 .
plt.rcParams.update({'figure.autolayout': True})
fig, ax = plt.subplots()
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')
[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]
다음으로 플롯에 레이블을 추가합니다. OO 인터페이스를 사용하여 이를 수행하기 위해 Artist.set()
메소드를 사용하여 이 Axes 객체의 속성을 설정할 수 있습니다.
fig, ax = plt.subplots()
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')
ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company',
title='Company Revenue')
[(-10000.0, 140000.0), Text(0.5, 87.00000000000003, 'Total Revenue'), Text(86.99999999999997, 0.5, 'Company'), Text(0.5, 1.0, 'Company Revenue')]
함수 를 사용하여 이 플롯의 크기를 조정할 수도 있습니다 pyplot.subplots()
. figsize 키워드 인수 로 이를 수행할 수 있습니다 .
메모
NumPy의 인덱싱은 (행, 열) 형식을 따르지만 figsize 키워드 인수는 (너비, 높이) 형식을 따릅니다. 이는 불행하게도 선형 대수와는 다른 시각화의 규칙을 따릅니다.
fig, ax = plt.subplots(figsize=(8, 4))
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')
ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company',
title='Company Revenue')
[(-10000.0, 140000.0), Text(0.5, 86.99999999999997, 'Total Revenue'), Text(86.99999999999997, 0.5, 'Company'), Text(0.5, 1.0, 'Company Revenue')]
레이블의 경우 함수 형식으로 사용자 지정 서식 지정 지침을 지정할 수 있습니다. 아래에서는 정수를 입력으로 받고 문자열을 출력으로 반환하는 함수를 정의합니다. Axis.set_major_formatter
또는
와 함께 사용 Axis.set_minor_formatter
하면 자동으로
ticker.FuncFormatter
클래스를 생성하여 사용합니다.
이 함수의 경우 x
인수는 원래 눈금 레이블이며 pos
눈금 위치입니다. 여기서 만 사용 x
하지만 두 인수가 모두 필요합니다.
def currency(x, pos):
"""The two arguments are the value and tick position"""
if x >= 1e6:
s = '${:1.1f}M'.format(x*1e-6)
else:
s = '${:1.0f}K'.format(x*1e-3)
return s
그런 다음 이 함수를 플롯의 레이블에 적용할 수 있습니다. 이를 위해 xaxis
축의 속성을 사용합니다. 이를 통해 플롯의 특정 축에서 작업을 수행할 수 있습니다.
fig, ax = plt.subplots(figsize=(6, 8))
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')
ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company',
title='Company Revenue')
ax.xaxis.set_major_formatter(currency)
여러 시각화 결합 #
의 동일한 인스턴스에 여러 플롯 요소를 그릴 수 있습니다
axes.Axes
. 이렇게 하려면 축 개체에서 다른 플롯 메서드 중 하나를 호출하기만 하면 됩니다.
fig, ax = plt.subplots(figsize=(8, 8))
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')
# Add a vertical line, here we set the style in the function call
ax.axvline(group_mean, ls='--', color='r')
# Annotate new companies
for group in [3, 5, 8]:
ax.text(145000, group, "New Company", fontsize=10,
verticalalignment="center")
# Now we move our title up since it's getting a little cramped
ax.title.set(y=1.05)
ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company',
title='Company Revenue')
ax.xaxis.set_major_formatter(currency)
ax.set_xticks([0, 25e3, 50e3, 75e3, 100e3, 125e3])
fig.subplots_adjust(right=.1)
plt.show()
플롯 저장 #
이제 플롯의 결과에 만족하므로 디스크에 저장하려고 합니다. Matplotlib에 저장할 수 있는 많은 파일 형식이 있습니다. 사용 가능한 옵션 목록을 보려면 다음을 사용하십시오.
print(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', 'webp': 'WebP Image Format'}
그런 다음 figure.Figure.savefig()
그림을 디스크에 저장하기 위해 사용할 수 있습니다. 아래에 몇 가지 유용한 플래그가 표시되어 있습니다.
transparent=True
형식이 지원하는 경우 저장된 그림의 배경을 투명하게 만듭니다.dpi=80
출력의 해상도(평방인치당 도트 수)를 제어합니다.bbox_inches="tight"
그림의 경계를 플롯에 맞춥니다.
# Uncomment this line to save the figure.
# fig.savefig('sales.png', transparent=False, dpi=80, bbox_inches="tight")
스크립트의 총 실행 시간: (0분 3.918초)