使用matplotlib

时间:2019-05-09 07:58:16

标签: python matplotlib

我正在尝试在python库matplotlib显示的图像网格顶部上精确覆盖1像素宽的线的网格。

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

我尝试同时使用imshowpcolormesh函数,但两种方法都遇到问题。

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()

我希望红线的网格可以精确地覆盖数据网格的棋盘格图案,但是它们相距一个像素。

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

red_mesh_offset_by_one_pixel

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

plt.pcolormesh(im, cmap='binary', vmin=0, vmax=1, edgecolors='r', linewidth=0.005)
plt.show()

在这里,红线网格对齐更好,但是线宽不一致,有时为1像素宽,有时为2像素宽,如下图所示: red_mesh_inconsistent_line_width

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

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

1 个答案:

答案 0 :(得分:0)

哦,我想我会回答自己的问题。这是基于反复试验的,所以我不确定它是否普遍有效,但是我希望这些信息对某人有用。

我能够使用下面的代码一致地绘制pcolormesh网格,其宽度恰好为1个像素,其中my_dpi需要精确设置为显示屏的dpi分辨率 imsize_pixel_ximsize_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()