Барбор Seaborn с закругленными углами - PullRequest
3 голосов
/ 03 мая 2020

Я пытаюсь построить несколько баров, но хотел бы контролировать округлость углов. Я попытался следовать ответу, представленному в вопросе стека Гистограмма с закругленными углами в Matplotlib , но, похоже, не смог получить тот же результат. Как я могу получить бары иметь закругленные края с контролем округлости? Также есть ли лучшая альтернатива FancyBboxPatch?

Ниже приведен мой тестируемый код вместе с текущим и желаемым выходом.

Мой код:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.patches import FancyBboxPatch

mydict = {
    'Event': ['Running', 'Swimming', 'Biking', 'Hiking'],
    'Completed': [2, 4, 3, 7],
    'Participants': [10, 20, 35, 10]}

df = pd.DataFrame(mydict).set_index('Event')
df = df.assign(Completion=(df.Completed / df.Participants) * 100)
print(df)

plt.subplots(figsize=(5, 2))

sns.set_color_codes("pastel")
ax = sns.barplot(x=df.Completion, y=df.index, orient='h', joinstyle='bevel')

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)

sns.despine(left=True, bottom=True)
ax.tick_params(axis=u'both', which=u'both', length=0)
plt.tight_layout()
plt.show()

Пример кадра данных:

          Completed  Participants  Completion
Event                                        
Running           2            10   20.000000
Swimming          4            20   20.000000
Biking            3            35    8.571429
Hiking            7            10   70.000000

Токовый выход:

enter image description here

Требуемый выход:

enter image description here

1 Ответ

4 голосов
/ 03 мая 2020

Просто поиграйте немного с параметрами mutation_aspect и rounding_size, имейте в виду, что размеры ваших данных различны. Проверьте BoxStyle и FancyBboxPatch для получения дополнительной информации.

Пример с mutation_aspect==0.2 и rounding_size=2

plt.subplots(figsize=(5, 2))
sns.set_color_codes("pastel")
ax = sns.barplot(x=df.Completion, y=df.index, joinstyle='bevel')

new_patches = []
for patch in reversed(ax.patches):
    # print(bb.xmin, bb.ymin,abs(bb.width), abs(bb.height))
    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=2",
                            ec="none", fc=color,
                            mutation_aspect=0.2
                            )
    patch.remove()
    new_patches.append(p_bbox)

for patch in new_patches:
    ax.add_patch(patch)

sns.despine(left=True, bottom=True)

ax.tick_params(axis=u'both', which=u'both', length=0)
plt.tight_layout()
# plt.savefig("data.png", bbox_inches="tight")
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...