Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用matplotlib在图像数据顶部精确定位线网格_Python_Matplotlib - Fatal编程技术网

Python 使用matplotlib在图像数据顶部精确定位线网格

Python 使用matplotlib在图像数据顶部精确定位线网格,python,matplotlib,Python,Matplotlib,我试图在python库matplotlib显示的图像网格上精确地覆盖一个由1像素宽的线组成的网格 不幸的是,我似乎无法对结果进行足够精细的控制,以实现线网格与数据网格的正确对齐,如下面的代码所示。结果似乎总是很接近,但并不完全正确 我尝试过使用imshow和pcolormesh函数,但在这两种方法中都遇到了问题 imshow方法: 导入matplotlib.pyplot作为plt 将numpy作为np导入 尺寸=60 边框=5 #为图像和标记位置创建测试数据 im=np.zero(shape=(

我试图在python库matplotlib显示的图像网格上精确地覆盖一个由1像素宽的线组成的网格

不幸的是,我似乎无法对结果进行足够精细的控制,以实现线网格与数据网格的正确对齐,如下面的代码所示。结果似乎总是很接近,但并不完全正确

我尝试过使用
imshow
pcolormesh
函数,但在这两种方法中都遇到了问题

imshow方法:

导入matplotlib.pyplot作为plt
将numpy作为np导入
尺寸=60
边框=5
#为图像和标记位置创建测试数据
im=np.zero(shape=(size,size),dtype=np.float32)
刻度=np.arange(尺寸)+0.5
#在边界区域外创建测试棋盘格图案
对于范围内的索引(大小为2*边框):
im[边框+索引,边框:-边框]+=索引%2
对于范围内的索引(大小为2*边框):
im[边框:-边框,索引+边框]-=索引%2
im=np.abs(im)
#用imshow显示图像
plt.imshow(im,interpolation='nearest',cmap='binary',vmin=0,vmax=1)
ax=plt.gca()
ax.set_xticks(刻度)
ax.setxticklabels([])
ax.设置刻度(刻度)
ax.设置标签([])
ax.grid(color='r',linestyle='-',linewidth=1)
#有时线条偏移1像素
plt.show()
我希望红线的线网格能够精确地覆盖数据网格的棋盘格图案,但它们相差一个像素

此缩放图像显示结果,并且偏移很容易看到:

我还尝试使用pcolormesh和edgecolor(使用与上面相同的数据):

plt.pcolormesh(im,cmap='binary',vmin=0,vmax=1,edgecolors='r',线宽=0.005)
plt.show()
此处红线网格对齐更好,但线宽不一致,有时为1像素宽,有时为2像素宽,如下图所示:

在这里,理想情况下,我希望始终获得1像素宽的线条。 可以使用linewidth参数,但如果我将其设置得太小,则线条开始具有0像素的宽度,并且它们完全消失,而且我不太了解线宽的单位是什么


总之,对于如何在定位(不偏离黑白棋盘格的红线网格)和线宽(屏幕上始终精确为1像素宽)方面实现一致性,我将不胜感激。

哦,好吧,我想我会回答我自己的问题。这是基于尝试和错误,所以我不确定它是否普遍有效,但我希望这些信息可能对某些人有用

我能够使用下面的代码以精确1像素的宽度一致地绘制
pcolormesh
网格,其中
my_dpi
需要精确设置为显示屏的dpi分辨率 和
imsize\u pixel\u x
imsize\u pixel\u y
是打印窗口的所需大小

my_dpi=96.0
imsize_像素_x=800
imsize_像素_y=600
plt.figure(figsize=(imsize\u pixel\u x/my\u dpi,imsize\u pixel\u y/my\u dpi),dpi=my\u dpi)
plt.pcolormesh(im,cmap='binary',vmin=0,vmax=1,edgecolors='r',线宽=my_dpi/(1024*32))
plt.show()

栅格将捕捉到最近的像素,但如果其中一个与像素边界重叠,则栅格有时会变宽两倍。如果你真的想这样戳像素,我可以建议matplotlib不是最好的工具吗?Pillow允许您将图像文件读写到numpy数组中,您可以直接在那里更改RGBA值。如果假设分辨率足够高,消除混叠可以在屏幕或图形上做出令人愉悦的表示,Matplotlib的效果会更好。Hallo@Jody,该用例是带有数千个模具的晶片映射的交互式显示(还允许放大等功能)我们还显示了其他内容,如值的直方图分布-因此matplotlib解决方案将更加理想和简单(如果可能的话)。虽然问题只在最缩小的层面上可见,但在这里可以看到整个晶圆,因此最有用。我认为在GitHub上这两个方面都存在问题。你可以把它们挖出来,在那里发表评论。但基本上,imshow和ticks/grids捕捉到最近的像素,pcolormesh使用抗锯齿。此外,imshow和它如何从数据转换为图像像素也有问题。介绍此问题以及大多数其他类似问题。我不再担心这一点,因为我认为matplotlib很快就会转向使用cairo作为主要的光栅化后端,并且它已经修复了很多这些问题。