Matplotlib의 글꼴 #

Matplotlib는 텍스트 엔진과 함께 작동하려면 글꼴이 필요하며 그 중 일부는 설치와 함께 제공됩니다. 기본 글꼴은 대부분의 유럽 쓰기 시스템을 지원하는 DejaVu Sans 입니다. 그러나 사용자는 기본 글꼴을 구성하고 고유한 사용자 지정 글꼴을 제공할 수 있습니다. 자세한 내용은 텍스트 속성 사용자 지정 을 참조하고 특히 DejaVu Sans에서 지원하지 않는 글리프에 대한 비라틴 글리프가 있는 텍스트 를 참조하십시오.

Matplotlib는 텍스트 렌더링을 TeX 엔진( )으로 오프로드하는 옵션도 제공합니다 . LaTeX를 사용한 텍스트 렌더링을usetex=True 참조하십시오 .

PDF 및 PostScript의 글꼴 #

글꼴은 컴퓨팅에서 오랜(때로는 호환되지 않는) 역사를 가지고 있어 서로 다른 유형의 글꼴을 지원하는 서로 다른 플랫폼으로 이어집니다. 실제로 Matplotlib에서 지원하는 3가지 유형의 글꼴 사양이 있습니다(이 가이드의 뒷부분에서 설명하는 pdf의 '핵심 글꼴' 외에도).

글꼴 유형 #

유형 1(PDF)

유형 3(PDF/PS)

트루타입(PDF)

Adobe에서 도입한 가장 오래된 유형 중 하나

소개 측면에서 유형 1과 유사

오늘날 일반적으로 사용되는 이전 유형보다 새로운 유형으로 Apple에서 도입했습니다.

PostScript의 제한된 하위 집합, 문자 문자열은 바이트코드에 있음

완전한 PostScript 언어로 임의의 코드를 포함할 수 있습니다(이론적으로는 래스터화할 때 프랙탈을 렌더링할 수도 있습니다!).

코드를 실행할 수 있는 가상 머신을 포함하십시오!

이 글꼴은 글꼴 힌트를 지원합니다.

글꼴 힌트를 지원하지 않음

힌트 지원(가상 머신에서 "힌트" 처리)

Matplotlib를 통해 하위 집합화되지 않음

외부 모듈 ttconv를 통해 부분 집합화됨

외부 모듈 fonttools를 통해 부분 집합화됨

참고: Adobe는 2023년 1월에 Type 1 글꼴을 사용한 작성 지원을 비활성화할 예정입니다 . 자세한 내용은 여기를 참조하십시오.

Matplotlib가 지원하는 기타 글꼴 사양:

  • 유형 42 글꼴(PS):

  • 오픈타입 글꼴:

    • OpenType은 Adobe와 Microsoft가 공동으로 개발한 디지털 글꼴의 새로운 표준입니다.

    • 일반적으로 훨씬 더 큰 문자 세트를 포함합니다!

    • Matplotlib의 제한된 지원

글꼴 하위 설정 #

PDF 및 PostScript 형식은 파일에 포함된 글꼴을 지원하여 뷰어의 컴퓨터에 설치된 글꼴과 관계없이 텍스트를 미리 래스터화할 필요 없이 디스플레이 프로그램이 텍스트를 올바르게 렌더링할 수 있도록 합니다. 이렇게 하면 출력이 확대되거나 크기가 조정되는 경우 텍스트가 픽셀화되지 않습니다. 그러나 파일에 전체 글꼴을 포함하면 특히 CJK(중국어/일본어/한국어)를 지원하는 글꼴과 같이 글리프가 많은 글꼴의 경우 출력 파일이 커질 수 있습니다.

이 문제에 대한 해결책은 문서에 사용된 글꼴의 하위 집합을 만들고 실제로 사용된 글리프만 포함하는 것입니다. 이것은 벡터 텍스트와 작은 파일 크기를 모두 얻습니다. 필요한 글꼴의 하위 집합을 계산하고 새(축소된) 글꼴을 작성하는 것은 모두 복잡한 문제이므로 Matplotlib는 fontTools 및 공급업체의 ttconv 포크에 의존 합니다.

현재 Type 3, Type 42 및 TrueType 글꼴이 하위 집합입니다. 유형 1 글꼴은 그렇지 않습니다.

핵심 글꼴 #

글꼴을 포함하는 기능 외에도 PostScriptPDF 사양 의 일부로 규정을 준수하는 뷰어가 사용할 수 있도록 해야 하는 14개의 핵심 글꼴이 있습니다. 문서를 이러한 글꼴로만 제한하면 문서에 글꼴 정보를 포함할 필요가 없지만 벡터 텍스트는 계속 표시됩니다.

이것은 매우 가벼운 문서를 생성하는 데 특히 유용합니다.:

# trigger core fonts for PDF backend
plt.rcParams["pdf.use14corefonts"] = True
# trigger core fonts for PS backend
plt.rcParams["ps.useafm"] = True

chars = "AFM ftw!"
fig, ax = plt.subplots()
ax.text(0.5, 0.5, chars)

fig.savefig("AFM_PDF.pdf", format="pdf")
fig.savefig("AFM_PS.ps", format="ps)

SVG의 글꼴 #

rcParams["svg.fonttype"]텍스트는 (기본값: 'path') 에 의해 제어되는 두 가지 방법으로 SVG로 출력할 수 있습니다 .

  • 'path'SVG에서 경로( )로

  • 'none'요소( ) 에 글꼴 스타일을 지정하여 SVG의 문자열로

Matplotlib를 통해 저장할 때 'path'벡터 경로로 사용된 글리프의 경로를 계산하고 이를 출력에 씁니다. 이것의 장점은 SVG가 설치된 글꼴에 관계없이 모든 컴퓨터에서 동일하게 보인다는 것입니다. 그러나 사실 이후에는 텍스트를 편집할 수 없습니다. 반대로 저장 'none'하면 파일 크기가 작아지고 텍스트가 마크업에 직접 나타납니다. 그러나 모양은 SVG 뷰어 및 사용 가능한 글꼴에 따라 다를 수 있습니다.

Agg의 글꼴 #

Agg를 통해 텍스트를 래스터 형식으로 출력하기 위해 Matplotlib는 FreeType 을 사용 합니다. 글리프의 정확한 렌더링은 FreeType 버전 간에 변경되기 때문에 이미지 비교 테스트를 위해 특정 버전을 고정합니다.

Matplotlib이 글꼴을 선택하는 방법 #

내부적으로 Matplotlib에서 글꼴을 사용하는 것은 3단계 프로세스입니다.

  1. FontProperties객체가 생성됨(명시적 또는 암시적으로 )

  2. Matplotlib가 인식하는 가장 가까운 "최고의" 글꼴을 선택하는 데 사용되는 FontProperties객체 를 기반으로 합니다 ( SVG 모드 제외).FontManager'none'

  3. 글꼴 개체에 대한 Python 프록시는 백엔드 코드에서 텍스트를 렌더링하는 데 사용됩니다. 정확한 세부 정보는 를 통해 백엔드에 따라 다릅니다 font_manager.get_font.

"최고의" 글꼴을 선택하는 알고리즘 은 웹 브라우저에서 사용되는 CSS1 사양 에 지정된 알고리즘의 수정된 버전입니다 . 이 알고리즘은 글꼴 패밀리 이름(예: "Arial", "Noto Sans CJK", "Hack", ...), 크기, 스타일 및 두께를 고려합니다. 글꼴에 직접 매핑되는 패밀리 이름 외에도 글꼴 집합 중 하나에 내부적으로 매핑되는 5개의 "일반 글꼴 패밀리 이름"(serif, monospace, fantasy, cursive 및 sans-serif)이 있습니다.

현재 2단계를 수행하기 위한 공용 API 는 단일 글꼴만 찾고 파일 시스템의 글꼴에 대한 절대 경로를 반환하는 FontManager.findfont전역 FontManager인스턴스의 메서드는 모듈 수준에서 별칭으로 지정됩니다 .font_manager.findfont

글꼴 폴백 #

전체 유니코드 공간을 커버하는 글꼴이 없으므로 사용자는 단일 글꼴에서 만족할 수 없는 글리프의 혼합을 요구할 수 있습니다. Figure 내에서 여러 글꼴을 사용하는 것이 가능했지만 별개의 Text인스턴스에서 이전에는 동일한 Text인스턴스에서 여러 글꼴을 사용할 수 없었습니다(웹 브라우저처럼). Matplotlib 3.6부터 Agg, SVG, PDF 및 PS 백엔드는 단일 Text인스턴스에서 여러 글꼴을 통해 "대체"됩니다.

fig, ax = plt.subplots()
ax.text(
    .5, .5, "There are 几个汉字 in between!",
    family=['DejaVu Sans', 'WenQuanYi Zen Hei'],
    ha='center'
)

( 소스 코드 , png )

../../_images/fonts-1.png

문자열 "사이에 几个汉字가 있습니다!" 2개의 글꼴로 렌더링됩니다. #

내부적으로 이것은 FontProperties개체의 "글꼴 모음"을 글꼴 모음 목록으로 설정하여 구현됩니다. (현재) 비공개 API는 발견된 모든 글꼴에 대한 경로 목록을 추출한 다음 모든 글꼴을 ft2font.FT2Font인식하는 단일 개체를 구성합니다. 문자열의 각 글리프는 해당 글리프가 포함된 목록의 첫 번째 글꼴을 사용하여 렌더링됩니다.

이 작업의 대부분은 Google Summer of Code 2021에서 지원하는 Aitik Gupta가 수행했습니다.