Python:Delaunay 三角形顶点在另存为 .pdf 或 .png 时不会 "line up"

Python: Delaunay triangle vertices don't "line up" when saved as .pdf or .png

我使用 scipy.spatial 创建了一组 Delaunay 三角形。

from matplotlib import pyplot as plt
import matplotlib
from skimage import io
from scipy.spatial import Delaunay
import numpy as np
from PIL import Image
from scipy.ndimage import rotate

h = 700
w = 700
npts = 500
pts = np.zeros((npts,2))
pts[:,0] = np.random.randint(0,w,npts)
pts[:,1] = np.random.randint(0,h,npts)

tri = Delaunay(pts)
centers = np.sum(pts[tri.simplices], axis=1, dtype='int')/3.0

#plt.figure()
fig, ax = plt.subplots()
plt.xlim(0, w)
plt.ylim(0, h)


for i in range(0,len(pts[tri.simplices])-1):
    temp_tri = plt.Polygon(pts[tri.simplices][i], color = colors[i]/256) #colors variable is a numpy.ndarray variable that contains RGB values
    plt.gca().add_patch(temp_tri)

plt.gca().set_aspect('equal')
plt.axis('off')

plt.savefig('test.pdf', bbox_inches = 'tight', dpi=fig.dpi)
plt.show()

在屏幕上,输出如我所愿。但是,当我将它保存为 pdf 或 png 时,Delaunay 三角形的顶点不匹配(当我通过 plt.show() 查看它们时它们匹配)

下图是全图的一部分,只是为了突出顶点不匹配的地方。

我发现关于 plt.show() 和 fitsave() 显示的不同图像的问题的一些建议说我应该匹配 dpi,我已经做到了。

请告知我应该尝试什么。提前致谢!

我不知道为什么它不能为三角形生成正确的点,但一般来说,从顶点而不是单个三角形创建 PolyCollection 可能更好。

这样就不会出现这个问题了

pc = PolyCollection(pts[tri.simplices], 
                    facecolors=np.random.rand(len(pts[tri.simplices]),3),
                    edgecolor="face",linewidth=0.1)
plt.gca().add_collection(pc)

这里看到了一些剩余的重叠,这是由于线宽造成的。较小的线宽在 pdf 中看起来会更好,例如linewidth=0.01,但可能会导致屏幕上的图形出现 "white" 行。您可以尝试使用该参数,直到您对结果满意为止。