matplotlib: местоположение метки не поддерживается последовательно - PullRequest
0 голосов
/ 21 декабря 2018

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

Мне удалось отследить сообщение , которое я упомянул относительно использования преобразования вуправление заполнением местоположения меток тиков (также объясняется @ImportanceOfBeingErnest).Мне удалось реализовать это решение для изменения местоположения меток, но я не смог решить проблему.

При запуске графика (с использованием нужного местоположения меток) все выглядит хорошо (см. первый рис ниже).Но, поскольку данные обновляются (что и происходит в моем приложении, когда пользователь добавляет новые данные в набор данных), иногда местоположение метки галочки остается должным образом (т.е. с указанным заполнением), но иногда нет.Иногда он находится в «по умолчанию» (unpadded) месте, иногда кажется, что он дополняется в неправильном направлении и т. Д. Это на самом деле кажется довольно случайным.См. Дополнительные рисунки ниже.

Ниже приведен простой пример того, что я вижу в своем полном коде.Чтобы сохранить его «минимальным», я инициализирую график без данных, а метки первого и последнего тиков корректируем по желанию, затем обновляю случайный набор точек графика в цикле (4 раза).Как я уже упоминал, иногда это хорошо, иногда нет.

Любая идея, что происходит и как ее решить, чтобы первая и последняя метка тика последовательно вставлялась в область графика, чтобы они не покрывалисьу границы?

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.transforms


def update_data(a):
    X = np.random.randint(low=-9, high=9, size=10)
    Y = np.random.randint(low=-9, high=9, size=10)
    ax.set(xlim=[np.floor(np.min(X) - 1), np.ceil(np.max(X) + 1)], ylim=[np.floor(np.min(Y) - 1), np.ceil(np.max(Y) + 1)])
    ax.scatter(X, Y, c="b", marker="o", s=40)


if __name__ == '__main__':
    plt.ion()

    fig, ax = plt.subplots()
    ax2 = fig.add_subplot(111)
    ax2.patch.set_visible(False)
    ax2.tick_params(left=False, bottom=False, labelleft=False, labelbottom=False)
    for _, sp in ax2.spines.items():
        sp.set_linewidth(3)

    ax.axis([-10, 10, -10, 10])
    ax.spines['left'].set_position('zero')
    ax.spines['bottom'].set_position('zero')
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)

    plt.setp(ax.xaxis.get_majorticklabels()[0], ha='left')
    plt.setp(ax.xaxis.get_majorticklabels()[-1], ha='right')
    plt.setp(ax.yaxis.get_majorticklabels()[0], va='bottom')
    plt.setp(ax.yaxis.get_majorticklabels()[-1], va='top')
    delx = 5 / 72.
    dely = 5 / 72.
    offsetX = matplotlib.transforms.ScaledTranslation(delx, 0, fig.dpi_scale_trans)
    offsetY = matplotlib.transforms.ScaledTranslation(0, dely, fig.dpi_scale_trans)
    ax.xaxis.get_majorticklabels()[0].set_transform(ax.xaxis.get_majorticklabels()[0].get_transform() + offsetX)
    ax.xaxis.get_majorticklabels()[-1].set_transform(ax.xaxis.get_majorticklabels()[-1].get_transform() - offsetX)
    ax.yaxis.get_majorticklabels()[0].set_transform(ax.yaxis.get_majorticklabels()[0].get_transform() + offsetY)
    ax.yaxis.get_majorticklabels()[-1].set_transform(ax.yaxis.get_majorticklabels()[-1].get_transform() - offsetY)

    ax.grid(True)
    fig.set_tight_layout(True)

    ax.scatter([], [], c="b", marker="o", s=40)
    plt.show()
    plt.pause(3)

    for a in range(1, 4):
        update_data(a)
        plt.pause(3)
        plt.draw()

Intended Tick Locations Incorrect Tick Location 1 Incorrect Tick Location 2 Incorrect Tick Location 3

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