Как уменьшить плотность штриховки в матплотлибе - PullRequest
9 голосов
/ 20 января 2011

Мне нужно уменьшить плотность люка в баре, сделанном с помощью matplotlib. Способ добавления люков:

kwargs = {'hatch':'|'}
rects2 = ax.bar(theta, day7, width,fill=False, align='edge', alpha=1, **kwargs)

kwargs = {'hatch':'-'}
rects1 = ax.bar(theta, day1, width,fill=False, align='edge', alpha=1, **kwargs)

Я знаю, что вы можете увеличить плотность, добавив в шаблон больше символов, но как вы можете уменьшить плотность?!

1 Ответ

8 голосов
/ 01 июля 2011

Это полный взлом, но он должен работать для вашего сценария.

По сути, вы можете определить новый шаблон штриховки, который становится менее плотным, чем длиннее входная строка. Я пошел вперед и адаптировал шаблон HorizontalHatch для вас (обратите внимание на использование символа подчеркивания):

class CustomHorizontalHatch(matplotlib.hatch.HorizontalHatch):
    def __init__(self, hatch, density):
        char_count = hatch.count('_')
        if char_count > 0:
            self.num_lines = int((1.0 / char_count) * density)
        else:
            self.num_lines = 0
        self.num_vertices = self.num_lines * 2

Затем необходимо добавить его в список доступных образцов штриховки:

matplotlib.hatch._hatch_types.append(CustomHorizontalHatch)

В вашем коде для печати теперь вы можете использовать определенный шаблон:

kwargs = {'hatch':'_'}  # same as '-'
rects2 = ax.bar(theta, day7, width,fill=False, align='edge', alpha=1, **kwargs)

kwargs = {'hatch':'__'}  # less dense version
rects1 = ax.bar(theta, day1, width,fill=False, align='edge', alpha=1, **kwargs)

Имейте в виду, что это не очень элегантное решение и может в любой момент сломаться в будущих версиях. Кроме того, мой код шаблона - это просто быстрый взлом, и вы можете улучшить его. Я наследую от HorizontalHatch, но для большей гибкости вы бы использовали HatchPatternBase.

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