matplotlib:轴边框和刻度线/标签位置

时间:2018-12-20 14:43:21

标签: python python-3.x matplotlib

我试图达到的最终结果是让我的情节周围沿着“ xmin”,“ xmax”,“ ymin”和“ ymax”有一个“厚实的”黑人寄宿生。我尝试了几种不同的方法(例如,仅在绘图上绘制一个矩形,请参见下文),但是由于一些原因,我无法达到预期的效果。

因为我不能只使用刺(我将其中的2根始终设置为0),所以我需要添加一些其他线或矩形以创建所需的边框。

默认情况下,第一个和最后一个刻度标签悬在轴上。我通过更改水平或垂直对齐方式“克服了”这一问题,但是他们仍然可以使用更多的填充。我知道这是可能的,但是需要转换并且有点笨拙。

现在,我想删除两个轴上的第一个和最后一个刻度。这是因为给定绘制矩形的方式,它始终位于绘图区域内,但是第一个和最后一个刻度线始终位于其外部,而不管矩形的厚度如何。使矩形变厚只会使它与第一个和最后一个刻度标签重叠更多,而实际的刻度标记仍保留在矩形外部。

关于如何在始终将轴保持为0、0的同时实现这种边界的任何其他建议都将受到欢迎。那是总体预期结果。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from matplotlib.patches import Rectangle

X = np.random.randint(low=-9, high=9, size=10)
Y = np.random.randint(low=-9, high=9, size=10)

fig, ax = plt.subplots()
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')
patPlotBorder = ax.add_artist(Rectangle((-10, -10), 20, 20, fill=False, color='k', linewidth=2))
ax.grid(True)
fig.set_tight_layout(True)
ax.scatter(X, Y, c="b", marker="o", s=40)
plt.show()

Scatter with Axis at 0, 0 and Border

2 个答案:

答案 0 :(得分:1)

无需更改很多代码,您就可以将clip_on设置为False,以便显示完整的矩形。

border = Rectangle((-10, -10), 20, 20, fill=False, color='k', linewidth=3, clip_on=False)
ax.add_artist(border)

enter image description here

由于网格线显示在轴内容上方,因此矩形边框内有一些灰线。


或者,您可以使用两个轴。一种带有所有内容并修改了脊椎位置等,另一种是仅使脊椎变粗并除去所有其余部分。

import numpy as np
import matplotlib.pyplot as plt

X = np.random.randint(low=-9, high=9, size=10)
Y = np.random.randint(low=-9, high=9, size=10)

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')

ax.grid(True)
fig.set_tight_layout(True)
ax.scatter(X, Y, c="b", marker="o", s=40)
plt.show()

enter image description here

答案 1 :(得分:0)

您可以通过调用get_{x|y}gridlines()来访问各个网格线。每条网格线都是type Line2D的对象,您可以更改其任何属性such as thickness, color, etc

ax.get_xgridlines()[0].set_linewidth(5)
ax.get_xgridlines()[-1].set_linewidth(5)
ax.get_ygridlines()[0].set_linewidth(5)
ax.get_ygridlines()[-1].set_linewidth(5)

enter image description here