Как убрать пустое пространство невидимых осей в matplotlib во время активного графика? - PullRequest
0 голосов
/ 28 мая 2018

Я хочу полностью удалить пустое пространство вокруг моих осей во время активного графика (не save_fig, как просили другие).Здесь мы не можем использовать bbox_inches='tight'.Я могу использовать тесную связь (pad = 0).Когда ось включена, она работает нормально, показывает все метки и метки xy.visible axes Однако в некоторых случаях я отключаю ось.Я ожидал увидеть, как содержимое расширяется, чтобы заполнить пустое пространство, где находятся оси.Однако это не работает.Это все еще сохраняет отступы, поскольку все еще есть метки xy и оси.invisible axes Как удалить пустое пространство объектов невидимых осей?expected result edit:

Я знаю, что могу использовать ax.set_yticks([]) и ax.set_xticks([]), чтобы отключить их.Но это неуклюжий, я должен помнить галочки, прежде чем я их очистить.И если я уберу, то добавлю эти галочки.Галочки больше не могут автоматически обновляться.Интересно, есть ли более простой способ сделать это?

Мы все еще можем видеть небольшой интервал между границами даже после удаления всех тиков.Если кто-то может придумать способ удалить это тоже.Это будет фантастически.

Я бы тоже хотел сохранить название, если оно есть.Таким образом, жестко запрограммированный ax.set_position([0,0,1,x]) не очень хорош для этого использования.Конечно, мы все еще можем попытаться получить верхний интервал, когда есть заголовок, но если кто-то может предоставить более прямой / простой способ справиться с этим, он будет предпочтительным.

Пример кода:

def demo_tight_layout(w=10, h=6, axisoff=False, removeticks=False):

    fig,ax = plt.subplots()
    fig.set_facecolor((0.8, 0.8, 0.8))
    rect = patches.Rectangle((-w/2, -h/2), w, h, color='#00ffff', alpha=0.5)
    ax.add_patch(rect)
    ax.plot([-w/2,w/2], [-h/2,h/2])
    ax.plot([-w/2,w/2], [h/2,-h/2])
    ax.set_ylabel("ylabel")
    ax.margins(0)
    _texts = []
    if axisoff:
        ax.set_axis_off()
        _texts.append("axisoff")
    if removeticks:
        ax.set_xticks([])
        ax.set_yticks([])
        ax.set_ylabel("")
        _texts.append("removeticks")
    fig.text(0.5, 0.6, " ".join(_texts))

    fig.tight_layout(pad=0)
    plt.show()
    return fig, ax, text

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Вы можете настроить параметры подзаговора в зависимости от того, выключили вы ось или нет.

import matplotlib.pyplot as plt
from matplotlib import patches

def demo_tight_layout(w=10, h=6, axisoff=False):

    fig,ax = plt.subplots()
    fig.set_facecolor((0.8, 0.8, 0.8))
    rect = patches.Rectangle((-w/2, -h/2), w, h, color='#00ffff', alpha=0.5)
    ax.add_patch(rect)
    ax.plot([-w/2,w/2], [-h/2,h/2])
    ax.plot([-w/2,w/2], [h/2,-h/2])
    ax.set_ylabel("ylabel")
    ax.margins(0)
    _texts = []

    fig.tight_layout()
    if axisoff:
        ax.set_axis_off()
        _texts.append("axisoff")
        params = dict(bottom=0, left=0, right=1)
        if ax.get_title() == "":
            params.update(top=1)
        fig.subplots_adjust(**params)

    fig.text(0.5, 0.6, " ".join(_texts))

    plt.show()

Теперь demo_tight_layout(axisoff=True) производит

enter image description here

и demo_tight_layout(axisoff=False) производит

enter image description here

0 голосов
/ 28 мая 2018

Вам необходимо установить положение осей, чтобы заполнить фигуру.Если вы создаете свою фигуру и график с помощью

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.gca()
ax.plot(some_x_data, some_y_data)

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

ax.set_position([0, 0, 1, 1], which='both')

Это устанавливает местоположение осей относительно фигурыразмер следующим образом:

[left, bottom, width, height]

Чтобы полностью заполнить фигуру, используйте [0, 0, 1, 1], как показано выше.

Итак, взяв код, он должен выглядеть следующим образом (используя fill_figurebool для проверки):

def demo_tight_layout(w=10, h=6, axisoff=False, removeticks=False, fill_figure=False):

    fig,ax = plt.subplots()
    fig.set_facecolor((0.8, 0.8, 0.8))
    rect = patches.Rectangle((-w/2, -h/2), w, h, color='#00ffff', alpha=0.5)
    ax.add_patch(rect)
    ax.plot([-w/2,w/2], [-h/2,h/2])
    ax.plot([-w/2,w/2], [h/2,-h/2])
    ax.set_ylabel("ylabel")
    ax.margins(0)
    _texts = []
    if axisoff:
        ax.set_axis_off()
        _texts.append("axisoff")
    if removeticks:
        ax.set_xticks([])
        ax.set_yticks([])
        ax.set_ylabel("")
        _texts.append("removeticks")
    fig.text(0.5, 0.6, " ".join(_texts))

    fig.tight_layout(pad=0)
    if fill_figure:
        ax.set_position([0, 0, 1, 1], which='both')
    plt.show()
    return fig, ax, text

ax.set_position должно быть после fig.tight_layout.Если нужен заголовок фигуры, прямого способа сделать это не существует.Этого, к несчастью, не избежать.Вам необходимо настроить параметры height вручную, чтобы заголовок соответствовал рисунку, например с помощью:

ax.set_position([0, 0, 1, .9], which='both')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...