我正在尝试绘制有限元数据的集合,并使用彩色补丁来表示每个元素中的值。
不幸的是,当我绘制补丁时,相邻补丁之间存在很小的间隙。
我在下面创建了一个示例脚本来描述该问题。
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
在保存数字时增加 有助于缩小差距,但并不能完全消除它。如果超过dpi
1000,则只有在高分辨率显示器上放大(先单击图像)时才能看到间隙。
例如,对于没有边缘宽度(edgecolor
=None)的真实数据,每个元素之间都有分隔线。
设置edgecolor="face"
withlinewidth=1.0
会删除元素之间的线条,但会在单元格的角落添加小伪影。这在几何体的前面尤其明显,那里的颜色非常不同并且元素很小。
减小linewidth
to 可0.5
减少这些伪影的影响,但中间较大元素之间的线条开始重新出现。
有可能弥补这些差距吗?我知道这是一件小事,但我希望有一种方法可以在没有工件的情况下用 python 绘制数据。
我尝试过设置snap=False
和antialisased=True
,但都没有任何效果。
您可以通过使用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建议。
归档时间: |
|
查看次数: |
486 次 |
最近记录: |