我正在尝试在python库matplotlib显示的图像网格顶部上精确覆盖1像素宽的线的网格。
不幸的是,我似乎无法对结果进行足够的精细控制,以实现线网格与数据网格的正确对齐,如下面的代码所示。结果似乎总是很接近,但并不完全正确。
我尝试同时使用imshow
和pcolormesh
函数,但两种方法都遇到问题。
imshow方法:
import matplotlib.pyplot as plt
import numpy as np
size = 60
border = 5
#create test data for image and ticks location
im = np.zeros(shape=(size,size),dtype=np.float32)
ticks = np.arange(size)+0.5
#create test checkerboard pattern outside of border area
for index in range(size-2*border):
im[border+index,border:-border] += index % 2
for index in range(size-2*border):
im[border:-border,index+border] -= index % 2
im = np.abs(im)
#display image with imshow
plt.imshow(im, interpolation='nearest', cmap='binary', vmin=0, vmax=1)
ax = plt.gca()
ax.set_xticks(ticks)
ax.set_xticklabels([])
ax.set_yticks(ticks)
ax.set_yticklabels([])
ax.grid(color='r', linestyle='-', linewidth=1)
#sometimes line is off by 1 pixel
plt.show()
我希望红线的网格可以精确地覆盖数据网格的棋盘格图案,但是它们相距一个像素。
此缩放图像显示了结果,并且偏移很容易看到:
我也尝试使用pcolormesh和edgecolor(使用与上面相同的数据):
plt.pcolormesh(im, cmap='binary', vmin=0, vmax=1, edgecolors='r', linewidth=0.005)
plt.show()
在这里,红线网格对齐更好,但是线宽不一致,有时为1像素宽,有时为2像素宽,如下图所示:
在这里,理想情况下,我希望始终得到1像素宽的线。 可以使用linewidth参数,但是如果我将其设置得太小,则线条开始具有0像素的宽度,并且它们会完全消失,而且我不太了解线条宽度的单位是什么。>
最后,对于在定位(红线网格,不偏离黑白棋盘格)和线宽(在屏幕上始终精确为1像素)方面实现一致性的建议,我将不胜感激。
答案 0 :(得分:0)
哦,我想我会回答自己的问题。这是基于反复试验的,所以我不确定它是否普遍有效,但是我希望这些信息对某人有用。
我能够使用下面的代码一致地绘制pcolormesh
网格,其宽度恰好为1个像素,其中my_dpi
需要精确设置为显示屏的dpi分辨率
imsize_pixel_x
和imsize_pixel_y
是绘图窗口的所需大小。
my_dpi = 96.0
imsize_pixel_x = 800
imsize_pixel_y = 600
plt.figure(figsize=(imsize_pixel_x/my_dpi, imsize_pixel_y/my_dpi), dpi=my_dpi)
plt.pcolormesh(im, cmap='binary', vmin=0, vmax=1, edgecolors='r', linewidth=my_dpi/(1024*32))
plt.show()