성능 #
대화형 모드에서 데이터를 탐색하든 프로그래밍 방식으로 많은 플롯을 저장하든 관계없이 렌더링 성능은 파이프라인에서 어려운 병목 현상이 될 수 있습니다. Matplotlib는 플롯 모양을 약간 변경(설정 가능한 허용 오차로)하는 대신 렌더링 시간을 크게 줄이는 여러 가지 방법을 제공합니다. 렌더링 시간을 줄이는 데 사용할 수 있는 방법은 작성 중인 플롯 유형에 따라 다릅니다.
선분 단순화 #
선 세그먼트가 있는 플롯의 경우(예: 일반적인 선 플롯, 다각형의 윤곽선 등) 렌더링 성능은
rcParams["path.simplify"]
(기본값: True
) 및 rcParams["path.simplify_threshold"]
(기본값: )으로 제어할 수 있으며, 예를 들어 파일
0.111111111111
에서 정의할 수 있습니다 ( 스타일로 Matplotlib 사용자 지정 참조). 파일 에 대한 자세한 내용은 시트 및 rcParams 를 참조하십시오 . (기본값: )은 선 세그먼트가 단순화되었는지 여부를 나타내는 부울입니다.
(기본값: ) 단순화되는 선 세그먼트의 양을 제어합니다. 임계값이 높을수록 렌더링 속도가 빨라집니다.matplotlibrc
matplotlibrc
rcParams["path.simplify"]
True
rcParams["path.simplify_threshold"]
0.111111111111
다음 스크립트는 먼저 단순화 없이 데이터를 표시한 다음 단순화하여 동일한 데이터를 표시합니다. 두 가지 모두와 상호 작용해 보십시오.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
# Setup, and create the data to plot
y = np.random.rand(100000)
y[50000:] *= 2
y[np.geomspace(10, 50000, 400).astype(int)] = -1
mpl.rcParams['path.simplify'] = True
mpl.rcParams['path.simplify_threshold'] = 0.0
plt.plot(y)
plt.show()
mpl.rcParams['path.simplify_threshold'] = 1.0
plt.plot(y)
plt.show()
Matplotlib는 현재 기본적으로 보수적인 단순화 임계값인 1/9
. 다른 값을 사용하도록 기본 설정을 변경하려면 matplotlibrc
파일을 변경하십시오. 또는 사용자는 대화형 플로팅(최대 단순화)을 위한 새로운 스타일과 출판 품질 플로팅(최소 단순화)을 위한 다른 스타일을 생성하고 필요에 따라 활성화할 수 있습니다. 이러한 작업을 수행하는 방법에 대한 지침은 스타일 시트 및 rcParams로 Matplotlib 사용자 지정을 참조하세요
.
단순화는 벡터에 대한 다음 선분의 수직 거리(디스플레이 좌표 공간에서 측정됨)가 매개변수보다 클 때까지 선분을 단일 벡터로 반복적으로 병합하여 작동합니다 path.simplify_threshold
.
메모
버전 2.1에서는 선 세그먼트가 단순화되는 방식과 관련된 변경 사항이 적용되었습니다. 렌더링 시간은 2.1 이전의 이러한 매개변수에 의해 여전히 향상되지만 일부 데이터 종류의 렌더링 시간은 버전 2.1 이상에서 크게 향상됩니다.
마커 서브샘플링 #
선분보다 덜 견고하지만 마커도 단순화할 수 있습니다. 마커 서브샘플링은 속성 Line2D
을 통해 개체 에만 사용할 수 있습니다 . 및 와 같이 구성 매개변수가 전달되는 markevery
곳마다 매개 변수를 사용할 수 있습니다.Line2D
pyplot.plot
Axes.plot
markevery
plt.plot(x, y, markevery=10)
이 markevery
인수는 순진한 서브샘플링 또는 균일한 간격( x 축을 따라) 샘플링 시도를 허용합니다. 자세한 내용은
Markevery 데모
를 참조하십시오.
줄을 더 작은 덩어리로 나누기 #
Agg 백엔드를 사용하는 경우(백엔드 란 무엇입니까?rcParams["agg.path.chunksize"]
참조), (기본값: ) 을 사용할 수 있습니다 . 0
이렇게 하면 사용자가 청크 크기를 지정할 수 있으며 정점이 그 이상인 라인은 여러 라인으로 분할됩니다. , 각각의 agg.path.chunksize
꼭지점은 많지 않습니다. ( agg.path.chunksize
0이 아닌 경우 청킹이 없습니다.) 일부 데이터의 경우 라인을 합리적인 크기로 청크하면 렌더링 시간을 크게 줄일 수 있습니다.
다음 스크립트는 먼저 청크 크기 제한 없이 데이터를 표시한 다음 청크 크기가 10,000인 동일한 데이터를 표시합니다. 그림이 클 때 차이를 가장 잘 볼 수 있습니다. GUI를 최대화한 다음 상호 작용해 보십시오.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['path.simplify_threshold'] = 1.0
# Setup, and create the data to plot
y = np.random.rand(100000)
y[50000:] *= 2
y[np.geomspace(10, 50000, 400).astype(int)] = -1
mpl.rcParams['path.simplify'] = True
mpl.rcParams['agg.path.chunksize'] = 0
plt.plot(y)
plt.show()
mpl.rcParams['agg.path.chunksize'] = 10000
plt.plot(y)
plt.show()
전설 #
좌표축의 기본 범례 동작은 가장 적은 데이터 점을 포함하는 위치를 찾으려고 시도합니다( loc='best'
). 많은 데이터 포인트가 있는 경우 매우 비용이 많이 드는 계산이 될 수 있습니다. 이 경우 특정 위치를 제공할 수 있습니다.
빠른 스타일 사용 #
빠른 스타일을 사용 하여 단순화 및 청킹 매개변수를 합리적인 설정으로 자동 설정하여 많은 양의 데이터 플로팅 속도를 높일 수 있습니다. 다음 코드는 이를 실행합니다.
import matplotlib.style as mplstyle
mplstyle.use('fast')
매우 가볍기 때문에 다른 스타일과 잘 어울립니다. 다른 스타일이 설정을 덮어쓰지 않도록 빠른 스타일이 마지막에 적용되었는지 확인합니다.
mplstyle.use(['dark_background', 'ggplot', 'fast'])