>  기사  >  백엔드 개발  >  Matplotlib 막대 차트에 그룹 레이블을 추가하는 방법은 무엇입니까?

Matplotlib 막대 차트에 그룹 레이블을 추가하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-19 14:07:02603검색

How to Add Group Labels to Matplotlib Bar Charts?

막대 차트에 그룹 레이블 추가

matplotlib를 사용하여 막대 차트 형태로 데이터를 그릴 때 서로 다른 데이터 그룹을 구별하는 것이 바람직한 경우가 많습니다. 데이터 구조는 다음과 유사할 수 있습니다.

data = {'Room A':
           {'Shelf 1':
               {'Milk': 10,
                'Water': 20},
            'Shelf 2':
               {'Sugar': 5,
                'Honey': 6}
           },
        'Room B':
           {'Shelf 1':
               {'Wheat': 4,
                'Corn': 7},
            'Shelf 2':
               {'Chicken': 2,
                'Cow': 1}
           }
       }

이미지로 표시되는 원하는 출력은 다음과 같습니다.

[레이블이 지정된 그룹이 있는 막대 차트를 보여주는 이미지]

구현 그룹 라벨

matplotlib에 그룹 라벨을 추가하기 위한 내장 솔루션이 없으므로 사용자 정의 구현이 가능합니다. 고안:

#!/usr/bin/env python

from matplotlib import pyplot as plt

def mk_groups(data):
    try:
        newdata = data.items()
    except:
        return

    thisgroup = []
    groups = []
    for key, value in newdata:
        newgroups = mk_groups(value)
        if newgroups is None:
            thisgroup.append((key, value))
        else:
            thisgroup.append((key, len(newgroups[-1])))
            if groups:
                groups = [g + n for n, g in zip(newgroups, groups)]
            else:
                groups = newgroups
    return [thisgroup] + groups

def add_line(ax, xpos, ypos):
    line = plt.Line2D([xpos, xpos], [ypos + .1, ypos],
                      transform=ax.transAxes, color='black')
    line.set_clip_on(False)
    ax.add_line(line)

def label_group_bar(ax, data):
    groups = mk_groups(data)
    xy = groups.pop()
    x, y = zip(*xy)
    ly = len(y)
    xticks = range(1, ly + 1)

    ax.bar(xticks, y, align='center')
    ax.set_xticks(xticks)
    ax.set_xticklabels(x)
    ax.set_xlim(.5, ly + .5)
    ax.yaxis.grid(True)

    scale = 1. / ly
    for pos in xrange(ly + 1):  # change xrange to range for python3
        add_line(ax, pos * scale, -.1)
    ypos = -.2
    while groups:
        group = groups.pop()
        pos = 0
        for label, rpos in group:
            lxpos = (pos + .5 * rpos) * scale
            ax.text(lxpos, ypos, label, ha='center', transform=ax.transAxes)
            add_line(ax, pos * scale, ypos)
            pos += rpos
        add_line(ax, pos * scale, ypos)
        ypos -= .1

if __name__ == '__main__':
    data = {'Room A':
               {'Shelf 1':
                   {'Milk': 10,
                    'Water': 20},
                'Shelf 2':
                   {'Sugar': 5,
                    'Honey': 6}
               },
            'Room B':
               {'Shelf 1':
                   {'Wheat': 4,
                    'Corn': 7},
                'Shelf 2':
                   {'Chicken': 2,
                    'Cow': 1}
               }
           }
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    label_group_bar(ax, data)
    fig.subplots_adjust(bottom=0.3)
    fig.savefig('label_group_bar_example.png')

mk_groups 함수는 데이터를 차트 생성에 적합한 형식으로 변환합니다. add_line은 지정된 위치의 서브플롯에 수직선을 추가하는 역할을 합니다. label_group_bar 함수는 아래에 그룹 레이블이 있는 막대 차트를 생성합니다.

이 구현의 결과는 레이블이 명확하게 지정된 그룹이 있는 막대 차트입니다.

[레이블이 지정된 그룹이 있는 막대 차트를 보여주는 이미지]

위 내용은 Matplotlib 막대 차트에 그룹 레이블을 추가하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.