플롯의 수명 주기 #

이 튜토리얼은 Matplotlib를 사용하여 단일 시각화의 시작, 중간 및 끝을 보여주는 것을 목표로 합니다. 일부 원시 데이터로 시작하여 사용자 지정 시각화 그림을 저장하여 끝냅니다. 그 과정에서 Matplotlib를 사용하여 몇 가지 깔끔한 기능과 모범 사례를 강조하려고 합니다.

메모

이 튜토리얼은 Chris Moffitt의 훌륭한 블로그 게시물을 기반으로 합니다 . Chris Holdgraf에 의해 이 튜토리얼로 변환되었습니다.

명시적 대 암시적 인터페이스에 대한 참고 사항 #

Matplotlib에는 두 가지 인터페이스가 있습니다. 명시적 인터페이스와 암시적 인터페이스 간의 장단점에 대한 설명은 Matplotlib 애플리케이션 인터페이스(API) 를 참조하십시오 .

명시적 객체 지향(OO) 인터페이스에서 인스턴스를 직접 활용 axes.Axes하여 인스턴스에서 시각화를 구축합니다 figure.Figure. pyplotMATLAB에서 영감을 받아 모델링한 암시적 인터페이스에서는 "현재 축"에 플로팅하기 위해 모듈에 캡슐화된 전역 상태 기반 인터페이스를 사용합니다 . 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 인스턴스가 있으므로 그 위에 플로팅할 수 있습니다.

수명 주기
<BarContainer object of 10 artists>

스타일 제어 #

필요에 맞게 시각화를 조정할 수 있도록 Matplotlib에서 사용할 수 있는 다양한 스타일이 있습니다. 스타일 목록을 보려면 를 사용할 수 있습니다 style.

['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')

이제 위의 플롯을 다시 만들어 어떻게 보이는지 살펴보겠습니다.

수명 주기
<BarContainer object of 10 artists>

스타일은 색상, 선 너비, 배경 등과 같은 많은 것을 제어합니다.

플롯 사용자 지정 #

이제 우리가 원하는 일반적인 모양의 플롯이 있으므로 인쇄할 준비가 되도록 미세 조정해 보겠습니다. 먼저 레이블이 더 명확하게 표시되도록 x축에서 레이블을 회전해 보겠습니다. axes.Axes.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에게 우리가 생성한 그림의 요소를 위한 공간을 자동으로 만들도록 지시할 수 있습니다. 이를 위해 autolayoutrcParams의 값을 설정합니다. 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에 저장할 수 있는 많은 파일 형식이 있습니다. 사용 가능한 옵션 목록을 보려면 다음을 사용하십시오.

{'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초)

Sphinx-Gallery에서 생성한 갤러리