python - 在矩形内绘制线宽 matplotlib

标签 python matplotlib

我在使用 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])

结果如下:

Matplotlib rectangles

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

Desired result

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

  1. 将线宽从绝对单位转换为数据单位,然后计算一个较小的框,该框可以使用与另一个框匹配的正常边框绘制。
  2. 探索一些 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()

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

resulting plot

关于python - 在矩形内绘制线宽 matplotlib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60574840/

相关文章:

python - 没有名为 basemap 的模块

python - 在多个 matplotlib.pyplot 子图上创建图例单击事件

python - matplotlib boxplot xticks 向 y 轴移动

python - 如何摆脱多个空格并考虑换行符

python - 取模求未知值

python - 如何在 python 中的数据文件中将数组作为列元素写入并稍后在 C 中读取?

javascript - jquery 元素与 django 形式

python - R 和 Numpy 的 QR 分解之间的差异

python - colorbar 范围 matplotlib python 的问题

python - 从 matplotlib 中的 RGBA 函数创建颜色条