Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python matplotlib:轴边框和记号标记/标签位置_Python_Python 3.x_Matplotlib - Fatal编程技术网

Python matplotlib:轴边框和记号标记/标签位置

Python matplotlib:轴边框和记号标记/标签位置,python,python-3.x,matplotlib,Python,Python 3.x,Matplotlib,我试图实现的最终结果是在我的绘图周围有一个“更厚”的黑色边界,沿着xmin、xmax、ymin和ymax。我尝试了几种不同的方法(比如在绘图上画一个矩形,见下文),但由于一些原因,我未能达到预期的效果 因为我不能只使用脊椎(我已经将其中的2个设置为始终为0),所以我需要添加一些其他直线或矩形来创建所需的边框 默认情况下,第一个和最后一个记号标签悬在轴上。我通过改变水平或垂直对齐来“克服”这个问题,但是他们仍然可以使用更多的填充。我知道这是可能的,但需要转换,有点笨重 现在我想删除两个轴上的第一个

我试图实现的最终结果是在我的绘图周围有一个“更厚”的黑色边界,沿着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()

您可以通过调用
get{x | y}gridlines()
来访问各个网格线。每个轴网线都是的对象,您可以更改其任何特性


在不改变大部分代码的情况下,您可以将
剪辑设置为
False
,以便显示完整的矩形

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

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


或者,可以使用两个轴。一个包含所有内容和修改的脊椎位置等,另一个只需将脊椎加粗并删除所有其余部分

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

一如既往,这是一个极好的回答。谢谢2个后续问题。首先,我实际上创建了一个图形,嵌入到Tkinter窗口中。鉴于这一事实,我不知道如何将第二个轴添加到同一个绘图/子绘图。如果我指定了
ax2=fig.add_子批(111)
(ax1已经是子批(111)),我会得到一个警告,并且两个轴都不显示。在这种情况下,如何在单个子地块上有两个轴?第二,关于如何轻松填充第一个和最后一个记号标签位置,您有什么想法吗?我只看过一个例子,它不是很清晰。再次感谢。您已经在第一个/最后一个标签上添加了一些填充,对吗?关于子地块,请确保它们有不同的标签,
ax1=fig.add_子地块(111,label=“blablub1”)
ax2=fig.add_子地块(111,label=“blablub2”)
查看文档后,我注意到您可以在已经存在的位置指定一个“重复”轴或子地块,但定义中的某些东西必须是独一无二的。使用不同的
标签**kwarg
来执行此操作似乎是标准的,因此通过指定
ax2=fig.add_子批次(111,label='ax2')
它的工作原理与您的答案所示完全相同。仍然不确定这是否是执行此操作的最佳/正确方法,或者如何处理勾号标签填充问题。我没有向任何勾号标签添加填充,到目前为止,我只是使用
ha='left'
更改了对齐方式,等等,我看到另一个SO帖子,有人在辩护的顶部添加了填充物,在情节边缘和标签之间留出了一些空白,但我现在找不到。我只记得它需要某种特殊的转换。
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()