matplotlib로 플로팅하기

시스템 설계 면접 질문 너무 개방적이어서 올바른 준비 방법을 알기가 너무 어렵습니다. 이제 구매 후 Amazon, Microsoft 및 Adobe의 디자인 라운드를 해독할 수 있습니다. 이 책은. 매일 수정 하나 디자인 질문 그리고 나는 당신이 디자인 라운드를 깨뜨릴 수 있다고 약속합니다.

매트플롯립이란?

Python 프로그래밍 언어 및 수치 수학 확장 NumPy에는 라는 자체 플로팅 라이브러리가 있습니다. 매트플롯립. Tkinter, wxPython, Qt 또는 GTK+와 같은 범용 GUI 툴킷을 사용하여 애플리케이션에 플롯을 포함할 수 있는 객체 지향 API를 제공합니다. John D. Hunter는 원래 Matplotlib을 작성했지만 2012년 44세의 나이로 사망했습니다. 그 이후로 많은 다른 사람들이 유지 관리하는 활발한 개발 커뮤니티였습니다.

"그림은 천 단어보다 가치가 있습니다."라고 말했듯이 Python에는 배열의 2D 플로팅을 위한 matplotlib라는 시각화 라이브러리가 있습니다. matplotlib를 사용하면 선, 막대, 산점도, 히스토그램 등과 같은 여러 플롯을 수행할 수 있습니다.

matplotlib는 거대한 라이브러리이며 시행 착오를 통해 올바른 플롯을 얻습니다. 기본 플롯을 생성하는 것은 더 쉬운 일이지만 matplotlib 라이브러리에 대한 명령을 갖는 것은 상당히 어렵습니다.

이 튜토리얼은 이론과 예제가 혼합된 초급에서 중급 수준을 위한 것입니다. 우리는 다음을 다룰 것입니다:

  • 파이플롯과 파이랩
  • matplotlib의 핵심 개념
  • plt.subplots()
  • matplotlib로 배열 시각화하기
  • 팬더와 matplotlib로 플로팅하기

matplotlib가 혼란스러운 이유:

matplotlib 라이브러리에 대한 방대한 문서가 있지만 다음 요인으로 인해 matplotlib를 배우는 것이 쉽지 않습니다.

  • 이미 언급했듯이 라이브러리 자체는 코드 라인이 매우 큽니다.
  • matplotlib에는 여러 인터페이스가 있으며 여러 다른 백엔드와 통합될 수 있습니다. 백엔드는 차트가 내부적으로 구조화되는 방식뿐 아니라 차트가 표시되는 방식도 다룹니다.
  • 문서가 광범위하더라도 구식입니다. 이전 예제는 진화하는 라이브러리와 함께 여전히 떠돌고 있습니다.

예제로 넘어가기 전에 matplotlib 디자인의 핵심 개념을 알아보자.

파이랩:

Pyplot은 MATLAB과 유사한 인터페이스를 얻을 수 있는 Matplotlib 모듈입니다. MATLAB의 장점 중 하나는 전역적으로 적용할 수 있다는 것입니다. Python과 달리 가져오기는 MATLAB에서 많이 사용되지 않습니다. MATLAB의 대부분의 기능은 최상위 수준의 사용자가 쉽게 사용할 수 있습니다.

Pylab은 matplotlib 및 NumPy의 클래스와 기능을 함께 제공합니다. import를 많이 사용할 필요가 없기 때문에 MATLAB에 익숙한 사람들은 Pylab에 쉽게 적응할 수 있습니다. 이 한 줄만 추가하면

from pylab import *

이전 MATLAB 사용자는 MATLAB에서와 같이 plot() 또는 array()를 호출할 수 있습니다.

그러나 파이썬 사용자는 import *를 사용하는 것이 모든 것을 네임스페이스로 가져오기 때문에 나쁜 코딩 습관이라는 것을 알고 있습니다. 결과적으로 Python의 내장 기능을 불필요하게 덮어쓰게 될 수 있습니다. 그리고 버그를 찾기가 어려워집니다. 따라서 MATLAB은 자습서에서 import *를 사용하지 말 것을 권장합니다. 가져오기 대신 %matplotlib를 사용하여 IPython을 통합해야 합니다.

Pylab 소스 코드는 실제로 잠재적으로 충돌할 수 있는 많은 가져오기를 마스킹합니다. 예를 들어 터미널에서 python –pylab을 사용하거나 명령 줄또는 %pylab은 실제로 후드 아래에서 'from pylab import *'를 호출합니다.

matplotlib는 더 이상 pylab을 사용하지 말 것을 명시적으로 권장하지만 여전히 존재합니다. pylab을 사용하는 대신 pyplot을 사용할 수 있습니다. pyplot은 명령 스타일 함수 모음을 사용하여 matplotlib가 MATLAB처럼 작동하도록 합니다.

import matplotlib.pyplot as plt

matplotlib의 계층 구조:

객체 계층은 matplotlib의 주요 개념 중 하나입니다. 이미 다른 matplotlib 튜토리얼을 진행했다면 다음 라인을 보았을 것입니다.

plt.plot([1, 2, 3])

단순한 한 줄 코드처럼 보이지만 실제로는 중첩된 파이썬 객체의 사다리입니다. 각 플롯 아래에는 matplotlib 객체의 구조가 존재합니다.

또한 그림 객체는 모든 플롯 요소에 대한 최상위 컨테이너이며 여러 축을 포함합니다. 축은 축과 다릅니다. 그만큼 XAxis, Yaxis와 같은 여러 개체를 저장하는 개체이며 해당 메서드를 호출하여 플롯을 만들 수 있습니다.

전체 그림에서 Figure는 여러 축을 포함하는 상자 모양의 컨테이너입니다. 계층 구조에는 눈금, 개별 선, 범례 및 텍스트 상자와 같은 작은 개체가 축 아래에 있습니다. 눈금과 레이블에서 바로 차트의 각 요소는 Python 개체입니다.

위의 차트는 matplotlib 계층 구조의 예입니다. 이에 익숙하지 않더라도 걱정할 필요가 없습니다. 튜토리얼에서 다룰 것입니다.

matplotlib가 설치되어 있지 않은 경우 자습서에서 아래 명령을 사용하여 설치합니다.

pip install matplotlib

아래 코드를 실행합니다.

import matplotlib.pyplot as plt

figure,_=plt.subplots()
print(type(figure))

plt.subplots()는 2개의 객체를 포함하는 튜플을 반환합니다. 지금은 튜플의 첫 번째 개체인 Figure 개체에 대해서만 살펴보겠습니다. Figure의 계층 구조를 드릴다운하여 첫 번째 axes 객체의 y축에 대한 첫 번째 눈금을 검색할 수 있습니다.

import matplotlib.pyplot as plt

figure,_=plt.subplots()

# To get first axes of figure
first_axes=figure.axes[0]

# yaxis of first axes object
yaxis=first_axes.yaxis

# first tick of the yaxis of the first axes
first_tick_of_yaxis=yaxis.get_major_ticks()[0]
print(type(first_tick_of_yaxis))

그림에는 Axes 목록이 포함되어 있습니다. 그리고 각 축에는 x축과 y축이 있으며 각각에는 여러 개의 주요 눈금이 있습니다.

import matplotlib.pyplot as plt

figure,_=plt.subplots()

axes=figure.axes
print(type(axes))

matplotlib에서는 이것을 그림 계층 구조가 아닌 그림 해부학이라고 합니다. 공식 matplotlib 문서에서 그림의 해부학적 구조를 찾을 수 있습니다.

Stateful 대 Stateless 접근 방식:

시각화로 이동하기 전에 상태 기반 또는 상태 저장과 상태 비저장 또는 객체 지향 인터페이스의 차이점을 이해해야 합니다.

matplotlib에서 pyplot 모듈을 가져오고 아래 명령을 입력하여 이름을 plt로 지정할 수 있습니다.

import matplotlib.pyplot as plt

pyplot의 모든 기능, 예를 들어 plt.plot()은 기존 그림과 축을 참조합니다. 기존 그림과 축이 없으면 새로 만듭니다. matplotlib 문서에서 언급했듯이 "[With pyplot] 단순 함수는 현재 그림의 현재 축에 플롯 요소(선, 이미지, 텍스트 등)를 추가하는 데 사용됩니다."

상태 저장 인터페이스와 상태 비저장 인터페이스의 차이점:

EX-MATLAB 사용자는 이것을 "plt.plot()은 현재 수치를 암시적으로 추적하는 상태 기반/상태 기계 인터페이스입니다.

  • plt.plot() 및 최상위 수준에서 pyplot의 기타 기능은 상태 저장 인터페이스를 호출합니다. plt.plot()은 현재 Figure와 좌표축을 참조하므로 주어진 시간에 하나의 Figure와 좌표축만 조작할 수 있습니다. 명시적으로 참조할 필요도 없습니다.
  • 객체 지향 접근 방식에서는 위의 작업을 명시적으로 수행하고 객체 참조를 변수로 가져오고 Axes 객체의 메서드를 호출하여 기본 객체를 직접 수정할 수 있습니다. Axes 객체는 플롯 자체를 나타냅니다.

다음은 상태 저장 인터페이스의 예입니다.

plt.plot ()

현재 Axes 객체를 가져오고 있습니다. gca()는 여기에서 메소드가 아닌 함수입니다.

도끼=plt.gca()

pyplot에서 대부분의 함수는 matplotlib.axes.Axes 클래스의 메서드로도 존재합니다. 현재 그림에서 gca 메서드 호출:

gcf().gca(**kwargs)

# matplotlib/pyplot.py
>>> def plot(*args, **kwargs):
...     ax = plt.gca()
...     return ax.plot(*args, **kwargs)

>>> def gca(**kwargs):
...     """This returns current axes of the current figure."""
...     return plt.gcf().gca(**kwargs)

plt.plot()은 현재 Figure의 현재 축을 반환합니다. 상태 저장 인터페이스는 참조하려는 플롯을 암시적으로 추적합니다.

객체 지향 접근 방식에는 해당 getter 및 setter 메서드가 있습니다.

예: ax.set_title(), ax.get_title()

plt.title() 및 gca().set_title()을 호출하면 동일한 작업을 수행합니다. 이것이 하는 일입니다.

  • gca()는 현재 축을 반환합니다.
  • setter 메서드 set_title()은 현재 축의 제목을 설정합니다. 여기서 우리는 어떤 축 객체도 명시적으로 언급하지 않습니다.

마찬가지로 모든 최상위 함수 plt.grid(), plt.ylabels(), plt.legend() 등은 현재 축을 gca()로 할당하는 동일한 구조를 따르고 현재 축의 메서드를 호출합니다.

plt.subplots():

그래프가 복잡해지면 객체 지향 접근 방식이 편리합니다. 이러한 개념을 이해하기 위해 플로팅을 해 보겠습니다.

plt.subplots()를 사용하면 객체 지향에서 단일 축으로 Figure를 만들 수 있습니다. 이것은 객체 지향 접근 방식으로 Figure와 Axes를 생성하는 유일한 장소입니다.

figure,axes=plt.subplots()

plt.sublpots()는 단일 Figure와 단일 AxesSubplot 객체를 반환합니다.

>>> type(figure)
<class 'matplotlib.figure.Figure'>
>>> type(axes)
<class 'matplotlib.axes._subplots.AxesSubplot'>

plt.subplots()를 호출하는 동안 인수를 호출하지 않습니다. 그만큼 기본 인수 nrows=1 및 ncols=1입니다.

AxesSubplot 객체가 있으므로 pyplot의 함수를 호출하는 방식과 유사한 방식으로 해당 메서드를 호출할 수 있습니다.

누적 영역 그래프:

XNUMX개 시계열의 누적 영역 그래프의 예를 살펴보겠습니다.

터미널에 아래 명령을 입력하여 numpy를 설치하십시오.

pip install numpy

아래 코드는 그래프를 생성합니다.

import matplotlib.pyplot as plt
import numpy as np

range=np.arange(50)
rnd=np.random.randint(0,10,size=(3,range.size))
years=1950+range
figure,axes=plt.subplots(figsize=(5,3))
axes.stackplot(years, range + rnd, labels=['Eastasia', 'Eurasia', 'Oceania'])
axes.set_title('Combined debt growth over time')
axes.legend(loc='upper left')
axes.set_ylabel('Total debt')
axes.set_xlim(xmin=years[0],xmax=years[-1])
figure.tight_layout()

plt.show()

위 코드에 대한 설명은 다음과 같습니다.

  • np.arange(50): 다음을 사용하여 길이가 1인 50d 배열을 만듭니다. 숫자 범위 1에서 50에
  • random.randint(): 이 함수는 지정된 모양의 배열을 반환하고 낮은 값에서 높은 값까지의 난수로 채웁니다. 최고 한도는 배타적입니다. 우리의 경우 최저 한계는 0, 최고 한계는 10, 크기는 (3, range.size)입니다. 출력은 2에서 3(포함하지 않음) 사이의 숫자로 채워진 50*0 크기의 10차원 배열입니다.
  • figsize 속성을 사용하여 "인치" 단위로 Figure의 너비와 높이를 지정할 수 있습니다.
  • stackplot(): 서로 로드된 각 부품과 각 부품이 완전한 그림을 만드는 데 어떻게 기여하는지 표시합니다. 다양한 데이터 섹션을 표시하고 파이 차트처럼 작동합니다. x-label, y-label, title이 있어 다양한 부분을 다양한 색상으로 표현할 수 있습니다.
  • set_title(): 이름에서 알 수 있듯이 이 setter 메서드는 제목을 설정합니다.
  • legend(): 그래프의 요소를 설명하는 영역입니다.
  • set_ylabel: y축의 레이블을 표시합니다.
  • set_xlim: x축에 대한 제한을 설정합니다.
  • tight_layout: 지정된 패딩을 제공하기 위해 자동으로 서브플롯의 매개변수를 조정합니다.
  • show: 그래프를 보여줍니다.

여기서 Axes 객체를 변수 축에 저장합니다. 축의 메서드를 직접 호출하여 누적 영역 차트를 만들고 제목을 설정하고 범례를 추가하고 y축의 레이블을 설정합니다. 이것은 객체 지향 접근 방식의 예입니다. 이것은 출력 그래프입니다:

산점도 및 히스토그램:

Figure에 여러 축이 포함된 예를 하나 더 살펴보겠습니다. 여기에서는 이산 균일 분포에서 가져온 두 개의 상관 배열을 플로팅할 것입니다.

import matplotlib.pyplot as plt
import numpy as np

x = np.random.randint(low=1, high=11, size=50)
y = x + np.random.randint(1, 5, size=x.size)
data = np.column_stack((x, y))
figure, (axes1, axes2) = plt.subplots(nrows=1, ncols=2,figsize=(8, 4))
axes1.scatter(x=x, y=y, marker='o', c='r', edgecolor='b')
axes1.set_title('Scatter: x versus y')
axes1.set_xlabel('x')
axes1.set_ylabel('y')
axes2.hist(data, bins=np.arange(data.min(), data.max()),label=('x', 'y'))
axes2.legend(loc=(0.65, 0.8))
axes2.set_title('Frequencies of x and y')
axes2.yaxis.tick_right()
plt.show()

코드는 다음 작업을 수행합니다.

  • 여기에서 단일 그림과 두 개의 축 하위 플롯을 생성하는 subplots()에 매개변수를 전달합니다.
  • 변수 x와 y는 난수로 채워진 1d 배열입니다.
  • 우리는 좌표축 객체를 개별적으로 처리하고 있습니다. 하나의 축 객체로 산점도를 만들고 다른 축 객체로 히스토그램을 생성합니다.
  • tick_right(): 이 함수는 좌표축의 오른쪽에 점을 표시합니다.

상태 저장 방식을 사용하면 두 축 개체를 개별적으로 처리하기가 어렵습니다. 출력 그래프는 다음과 같습니다.

scatter 함수의 marker 인수는 원하는 대로 변경할 수 있는 마커 스타일을 정의합니다. 여기서 마커를 ''로 변경합니다.

axes1.scatter(x=x, y=y, marker='s', c='r', edgecolor='b')

그리고 달러 기호 안에 텍스트를 배치하면 텍스트가 기울임꼴로 변경됩니다.

axes1.set_title('$Scatter$: x versus y')
axes2.set_title('$Frequencies$ $of$ x $and$ y')

출력은 다음과 같습니다.

이전에 보았듯이 Figure 자체에서 좌표축 객체를 얻을 수 있습니다.

>>> figure.axes[0] is axes1 and figure.axes[1] is axes2
True

축 객체의 m*n 그리드:

또한 m*n 그리드에 좌표축 객체를 포함하는 Figure를 생성할 수 있습니다. 그러한 예는 다음과 같습니다.

figure,axes=plt.subplots(nrows=2,ncols=2,figsize=(7,7))

축 유형을 확인하면 더 이상 AxesSubplot이 아닙니다. 대신 numpy 배열입니다.

>>> type(axes)
<class 'numpy.ndarray'>
>>> axes
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x0A4BBAD0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0D44F2B0>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x0D4700F0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x0D4952D0>]],
      dtype=object)
>>> axes.shape
(2, 2)

Numpy 배열은 단지 컨테이너입니다. 각 Axes 객체에서 플로팅 메서드를 호출해야 합니다. 평면화 방법을 사용하여 2d Numpy 배열을 AxesSubplot 유형의 4개 객체로 변환할 수 있습니다.

axes1,axes2,axes3,axes4=axes.flatten()
>>> type(axes1)
<class 'matplotlib.axes._subplots.AxesSubplot'>

이를 수행하는 다른 방법이 있습니다. 그러나 이전 방법은 유연합니다.

((axes1,axes2),(axes3,axes4))=axes

>>> type(axes1)
<class 'matplotlib.axes._subplots.AxesSubplot'>

고급 서브플롯 기능:

예를 들어 서브플롯의 고급 기능을 이해하기 위해 이해합시다. Python 라이브러리 io, urllib 및 tarfile을 사용하여 압축된 tar 아카이브에서 거시적 캘리포니아 주택 데이터를 추출합니다.

import numpy as np
from io import BytesIO
import tarfile
from urllib.request import urlopen

url='https://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.tgz'
bytesio_object=BytesIO(urlopen(url).read())
file_path = 'CaliforniaHousing/cal_housing.data'
with tarfile.open(mode='r', fileobj=bytesio_object) as archive:
    housing = np.loadtxt(archive.extractfile(file_path), delimiter=',')

url 변수는 데이터가 포함된 URL입니다. 위의 코드는 파일에서 데이터를 추출하여 numpy 배열에 저장합니다.

평균 주택의 가치, 해당 지역의 인구, 평균 주택의 나이를 구해 봅시다.

>>> avarage_home_value=housing[:,-1]
>>> population,age=housing[:,[4,7]].T

T 속성은 배열의 전치에 불과합니다.

플롯 내부에 텍스트 상자를 배치하여 "플롯 내 제목"과 같은 역할을 하는 함수를 하나 더 작성해 보겠습니다.

def add_titlebox(axes, text):
    axes.text(.55,.8,text,horizontalalignment='center',
        transform=ax.transAxes,bbox=dict(facecolor='white',alpha=0.6),
        fontsize=12.5)
    return axes

matplotlib의 gridspec 모듈을 사용하여 서브플롯을 사용자 정의할 수 있습니다. pyplot의 subplot2grid()를 사용하여 gridspec 모듈과 상호 작용할 수 있습니다. 이것은 우리가 만들 레이아웃입니다:

여기에 3*2 그리드가 있습니다. ax1은 ax2와 ax3의 높이와 너비의 두 배입니다.

subplot2grid()에 (행, 열)을 인수로 전달합니다. 이 인수는 그리드에서 축 객체의 위치일 뿐입니다.

gridsize=(3,2)
figure=plt.figure(figsize=(12,8))
ax1=plt.subplot2grid(gridsize, (0, 0), colspan=2, rowspan=2)
ax2 = plt.subplot2grid(gridsize, (2, 0))
ax3 = plt.subplot2grid(gridsize, (2, 1))

이제 각 축을 개별적으로 처리할 수 있습니다.

ax1.set_title("Value of home as a function of age of home and population of area")
scatter=ax1.scatter(x=age,y=population,c=average_home_value,cmap='RdYlGn')
plt.colorbar(scatter,ax=ax1,format='$%d')
ax1.set_yscale('log')
ax2.hist(age,bins='auto')
ax3.hist(population,bins='auto',log=True)

add_titlebox(ax2,'Histogram: Age of the home')
add_titlebox(ax3, 'Histogram: Area population (log scl.)')

plt.show()

colorbar 메서드는 플롯에 컬러바를 추가합니다. 축이 아닌 Figure에서 직접 호출됩니다. 평균 홈 값을 ColorMap에 매핑하는 인수로 ax1.scatter()를 사용합니다.

y축을 따라 위아래로 움직여도 색상의 차이는 별로 없습니다. 이는 집의 가치를 결정하는 데 집의 나이가 더 큰 역할을 함을 나타냅니다.

그림:

Figure는 두 가지 방법으로 생성할 수 있습니다.

  • plt.subplots() 호출
  • plt.Figure()를 호출하면 축이 없는 Figure가 생성됩니다. 이것은 자주 사용되지 않습니다.

우리가 새로운 Figure를 생성할 수 있을 때마다 matplotlib는 그것을 메모리에 보관합니다. 우리는 stateful 인터페이스에서 현재 그림과 현재 축의 개념을 보았습니다. 현재 그림과 현재 축은 가장 최근에 생성된 것이며 내장 함수 id()를 사용하여 메모리에 있는 객체의 주소를 표시할 수 있습니다.

>>> figure1,axes1=plt.subplots()

>>> id(figure1)
162617520
>>> id(plt.gcf())
162617520

>>> figure2,axes2=plt.subplots()

>>> id(figure2)
203096944
#plt.gcf() returns the current figure
>>> id(figure2)==id(plt.gcf())
True
>>>

가장 최근에 생성된 Figure가 현재 Figure입니다. 이 두 수치는 모두 메모리에 있으며 각각 해당 ID로 액세스됩니다. MATLAB 스타일과 마찬가지로 인덱싱은 1부터 시작합니다.

>>> plt.get_fignums()
[1, 2]

plt.Figure()를 각 fignum에 매핑하여 그림을 얻을 수 있습니다.

>>> def get_all_figures():
...     return [plt.figure(i) for i in plt.get_fignums()]

>>> get_all_figures()

[<Figure size 640x480 with 1 Axes>,
 <Figure size 640x480 with 1 Axes>]

여러 파일을 열 때 메모리 오류를 방지하려면 파일을 닫아야 합니다. plt.close()는 현재 그림을 닫고 plt.close('all')는 모두를 닫고 plt.close(num)은 그림 번호 num을 닫습니다.

>>> plt.close('all')
>>> get_all_figures()
[]

imshow() 및 matshow():

imshow() 및 matshow() 메서드는 많이 사용되는 메서드입니다. matshow()는 imshow()를 감싸는 래퍼입니다. 숫자 배열을 컬러 그리드로 시각화하는 데 사용됩니다.

Numpy를 사용하여 두 개의 명확한 그리드를 만들어 보겠습니다.

array1=np.diag(np.arange(2,12))[::-1]
array1[np.diag_indices_from(array1[::-1])] = np.arange(2, 12)
array2 = np.arange(array1.size).reshape(array1.shape)

이제 array1과 array2를 이미지 형식으로 나타낼 수 있습니다. 사전 이해를 사용하여 눈금과 모든 축 레이블을 해제하고 결과를 tick_params() 메서드에 전달할 것입니다.

sides=('top','bottom','left','right')
nolabels={s: False for s in sides}
nolabels.update({'label%s' %s:False for s in sides})
>>> nolabels
{'top': False, 'bottom': False, 'left': False, 'right': False, 'labeltop': False, 'labelbottom': False, 
'labelleft': False, 'labelright': False}

이제 다음을 사용하여 그리드를 비활성화할 것입니다. 컨텍스트 관리자 그리고 각 축에서 matshow()를 호출할 것입니다. 마지막으로 기술적으로 새로운 축인 컬러바를 그림 안에 넣을 것입니다.

from mpl_toolkits.axes_grid1.axes_divider import make_axes_locatable

with plt.rc_context(rc={'axes.grid': False}):
    figure, (axes1, axes2) = plt.subplots(1, 2, figsize=(8, 4))
    axes1.matshow(array1)
    image=axes2.matshow(array2,cmap='RdYlGn_r')
    for axes in (axes1,axes2):
        axes.tick_params(axis='both',which='both',**nolabels)
    for i,j in zip(*array1.nonzero()):
        axes1.text(j,i,array1[i,j],color='white',ha='center',va='center')

    divider=make_axes_locatable(axes2)
    cax=divider.append_axes("right",size='5%',pad=0)
    plt.colorbar(image,cax=cax,ax=[axes1,axes2])
    figure.suptitle('Heatmaps with "Axes matshow"',fontsize=16)

    plt.show()

팬더로 플로팅:

팬더는 플로팅 방법과 함께 제공됩니다. 팬더 플로팅 방법은 기존 matplotlib 호출을 둘러싼 래퍼입니다.

예를 들어 Series 및 DataFrame에서 Pandas를 사용하는 plot() 메서드는 plt.plot() 주위의 래퍼일 뿐입니다. plt.plot()이 현재 그림과 축을 암시적으로 참조한다는 것을 이미 알고 있듯이 Pandas도 똑같이 따릅니다. 또 다른 예는 Pandas Dataframe의 인덱스에 날짜가 포함되어 있으면 Pandas가 gcf().autofmt_xdate()를 호출하여 현재 그림을 검색하고 x축도 자동으로 포맷하는 것입니다.

몇 가지 코드 예제를 통해 이러한 개념을 이해합시다. 먼저 pip를 사용하여 pandas를 설치합니다.

pip install pandas
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

series=pd.Series(np.arange(5),index=list('abcde'))
axes=series.plot()

이제 Pandas에서 AxesSubplot을 만들었습니다. 유형을 확인하여 확인하십시오.

>>> type(axes)
<class 'matplotlib.axes._subplots.AxesSubplot'>
>>> id(axes)==id(plt.gca())
True

matplotlib가 있는 팬더:

Pandas의 플로팅 방법과 matplotlib 호출을 혼합할 때 내부 아키텍처를 이해하는 것이 좋습니다. 우리는 우리가 플롯하는 예를 볼 것입니다. media móvil 널리 시청되는 금융 시계열의. 우리는 Pandas 시리즈를 만들고 이에 대해 plot() 메서드를 호출할 것입니다. 그런 다음 matplotlib의 plt.gca()에 의해 생성된 축으로 사용자 정의할 것입니다.

import matplotlib.transforms as mtransforms

url = 'https://fred.stlouisfed.org/graph/fredgraph.csv?id=VIXCLS'
vix = pd.read_csv(url, index_col=0, parse_dates=True, na_values='.',infer_datetime_format=True,squeeze=True).dropna()
mean_average=vix.rolling('90d').mean()
state = pd.cut(mean_average, bins=[-np.inf, 14, 18, 24, np.inf],labels=range(4))
cmap = plt.get_cmap('RdYlGn_r')
mean_average.plot(color='black', linewidth=1.5, marker='', figsize=(8, 4),label='VIX 90d MA')
axes = plt.gca()
axes.set_xlabel('')
axes.set_ylabel('90d moving average: CBOE VIX')
axes.set_title('Volatility Regime State')
axes.grid(False)
axes.legend(loc='upper center')
axes.set_xlim(xmin=mean_average.index[0], xmax=mean_average.index[-1])
trans = mtransforms.blended_transform_factory(axes.transData, axes.transAxes)
for i, color in enumerate(cmap([0.2, 0.4, 0.6, 0.8])):
    axes.fill_between(mean_average.index, 0, 1, where=state==i,facecolor=color, transform=trans)
axes.axhline(vix.mean(), linestyle='dashed', color='xkcd:dark grey',alpha=0.6, label='Full-period mean', marker='')

plt.show()

코드 설명:

  • 읽기 CSV 파일 언급된 URL에서 Pandas 시리즈로 변환하여 변수 vix에 저장합니다.
  • 롤링() 함수는 주로 시계열 데이터에서 사용됩니다. 롤링() 함수를 사용하여 롤링 창 계산을 수행할 수 있습니다. 아주 기본적인 단어로, 우리는 한 번에 n 크기의 창에서 수학 연산을 수행합니다. 창의 크기는 통계 계산에 사용된 관측치의 수를 의미합니다. 창이 크기 n인 경우 한 번에 n개의 연속 값을 의미합니다. 여기서 우리는 각 창에 대해 vix에 대해 평균 연산을 수행하고 있습니다.
  • cut 함수는 데이터를 버킷으로 분할하고 정렬하는 데 사용됩니다.
  • 우리는 plot() 함수를 호출하고 현재 Axes를 명시적으로 참조하고 있습니다.
  • 코드의 두 번째 블록은 state.cmap([0.2,04,0.6,0.8])의 각 버킷에 해당하는 색상으로 채워진 블록을 생성합니다. "20, 40, 60, 80번째 '백분위수에 있는 색상의 경우 ' ColorMaps' 스펙트럼을 따라 RGBA 시퀀스를 가져옵니다.” 각 RGBA 색상을 다시 상태로 매핑하려면 enumerate()가 사용됩니다.

추가 주제:

구성 및 스타일링:

matplotlib에서는 균일한 방식으로 다양한 플롯에 스타일을 구성할 수 있습니다. 두 가지 방법이 있습니다.

  • matplotlibrc 파일을 사용자 지정합니다.
  • .py 스크립트에서 또는 대화식으로 구성 매개변수를 변경합니다.

matplotlibrc 파일은 사용자의 맞춤 설정이 포함된 텍스트 파일이며 세션 간에 기억할 수 있습니다.

이전에 언급한 대로 구성 매개변수를 대화식으로 변경할 수도 있습니다. matplotlib.pyplot을 plt로 가져왔으므로 rcParams에 액세스할 수 있습니다.

>>> [attr for attr in dir(plt) if attr.startswith('rc')]
['rc', 'rcParams', 'rcParamsDefault', 'rcParamsOrig', 'rc_context', 'rcdefaults', 'rcsetup']

'rc'로 시작하는 객체는 플롯 설정 및 스타일과 상호 작용하는 수단입니다.

plt.rcdefaults()는 rc 매개변수를 reParamsDefault에 나열된 기본값으로 대체합니다. 이것은 사용자 정의한 모든 항목을 재정의합니다.

plt.rc()는 매개변수를 대화식으로 설정하기 위한 것입니다.

plt.rcParams()는 사전과 유사한 객체입니다. matplotlibrc 파일의 사용자 정의 변경 사항이 여기에 반영됩니다. 이 개체를 직접 변경할 수도 있습니다.

# changing rc
plt.rc('lines', linewidth=2, color='g')

#Changing rcParams
plt.rcParams['lines.linewidth'] = 2
plt.rcParams['lines.color'] = 'r'

사용 가능한 스타일을 보려면:

>>> plt.style.available
['Solarize_Light2', '_classic_test_patch', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot',
 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid',
 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 
 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']

스타일을 설정하려면:

plt.style.use('fivethirtyeight')

대화형 모드:

이미 언급했듯이 matplotlib는 다른 백엔드와 상호 작용합니다. 백엔드는 차트를 렌더링하는 주요 작업을 수행합니다. 일부 백엔드는 대화식이며 변경될 때마다 사용자에게 표시합니다.

다음을 통해 상태를 확인할 수 있습니다.

>>> plt.rcParams['interactive']
False

켜기/끄기로 변경할 수도 있습니다.

>>> plt.ion()
>>> plt.rcParams['interactive']
True
>>> plt.ioff()
>>> plt.rcParams['interactive']
False

이 대화식 모드의 사용법은 다음과 같습니다.

  • 차트를 표시하기 위해 plt.show()를 사용했습니다. 대화형 모드가 켜져 있고 참조할 때 업데이트될 경우 이 기능이 필요하지 않습니다.
  • 대화형 모드가 꺼져 있는 경우 차트를 표시하려면 plt.show()가 필요하고 차트를 업데이트하려면 plt.draw()가 필요합니다.

대화식 모드가 '켜짐'인 예:

plt.ion()
array = np.arange(-4, 5)
array1 = array ** 2
array2 = 10 / (array ** 2 + 1)
figure, axes = plt.subplots()
axes.plot(array, array1, 'rx', array, array2, 'b+', linestyle='solid')
axes.fill_between(array, array1, array2, where=array2>array1, interpolate=True,color='green', alpha=0.3)
legend = axes.legend(['array1', 'array2'], loc='upper center', shadow=True)
legend.get_frame().set_facecolor('#ffb19a')

균열 시스템 설계 인터뷰
Translate »