我在使用 Patches 在 matplotlib 中绘制矩形时遇到问题。当 linewidth
提供给 patch.Rectangle 时,边框将绘制在矩形的外部。这是一个例子:
import matplotlib.pyplot as plt
import matplotlib.patches as patches
fig, ax = plt.subplots(1)
rect = patches.Rectangle((1, 1), 1, 1, facecolor = 'blue')
rect2 = patches.Rectangle((1, 2.1), 1, 1, facecolor = 'none', edgecolor = 'black', linewidth = 6)
ax.add_patch(rect)
ax.add_patch(rect2)
ax.set_xlim([0, 3.5])
ax.set_ylim([0, 3.5])
结果如下:
请注意,边框绘制在框的外部,因此框 + 边框现在超过了蓝色框的大小。我希望将边框绘制在框内,这样无论线宽如何,它始终与蓝色框的大小相同。
我尝试了两种不同的方式,但都不满意:
- 将线宽从绝对单位转换为数据单位,然后计算一个较小的框,该框可以使用与另一个框匹配的正常边框绘制。
- 探索一些
offsetbox
功能,如 this post ,尽管我没有走得太远,因为我不知道如何正确指定pad
。
如有任何帮助,我们将不胜感激!
最佳答案
最简单的方法是设置一个剪辑矩形,隐藏矩形之外的所有内容。由于您已经有了一个矩形,因此可以使用它来剪辑自身。
由于边框是以边框线为中心绘制的,因此一半会被剪掉。这可以通过将宽度设置为所需宽度的两倍来解决。
请注意,为了按需要进行裁剪,矩形已经需要转换为轴坐标。因此,首先将矩形补片添加到斧头,然后使用 is 来设置剪切。
另请注意,使用默认参数时,矩形的内部和细边框使用相同的颜色。将线宽设置为零可确保它不会绘制在矩形之外。
类似地,也可以仅在内部使用线条来绘制椭圆。
下面的代码使用 10 的粗细和一些额外的红色虚线来说明发生的情况。
import matplotlib.pyplot as plt
import matplotlib.patches as patches
fig, ax = plt.subplots()
pad = 0.1 # distance between the rectangles
for i in range(3):
for j in range(2):
x = .5 + i * (1 + pad)
y = .5 + j * (1 + pad)
if i == j:
patch = patches.Rectangle((x, y), 1, 1, facecolor='blue', linewidth=0)
elif i < 2:
patch = patches.Rectangle((x, y), 1, 1, facecolor='none', edgecolor='black',
linewidth=10*2 if j == 0 else 10)
else:
patch = patches.Ellipse((x+0.5, y+0.5), 1, 1, facecolor='none', edgecolor='black',
linewidth=10*2 if j == 0 else 10)
ax.add_patch(patch)
if j == 0:
patch.set_clip_path(patch)
for i in range(3):
x = .5 + i * (1 + pad)
for s in 0,1:
ax.axvline (x+s, color='crimson', ls=':', lw=1)
for j in range(2):
y = .5 + j * (1 + pad)
for s in 0,1:
ax.axhline (y+s, color='crimson', ls=':', lw=1)
ax.set_xlim([0, 4.0])
ax.set_ylim([0, 3.0])
ax.set_aspect('equal')
plt.show()
下图显示了在顶部绘制、在底部使用双线宽裁剪的标准方式。
关于python - 在矩形内绘制线宽 matplotlib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60574840/