在矩形内绘制线宽 matplotlib

2024-01-12

我在使用 Patches 在 matplotlib 中绘制矩形时遇到问题。什么时候linewidth提供给patches.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])

这是结果:

请注意,边框绘制在框的外部,使得框 + 边框现在超过了蓝色框的大小。我希望将边框绘制在框内,这样无论线宽如何,它始终与蓝色框的大小相同。

我以两种不同的方式尝试过,但都不满意:

  1. 将线宽从绝对单位转换为数据单位,然后计算一个较小的框,该框可以使用与另一个框匹配的正常边框绘制。
  2. 探索一些offsetbox功能如这个帖子 https://stackoverflow.com/questions/30081846/set-matplotlib-rectangle-edge-to-outside-of-specified-width,虽然我没有走得太远,因为我不知道如何指定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()

下图显示了在顶部绘制、在底部使用双线宽裁剪的标准方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在矩形内绘制线宽 matplotlib 的相关文章

随机推荐