如何消除相邻 matplotlib 补丁之间的间隙

Jos*_*bal 7 python matplotlib

我正在尝试绘制有限元数据的集合,并使用彩色补丁来表示每个元素中的值。

不幸的是,当我绘制补丁时,相邻补丁之间存在很小的间隙。

我在下面创建了一个示例脚本来描述该问题。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from matplotlib.collections import PatchCollection

nodes = [[0.1, 0.1],
        [0.25, 0.1],
        [0.75, 0.9],
        [0.1, 0.9],
        [0.9, 0.1],
        [0.9, 0.9]]
        
elems =[[0,1, 2, 3],
        [1, 4, 5, 2]]

patches = []
for elem in elems:
    xy = np.array([nodes[i] for i in elem])
    elem = mpatches.Polygon(xy, closed=True, snap=False, antialiased=True)
    patches.append(elem)

col = PatchCollection(patches)

fig, ax = plt.subplots(1, 1)

ax.add_collection(col)
plt.show()
Run Code Online (Sandbox Code Playgroud)

这会产生以下带有不需要的间隙的图。调整绘图窗口的形状会改变间隙的外观。

目前我的解决方法是设置 col.set_edgecolor("face")` 并包含一个小的边缘宽度。然而,当存在一系列不同的补丁大小时,很难设置边缘来减少伪影。

编辑:正如 @tdy 指出的那样,dpi在保存数字时增加 有助于缩小差距,但并不能完全消除它。如果超过dpi1000,则只有在高分辨率显示器上放大(先单击图像)时才能看到间隙。 在此输入图像描述

例如,对于没有边缘宽度(edgecolor=None)的真实数据,每个元素之间都有分隔线。 在此输入图像描述

设置edgecolor="face"withlinewidth=1.0会删除元素之间的线条,但会在单元格的角落添加小伪影。这在几何体的前面尤其明显,那里的颜色非常不同并且元素很小。 在此输入图像描述 在此输入图像描述

减小linewidthto 可0.5减少这些伪影的影响,但中间较大元素之间的线条开始重新出现。 在此输入图像描述 在此输入图像描述

有可能弥补这些差距吗?我知道这是一件小事,但我希望有一种方法可以在没有工件的情况下用 python 绘制数据。

我尝试过设置snap=Falseantialisased=True,但都没有任何效果。

rvd*_*rvd 1

您可以通过使用PatchCollection颜色和不同的 PatchCollections 来解决此问题。

PatchCollection -> 没有线条,甚至没有edgecolors和没有linewidth=0

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from matplotlib.collections import PatchCollection

nodes = [[0.1, 0.1],
         [0.25, 0.1],
         [0.75, 0.9],
         [0.1, 0.9],
         [0.9, 0.1],
         [0.9, 0.9]]

elems = [[0, 1, 2, 3],
         [1, 4, 5, 2]]

collections = []
for elem in elems:
    xy = np.array([nodes[i] for i in elem], dtype=float)
    collections.append(PatchCollection([mpatches.Polygon(xy)], snap=True, color='black'))

fig, ax = plt.subplots(1, 1)
for col in collections:
    ax.add_collection(col)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我不知道为什么这有效。

编辑:应用了评论中的tdy建议。