Matplotlib 파이 차트 필터

Beginner

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

소개

이 랩에서는 Matplotlib 의 파이 차트를 사용하여 필터링 효과를 사용하는 방법을 시연합니다. pie_demo.py 에서 가져온 파이 차트 그리기 코드를 사용하고 차트에 필터링 효과를 추가할 것입니다. 필터링 효과는 SVG 렌더러가 이를 지원하는 경우에만 유효합니다.

VM 팁

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

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

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

파이 차트 생성

파이 차트를 위해 정사각형 figure 와 axes 를 생성합니다. 차트의 labels 와 fracs 를 정의합니다. 또한 차트 슬라이스에 대한 explode 값을 설정합니다. 마지막으로, 정의된 매개변수를 사용하여 파이 차트를 그립니다.

import matplotlib.pyplot as plt
from matplotlib.patches import Shadow

fig = plt.figure(figsize=(6, 6))
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
fracs = [15, 30, 45, 10]
explode = (0, 0.05, 0, 0)

pies = ax.pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%')

for w in pies[0]:
    w.set_gid(w.get_label())
    w.set_edgecolor("none")

for w in pies[0]:
    s = Shadow(w, -0.01, -0.01)
    s.set_gid(w.get_gid() + "_shadow")
    s.set_zorder(w.get_zorder() - 0.1)
    ax.add_patch(s)

plt.show()

차트를 SVG 로 저장

io 및 xml.etree.ElementTree 모듈을 사용하여 파이 차트를 SVG 파일로 저장합니다. 가우시안 블러 (Gaussian blur) 및 조명 효과를 사용하여 그림자에 대한 필터 정의를 정의합니다. 조명 필터는 http://www.w3.org/TR/SVG/filters.html에서 복사되었습니다. Inkscape 및 Firefox3 를 사용하여 필터를 테스트하지만, Inkscape 의 내보내기가 이를 지원하지 않을 수 있습니다.

import io
import xml.etree.ElementTree as ET

f = io.BytesIO()
plt.savefig(f, format="svg")

filter_def = """
  <defs xmlns='http://www.w3.org/2000/svg'
        xmlns:xlink='http://www.w3.org/1999/xlink'>
    <filter id='dropshadow' height='1.2' width='1.2'>
      <feGaussianBlur result='blur' stdDeviation='2'/>
    </filter>

    <filter id='MyFilter' filterUnits='objectBoundingBox'
            x='0' y='0' width='1' height='1'>
      <feGaussianBlur in='SourceAlpha' stdDeviation='4%' result='blur'/>
      <feOffset in='blur' dx='4%' dy='4%' result='offsetBlur'/>
      <feSpecularLighting in='blur' surfaceScale='5' specularConstant='.75'
           specularExponent='20' lighting-color='#bbbbbb' result='specOut'>
        <fePointLight x='-5000%' y='-10000%' z='20000%'/>
      </feSpecularLighting>
      <feComposite in='specOut' in2='SourceAlpha'
                   operator='in' result='specOut'/>
      <feComposite in='SourceGraphic' in2='specOut' operator='arithmetic'
    k1='0' k2='1' k3='1' k4='0'/>
    </filter>
  </defs>
"""

tree, xmlid = ET.XMLID(f.getvalue())
tree.insert(0, ET.XML(filter_def))

for i, pie_name in enumerate(labels):
    pie = xmlid[pie_name]
    pie.set("filter", 'url(#MyFilter)')

    shadow = xmlid[pie_name + "_shadow"]
    shadow.set("filter", 'url(#dropshadow)')

fn = "svg_filter_pie.svg"
print(f"Saving '{fn}'")
ET.ElementTree(tree).write(fn)

필터링 효과가 적용된 파이 차트 보기

필터링 효과가 적용된 파이 차트를 봅니다. Inkscape 를 사용하여 SVG 파일을 열고 필터링 효과가 적용된 파이 차트를 봅니다.

다른 필터를 사용하여 파이 차트 수정

필터 정의를 변경하여 다른 필터를 사용하여 파이 차트를 수정할 수 있습니다. 다양한 시각적 효과를 얻기 위해 다양한 필터를 실험해 볼 수 있습니다.

filter_def = """
  <defs xmlns='http://www.w3.org/2000/svg'
        xmlns:xlink='http://www.w3.org/1999/xlink'>
    <filter id='dropshadow' height='1.2' width='1.2'>
      <feGaussianBlur result='blur' stdDeviation='2'/>
    </filter>

    <filter id='MyFilter2' filterUnits='objectBoundingBox'
            x='0' y='0' width='1' height='1'>
      <feGaussianBlur in='SourceAlpha' stdDeviation='4%' result='blur'/>
      <feOffset in='blur' dx='4%' dy='4%' result='offsetBlur'/>
      <feSpecularLighting in='blur' surfaceScale='5' specularConstant='.75'
           specularExponent='20' lighting-color='#bbbbbb' result='specOut'>
        <fePointLight x='50%' y='50%' z='5000%'/>
      </feSpecularLighting>
      <feComposite in='specOut' in2='SourceAlpha'
                   operator='in' result='specOut'/>
      <feComposite in='SourceGraphic' in2='specOut' operator='arithmetic'
    k1='0' k2='1' k3='1' k4='0'/>
    </filter>
  </defs>
"""

tree, xmlid = ET.XMLID(f.getvalue())
tree.insert(0, ET.XML(filter_def))

for i, pie_name in enumerate(labels):
    pie = xmlid[pie_name]
    pie.set("filter", 'url(#MyFilter2)')

    shadow = xmlid[pie_name + "_shadow"]
    shadow.set("filter", 'url(#dropshadow)')

fn = "svg_filter_pie2.svg"
print(f"Saving '{fn}'")
ET.ElementTree(tree).write(fn)

요약

이 랩에서는 Matplotlib 의 파이 차트와 함께 필터링 효과를 사용하는 방법을 배웠습니다. 파이 차트를 생성하고 SVG 파일로 저장한 다음 차트에 필터링 효과를 적용했습니다. 또한 다양한 시각적 효과를 얻기 위해 다른 필터를 사용하여 파이 차트를 수정했습니다.