Недавно я опубликовал этот вопрос о создании границы и контроле местоположений меток.У @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()
