파이와 도넛에 라벨 붙이기 #

Matplotlib 베이커리에 오신 것을 환영합니다. 를 통해 파이와 도넛 차트를 만들고 와 로 레이블을 지정하는 방법을 보여줍니다 .pie methodlegendannotations

평소와 같이 가져오기를 정의하는 것으로 시작하고 서브플롯이 있는 그림을 만듭니다. 이제 파이를 먹을 시간입니다. 파이 레시피로 시작하여 데이터와 레이블 목록을 만듭니다.

절대 값을 표시하여 자동 백분율 레이블 지정을 확장 하는 함수를 autopct인수에 제공할 수 있습니다. 상대 데이터와 모든 값의 알려진 합계에서 후자를 다시 계산합니다.

그런 다음 파이를 만들고 나중에 반환된 개체를 저장합니다. 반환된 튜플의 첫 번째 반환된 요소는 웨지 목록입니다. matplotlib.patches.Wedge범례의 핸들로 직접 사용할 수 있는 패치입니다 . 범례의 bbox_to_anchor인수를 사용하여 범례를 원형 외부에 배치할 수 있습니다. 여기서는 위치와 함께 축 좌표를 사용합니다 . 즉, 범례의 왼쪽 중심점은 경계 상자의 왼쪽 중심점에 있으며 축 좌표에서 에서 까지 에 걸쳐 있습니다.(1, 0, 0.5, 1)"center left"(1, 0)(1.5, 1)

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(6, 3), subplot_kw=dict(aspect="equal"))

recipe = ["375 g flour",
          "75 g sugar",
          "250 g butter",
          "300 g berries"]

data = [float(x.split()[0]) for x in recipe]
ingredients = [x.split()[-1] for x in recipe]


def func(pct, allvals):
    absolute = int(np.round(pct/100.*np.sum(allvals)))
    return "{:.1f}%\n({:d} g)".format(pct, absolute)


wedges, texts, autotexts = ax.pie(data, autopct=lambda pct: func(pct, data),
                                  textprops=dict(color="w"))

ax.legend(wedges, ingredients,
          title="Ingredients",
          loc="center left",
          bbox_to_anchor=(1, 0, 0.5, 1))

plt.setp(autotexts, size=8, weight="bold")

ax.set_title("Matplotlib bakery: A pie")

plt.show()
Matplotlib 베이커리: 파이

이제 도넛을 먹을 시간입니다. 도넛 레시피로 시작하여 데이터를 숫자로 변환하고(계란 1개를 50g으로 변환) 파이를 직접 플로팅합니다. 파이? 잠깐만요... 도넛이 될 거에요, 그렇죠? 음, 여기에서 볼 수 있듯이 도넛은 width반지름과 다른 쐐기에 특정 세트가 있는 파이입니다. 쉽게 얻을 수 있습니다. 이것은 wedgeprops인수를 통해 수행됩니다.

그런 다음 쐐기를 통해 레이블을 지정하려고 합니다 annotations. 먼저 공통 속성의 일부 사전을 만들고 나중에 키워드 인수로 전달할 수 있습니다. 그런 다음 모든 웨지를 반복하고 각각에 대해

  • 쐐기 중심의 각도를 계산하고,

  • 그로부터 원주에서 해당 각도에 있는 점의 좌표를 얻습니다.

  • 점이 있는 원의 측면에 따라 텍스트의 수평 정렬을 결정합니다.

  • 주석 화살표가 도넛에서 바깥쪽을 향하도록 얻은 각도로 연결 스타일을 업데이트합니다.

  • 마지막으로 이전에 결정된 모든 매개변수로 주석을 만듭니다.

fig, ax = plt.subplots(figsize=(6, 3), subplot_kw=dict(aspect="equal"))

recipe = ["225 g flour",
          "90 g sugar",
          "1 egg",
          "60 g butter",
          "100 ml milk",
          "1/2 package of yeast"]

data = [225, 90, 50, 60, 100, 5]

wedges, texts = ax.pie(data, wedgeprops=dict(width=0.5), startangle=-40)

bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
kw = dict(arrowprops=dict(arrowstyle="-"),
          bbox=bbox_props, zorder=0, va="center")

for i, p in enumerate(wedges):
    ang = (p.theta2 - p.theta1)/2. + p.theta1
    y = np.sin(np.deg2rad(ang))
    x = np.cos(np.deg2rad(ang))
    horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
    connectionstyle = "angle,angleA=0,angleB={}".format(ang)
    kw["arrowprops"].update({"connectionstyle": connectionstyle})
    ax.annotate(recipe[i], xy=(x, y), xytext=(1.35*np.sign(x), 1.4*y),
                horizontalalignment=horizontalalignment, **kw)

ax.set_title("Matplotlib bakery: A donut")

plt.show()
Matplotlib 베이커리: 도넛

그리고 여기 도넛이 있습니다. 그러나이 레시피를 사용한다면 재료는 약 6 개의 도넛에 충분할 것입니다. 하나의 거대한 도넛을 생산하는 것은 테스트되지 않았으며 주방 오류가 발생할 수 있습니다.

참조

다음 함수, 메서드, 클래스 및 모듈의 사용이 이 예제에 표시됩니다.

Sphinx-Gallery에서 생성한 갤러리