matplotlib: назначение разных штрихов для баров - PullRequest
1 голос
/ 24 апреля 2019

У меня есть датафрейм, где для каждого индекса я должен построить два бара (для двух рядов).Следующий код дает вывод в виде:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.DataFrame(np.random.randint(0,20,size=(5, 2)), columns=list('AB'))
fig, ax = plt.subplots()
ax = df.sort_values('B', ascending=True).plot.barh(rot=0,ax=ax,hatch="/")
plt.show()

enter image description here

Я хотел бы назначить отдельную штриховку для каждого бара.Так что, если A имеет штриховку '/', B должен иметь '|'.Какие изменения мне нужно внести в код?

Ответы [ 3 ]

2 голосов
/ 24 апреля 2019

Документация matplotlib предлагает решение. Но мне это не очень нравится, так как он нацелен на установку различного люка на каждый бар.

Но imho в большинстве случаев более уместно установить конкретную штриховку для каждой "категории" бара. Вы можете сделать это, нанося столбцы отдельно с помощью штриховки, или установить штриховки после нанесения. Установка штриховок после прорисовки imho гораздо более гибкая, поэтому мой подход такой:

df = pd.DataFrame(np.random.randint(0,20,size=(5, 2)), columns=list('AB'))
fig, ax = plt.subplots()
ax = df.sort_values('B', ascending=True).plot.barh(rot=0,ax=ax)
# get all bars in the plot
bars = ax.patches
patterns = ['/', '|']  # set hatch patterns in the correct order
hatches = []  # list for hatches in the order of the bars
for h in patterns:  # loop over patterns to create bar-ordered hatches
    for i in range(int(len(bars) / len(patterns))):
        hatches.append(h)
for bar, hatch in zip(bars, hatches):  # loop over bars and hatches to set hatches in correct order
    bar.set_hatch(hatch)
# generate legend. this is important to set explicitly, otherwise no hatches will be shown!
ax.legend()
plt.show()

Преимущества этого решения по сравнению с нанесением графиков отдельно:

  • Вы можете иметь произвольное количество баров
  • работает со сложенными и / или не сложенными барами во всех возможных комбинациях
  • работает с интерфейсом черчения панд

Главным недостатком является дополнительный LOC, особенно для построения только нескольких баров. Но упаковка его в функцию / модуль и повторное использование решает эту проблему. :)

2 голосов
/ 24 апреля 2019

Вы можете построить два бара отдельно:

import numpy as np
import pandas as pd

from matplotlib import pyplot as plt

df = pd.DataFrame(np.random.randint(0, 20, size=(5, 2)), columns=list('AB'))
fig, ax = plt.subplots()

ax.barh(np.arange(0, len(df)), df['A'], height=0.3, hatch='/')
ax.barh(np.arange(0.3, len(df) + 0.3), df['B'], height=0.3, hatch='|')

enter image description here

1 голос
/ 24 апреля 2019

вот тест, который может вам помочь

import numpy as np
import matplotlib.pyplot as plt

df = pd.DataFrame(np.random.randint(0,20,size=(5, 2)), columns=list('AB'))

plt.hist(df['A'], color = 'blue',
            edgecolor = 'red', hatch = '/' , label = 'df.A',orientation = 'horizontal',
            histtype = 'bar')
plt.hist(df['B'],color = 'YELLOW',
            edgecolor = 'GREEN', hatch = 'O' , label = 'df.B',orientation = 'horizontal',
            histtype = 'bar')
plt.legend()
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...