最近,我发布了this question关于创建边框和控制刻度标签位置的信息。 @ImportanceOfBeingErnest有几种控制边框的好方法,但是我留下了刻度标签位置问题。
我能够追踪到我提到的post,有关使用变换来控制刻度标签位置填充(也由@ImportanceOfBeingErnest进行了解释)。我能够实施此解决方案来更改刻度标签的位置,但发现了一个我无法解决的问题。
启动绘图时(使用所需的刻度标签位置),一切看起来都很好(请参见下面的第一个图)。但是,随着数据的更新(这是我的应用程序在用户向数据集中添加新数据时发生的情况),有时刻度标签的位置仍然保留正确的位置(即使用指定的填充),但有时却没有。有时它处于“默认”(未填充)位置,有时它似乎是在错误的方向上填充的,依此类推。实际上,它看起来是相当随机的。请参阅下面的其他数字。
下面是我在完整代码中看到的简单示例。为了使它保持“最小”状态,我正在初始化一个没有数据的绘图,并且第一个和最后一个刻度标签会根据需要进行调整,然后以循环方式将随机的一组点更新到绘图中(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()