Документация 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, особенно для построения только нескольких баров. Но упаковка его в функцию / модуль и повторное использование решает эту проблему. :)