Matplotlib 사용자 정의 단위

Beginner

This tutorial is from open-source community. Access the source code

소개

Matplotlib 는 Python 프로그래밍 언어를 위한 플로팅 라이브러리입니다. Tkinter, wxPython, Qt 또는 GTK 와 같은 범용 GUI 툴킷을 사용하여 애플리케이션에 플롯을 임베딩하기 위한 객체 지향 API 를 제공합니다. Matplotlib 를 사용하면 개발자가 Python 에서 광범위한 정적, 애니메이션 및 대화형 시각화를 만들 수 있습니다.

이 랩에서는 Matplotlib 에서 사용자 정의 단위를 만들고 이러한 사용자 정의 단위를 사용하여 데이터를 플로팅하는 방법을 배우겠습니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단을 클릭하여 Notebook 탭으로 전환하여 실습을 위해 Jupyter Notebook에 액세스하십시오.

때로는 Jupyter Notebook 이 로딩을 완료하는 데 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사는 자동화할 수 없습니다.

학습 중에 문제가 발생하면 언제든지 Labby 에게 문의하십시오. 세션 후 피드백을 제공해주시면 문제를 즉시 해결해 드리겠습니다.

라이브러리 임포트

첫 번째 단계에서는 필요한 라이브러리인 matplotlib.pyplot, numpy, matplotlib.ticker, 그리고 matplotlib.units를 임포트해야 합니다.

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.ticker as ticker
import matplotlib.units as units

사용자 정의 단위 클래스 생성

이 단계에서는 사용자 정의 단위 클래스인 Foo를 생성합니다. 이 클래스는 "단위"에 따라 변환 및 다양한 눈금 형식 지정을 지원합니다. 여기서 "단위"는 단순히 스칼라 변환 계수입니다.

class Foo:
    def __init__(self, val, unit=1.0):
        self.unit = unit
        self._val = val * unit

    def value(self, unit):
        if unit is None:
            unit = self.unit
        return self._val / unit

변환기 클래스 생성

이 단계에서는 변환기 클래스인 FooConverter를 생성합니다. 이 클래스는 axisinfo, convert, 그리고 default_units의 세 가지 정적 메서드를 정의합니다.

class FooConverter(units.ConversionInterface):
    @staticmethod
    def axisinfo(unit, axis):
        """Return the Foo AxisInfo."""
        if unit == 1.0 or unit == 2.0:
            return units.AxisInfo(
                majloc=ticker.IndexLocator(8, 0),
                majfmt=ticker.FormatStrFormatter("VAL: %s"),
                label='foo',
                )

        else:
            return None

    @staticmethod
    def convert(obj, unit, axis):
        """
        Convert *obj* using *unit*.

        If *obj* is a sequence, return the converted sequence.
        """
        if np.iterable(obj):
            return [o.value(unit) for o in obj]
        else:
            return obj.value(unit)

    @staticmethod
    def default_units(x, axis):
        """Return the default unit for *x* or None."""
        if np.iterable(x):
            for thisx in x:
                return thisx.unit
        else:
            return x.unit

사용자 정의 단위 클래스 등록

이 단계에서는 사용자 정의 단위 클래스인 Foo를 변환기 클래스인 FooConverter에 등록합니다.

units.registry[Foo] = FooConverter()

데이터 포인트 생성

이 단계에서는 사용자 정의 단위 클래스인 Foo를 사용하여 몇 개의 데이터 포인트를 생성합니다.

## create some Foos
x = [Foo(val, 1.0) for val in range(0, 50, 2)]
## and some arbitrary y data
y = [i for i in range(len(x))]

플롯 생성

이 단계에서는 두 개의 플롯을 생성합니다. 하나는 사용자 정의 단위를 사용하고 다른 하나는 기본 단위를 사용합니다.

fig, (ax1, ax2) = plt.subplots(1, 2)
fig.suptitle("Custom units")
fig.subplots_adjust(bottom=0.2)

## plot specifying units
ax2.plot(x, y, 'o', xunits=2.0)
ax2.set_title("xunits = 2.0")
plt.setp(ax2.get_xticklabels(), rotation=30, ha='right')

## plot without specifying units; will use the None branch for axisinfo
ax1.plot(x, y)  ## uses default units
ax1.set_title('default units')
plt.setp(ax1.get_xticklabels(), rotation=30, ha='right')

plt.show()

코드 실행

마지막 단계에서는 코드를 실행하여 사용자 정의 단위 플롯을 생성합니다.

요약

이 랩에서는 사용자 정의 단위 클래스와 변환기 클래스를 사용하여 Matplotlib 에서 사용자 정의 단위를 생성하는 방법을 배웠습니다. 그런 다음 사용자 정의 단위와 기본 단위를 사용하는 두 개의 플롯을 생성하여 이러한 사용자 정의 단위의 사용법을 시연했습니다. 사용자 정의 단위는 사용자 정의 스케일링 또는 눈금 형식 지정이 필요한 복잡한 데이터를 처리할 때 유용할 수 있습니다.