방법 #
진드기가 너무 많은 이유는 무엇이며/또는 순서가 잘못된 이유는 무엇입니까? #
예기치 않은 눈금 동작의 일반적인 원인 중 하나 는 숫자나 datetime 개체 대신 문자열 목록을 전달하는 것입니다 . 이것은 쉼표로 구분된 텍스트 파일을 읽을 때 예고 없이 쉽게 발생할 수 있습니다. Matplotlib는 문자열 목록을 범주형 변수( 범주형 변수 플로팅 )로 취급하고 기본적으로 범주당 하나의 눈금을 표시하고 제공된 순서대로 플로팅합니다.
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(1, 2, constrained_layout=True, figsize=(6, 2))
ax[0].set_title('Ticks seem out of order / misplaced')
x = ['5', '20', '1', '9'] # strings
y = [5, 20, 1, 9]
ax[0].plot(x, y, 'd')
ax[0].tick_params(axis='x', labelcolor='red', labelsize=14)
ax[1].set_title('Many ticks')
x = [str(xx) for xx in np.arange(100)] # strings
y = np.arange(100)
ax[1].plot(x, y)
ax[1].tick_params(axis='x', labelcolor='red', labelsize=14)
해결책은 문자열 목록을 숫자 또는 datetime 개체(종종 또는
)로 변환하는 것입니다.np.asarray(numeric_strings, dtype='float')
np.asarray(datetime_strings, dtype='datetime64[s]')
자세한 내용은 너무 많은 틱 수정 을 참조하십시오 .
그림에서 아티스트의 범위 결정 #
때때로 우리는 아티스트의 범위를 알고 싶을 때가 있습니다. Matplotlib Artist
개체에는 Artist.get_window_extent
일반적으로 아티스트의 범위를 픽셀 단위로 반환하는 메서드가 있습니다. 그러나 일부 아티스트, 특히 텍스트는 범위를 알기 전에 적어도 한 번은 렌더링해야 합니다. Figure.draw_without_rendering
호출하기 전에 호출해야 하는
Matplotlib 제공
get_window_extent
.
숫자가 비어 있는지 확인 #
비어 있음은 실제로 다른 것을 의미할 수 있습니다. 피규어에 아티스트가 포함되어 있나요? 비어 있는 그림이 Axes
여전히 비어 있는 것으로 간주됩니까? 흰색으로 렌더링하면 그림이 비어 있습니까(작가가 있을 수 있지만 그리기 영역 밖에 있거나 투명할 수 있음)?
여기에서는 비어 있음을 다음과 같이 정의합니다. "그림에는 배경 패치를 제외한 아티스트가 포함되어 있지 않습니다." 배경에 대한 예외는 기본적으로 모든 그림에 Rectangle
배경 패치가 포함되어 있기 때문에 필요합니다. 이 정의는 다음을 통해 확인할 수 있습니다.
def is_empty(figure):
"""
Return whether the figure contains no Artists (other than the default
background patch).
"""
contained_artists = figure.get_children()
return len(contained_artists) <= 1
이는 비어 있음을 정의하는 한 가지 방법일 뿐이고 위의 확인이 거의 필요하지 않기 때문에 그림 메서드로 포함하지 않기로 결정했습니다. 일반적으로 그림을 처리하는 사용자나 프로그램은 그림에 무언가를 추가했는지 여부를 알고 있습니다.
그림이 비어 있는지 여부를 확인하는 것은 실제로 그림을 렌더링하고 렌더링된 결과를 조사하는 것 외에는 확실하게 확인할 수 없습니다.
특정 유형의 그림에서 모든 개체 찾기 #
모든 Matplotlib 아티스트( 아티스트 튜토리얼 참조)에는 일부 기준(예: 모든
인스턴스 일치 또는 일부 임의 필터 기능 일치) findobj()
을 충족하는 아티스트에 대해 아티스트를 재귀적으로 검색하는 데 사용할 수 있는 메서드 가 있습니다. Line2D
예를 들어, 다음 스니펫은 그림에서
set_color
속성이 있는 모든 객체를 찾아 객체를 파란색으로 만듭니다.
def myfunc(x):
return hasattr(x, 'set_color')
for o in fig.findobj(myfunc):
o.set_color('blue')
클래스 인스턴스를 필터링할 수도 있습니다.
import matplotlib.text as text
for o in fig.findobj(text.Text):
o.set_fontstyle('italic')
ticklabel이 오프셋을 가지지 않도록 방지 #
기본 포맷터는 오프셋을 사용하여 눈금 레이블의 길이를 줄입니다. 축별로 이 기능을 끄려면:
ax.get_xaxis().get_major_formatter().set_useOffset(False)
설정 rcParams["axes.formatter.useoffset"]
(기본값: True
)하거나 다른 포맷터를 사용하십시오. 자세한 내용 ticker
은 참조하십시오.
투명한 수치 저장 #
이 명령에는 transparentsavefig()
키워드 인수가
있으며, 'True'인 경우 저장할 때 그림과 축 배경을 투명하게 만들지만 화면에 표시된 이미지에는 영향을 주지 않습니다.
예를 들어 완전한 투명도를 원하지 않거나 화면 표시 버전에도 영향을 미치려는 경우와 같이 더 세밀한 제어가 필요한 경우 알파 속성을 직접 설정할 수 있습니다. Figure에는
patchRectangle
라는 인스턴스
가 있고 좌표축에는 patch 라는 Rectangle 인스턴스가 있습니다. 직접 속성( facecolor , edgecolor , linewidth ,
linestyle , alpha )을 설정할 수 있습니다. 예:
fig = plt.figure()
fig.patch.set_alpha(0.5)
ax = fig.add_subplot(111)
ax.patch.set_alpha(0.5)
모든 그림 요소를 투명하게 해야 하는 경우 현재 전역 알파 설정이 없지만 개별 요소에 알파 채널을 설정할 수 있습니다. 예를 들면 다음과 같습니다.
ax.plot(x, y, alpha=0.5)
ax.set_xlabel('volts', alpha=0.5)
여러 플롯을 하나의 pdf 파일에 저장 #
많은 이미지 파일 형식은 파일당 하나의 이미지만 가질 수 있지만 일부 형식은 다중 페이지 파일을 지원합니다. backend_pdf.PdfPages
현재 Matplotlib는 및 backend_pgf.PdfPages
클래스 를 통해 pdf 또는 pgf 백엔드를 사용하여 pdf 파일에 대한 다중 페이지 출력만 제공합니다
.
눈금 레이블을 위한 공간 만들기 #
기본적으로 Matplotlib는 서브플롯 주위에 고정 백분율 여백을 사용합니다. 이로 인해 그림 경계에서 레이블이 겹치거나 잘릴 수 있습니다. 이 문제를 해결하는 방법에는 여러 가지가 있습니다.
Figure.subplots_adjust
/ 를 사용하여 서브플롯 매개변수를 수동으로 조정합니다pyplot.subplots_adjust
.자동 레이아웃 메커니즘 중 하나를 사용합니다.
제한된 레이아웃 ( Constrained Layout Guide )
타이트한 레이아웃 ( 타이트한 레이아웃 가이드 )
플롯 요소의 크기에서 직접 좋은 값을 계산합니다( 서브플롯 조정을 프로그래밍 방식으로 제어 ).
여러 서브플롯에 걸쳐 내 ylabel 정렬 #
여러 서브플롯이 서로 위에 있고 y 데이터의 척도가 다른 경우 여러 서브플롯에서 수직으로 정렬되지 않는 y 레이블을 얻을 수 있으며 이는 매력적이지 않을 수 있습니다. 기본적으로 Matplotlib는 y 틱과 겹치지 않도록 ylabel의 x 위치를 배치합니다. 레이블의 좌표를 지정하여 이 기본 동작을 재정의할 수 있습니다. 아래 예는 왼쪽 서브플롯의 기본 동작과 오른쪽 서브플롯의 수동 설정을 보여줍니다.
플롯 요소의 그리기 순서 제어 #
set_zorder
플롯 요소의 그리기 순서 및 따라서 어떤 요소가 맨 위에 올지는 속성 에 의해 결정됩니다 . 자세한 설명은 Zorder 데모 를 참조하십시오.
플롯의 종횡비를 # 과 같게 만듭니다.
Axes 속성 set_aspect()
은 축의 종횡비를 제어합니다. '자동', '같음' 또는 비율을 제어하는 일부 비율로 설정할 수 있습니다.
ax = fig.add_subplot(111, aspect='equal')
완전한 예는 동일 축 종횡비 를 참조하십시오 .
여러 y축 스케일 그리기 #
자주 요청되는 것은 왼쪽과 오른쪽 y축에 대해 두 개의 눈금을 갖는 것입니다. 이를 사용하여 가능합니다 twinx()
(두 개 이상의 눈금은 현재 지원되지 않지만 위시리스트에 있음). 두 배율 모두 신호를 받지 못하기 때문에 대화식으로 팬 및 확대/축소를 시도할 때 몇 가지 문제가 있지만 이것은 꽤 잘 작동합니다.
접근 방식은 twinx()
(및 그 자매
twiny()
)를 사용하여 2개의 다른 축을 사용 하고 두 번째 축에서 축 직사각형 프레임을 꺼서 첫 번째 축을 가리지 않도록 하고 눈금 위치와 레이블을 원하는 대로 수동으로 설정합니다. matplotlib.ticker
두 축이 독립적이기 때문에 원하는 대로 별도의 포맷터와 로케이터를 사용할 수 있습니다 .
완전한 예는 척도가 다른 도표를 참조하십시오 .
창이 뜨지 않게 이미지 생성하기 #
단순히 를 호출하지 않고 show
그림을 원하는 형식으로 직접 저장합니다.
import matplotlib.pyplot as plt
plt.plot([1, 2, 3])
plt.savefig('myfig.png')
또한보십시오
웹 애플리케이션 내부에서 matplotlib를 실행하는 방법에 대한 정보 는 웹 애플리케이션 서버(Flask)에 포함 합니다.
스레드 작업 #
Matplotlib는 스레드로부터 안전하지 않습니다. 실제로 특정 아티스트에게 영향을 미치는 알려진 경쟁 조건이 있습니다. 따라서 스레드로 작업하는 경우 적절한 잠금을 설정하여 Matplotlib 아티스트에 대한 액세스를 직렬화하는 것은 사용자의 책임입니다.
별도의 스레드에서 별도의 그림으로 작업할 수 있습니다. 그러나 이 경우에는 대부분의 GUI 백엔드 가 메인 스레드에서도 실행 되어야 하므로 비대화형 백엔드 (일반적으로 Agg)를 사용해야 합니다.