Гистограмма с закругленными углами в Matplotlib? - PullRequest
1 голос
/ 17 октября 2019

Как я могу создать гистограмму с закругленными углами, как показано на этом рисунке? Можно ли это сделать с помощью matplotlib?

bar chart with rounded corners

1 Ответ

3 голосов
/ 17 октября 2019

Похоже, что нет возможности напрямую добавить закругленные углы к гистограмме. Но matplotlib предоставляет класс FancyBboxPatch, демоверсия которого доступна здесь .

Итак, чтобы создать график, подобный показанному в вопросе, мы могли бы сначаласделать простую горизонтальную гистограмму:

import pandas as pd
import numpy as np
# make up some example data
np.random.seed(0)
df = pd.DataFrame(np.random.uniform(0,20, size=(4,4)))
df = df.div(df.sum(1), axis=0)
# plot a stacked horizontal bar chart
ax = df.plot.barh(stacked=True, width=0.98, legend=False)
ax.figure.set_size_inches(6,6)

Это дает следующий график:

a plot with regular rectangles

Чтобы прямоугольники имелизакругленные углы мы могли бы пройти через каждый прямоугольник в ax.patches и заменить его на FancyBboxPatch. Этот новый модный патч с закругленными углами копирует местоположение и цвет старого патча, так что нам не нужно беспокоиться о размещении.

from matplotlib.patches import FancyBboxPatch
ax = df.plot.barh(stacked=True, width=1, legend=False)
ax.figure.set_size_inches(6,6)
new_patches = []
for patch in reversed(ax.patches):
    bb = patch.get_bbox()
    color=patch.get_facecolor()
    p_bbox = FancyBboxPatch((bb.xmin, bb.ymin),
                        abs(bb.width), abs(bb.height),
                        boxstyle="round,pad=-0.0040,rounding_size=0.015",
                        ec="none", fc=color,
                        mutation_aspect=4
                        )
    patch.remove()
    new_patches.append(p_bbox)
for patch in new_patches:
    ax.add_patch(patch)

Это то, что мы получаем тогда:

plot with rounded rectangles

Я дал ящикам отрицательный отступ, так что между ними есть промежуткибары. Числа немного чёрной магии. Понятия не имею, для чего предназначен аппарат rounding_size и pad. mutation_aspect показано в последнем демонстрационном примере, здесь я установил его на 4, потому что диапазон y равен приблизительно 4, а диапазон x равен приблизительно 1.

...