【问题标题】:Setting axis range shifts image设置轴范围移动图像
【发布时间】:2019-09-05 00:59:11
【问题描述】:

由于某种原因在matplotlib中设置轴范围绘制图像偏移,如何解决这个问题?

sz = 16
img = np.zeros((sz,sz), np.uint8)
img[:2,:] = 255
img[-2:,:] = 255
img[:,:2] = 255
img[:,-2:] = 255
img[sz//2-1:sz//2+1,sz//2-1:sz//2+1] = 255
print('img.shape', img.shape)

# v1
# axes = plt.gca()
# axes.set_xlim([0,sz])
# axes.set_ylim([0,sz])
# v2
plt.axis([0, sz, 0, sz])
plt.imshow(img, interpolation='nearest')
plt.show()

更新:

使用 sz-1 轴未与图像末尾对齐且不包含 16:

更新:

基于@ImportanceOfBeingErnest 的回答,刻度以像素中心为中心,但我需要它们以像素角为中心。

sz = 8
img = np.zeros((sz,sz), np.uint8)
img[:1,:] = 255
img[-1:,:] = 255
img[:,:1] = 255
img[:,-1:] = 255
img[sz//2-1:sz//2+1,sz//2-1:sz//2+1] = 255
print('img.shape', img.shape)

plt.axis([-0.5, img.shape[1]-0.5, img.shape[0]-0.5, -0.5])
plt.imshow(img)
plt.show()

更新:

根据@haijohn 的回答,水平刻度不在每个像素处。

sz = 8
img = np.zeros((sz,sz), np.uint8)
img[:1,:] = 255
img[-1:,:] = 255
img[:,:1] = 255
img[:,-1:] = 255
img[sz//2-1:sz//2+1,sz//2-1:sz//2+1] = 255
print('img.shape', img.shape)

plt.axis([0, img.shape[1], img.shape[0], 0])
plt.imshow(img, extent=[0, sz, 0, sz], interpolation='nearest')
plt.show()

【问题讨论】:

  • plt.axis([0, sz, 0, sz]) 中将sz 设置为sz-1 似乎可以解决问题
  • @Axois 使用 sz-1 它仍然绘制不正确的轴,请参阅更新。

标签: python matplotlib jupyter-notebook


【解决方案1】:

也许是这样

plt.imshow(img, extent=[0, sz, 0, sz], interpolation='nearest')

引用https://matplotlib.org/3.1.1/tutorials/intermediate/imshow_extent.html

【讨论】:

    【解决方案2】:

    默认情况下,像素以整数位置为中心。例如。第一个像素的范围是 -0.5 到 0.5,因此以 0 为中心。

    要设置与默认选择相同的轴限制,请从形状中减去 0.5,

    import matplotlib.pyplot as plt
    import numpy as np
    
    a = np.random.rand(5,5)
    
    plt.axis([-0.5, a.shape[1]-0.5, a.shape[0]-0.5, -0.5])
    plt.imshow(a)
    
    plt.show()
    

    【讨论】:

    • 更新后的情节看起来与我预期的一样。有什么问题?
    • 其实我一直在寻找这种轴stackoverflow.com/a/57792885/1179925,但你的回答还是有帮助的。
    【解决方案3】:
    sz = 8
    img = np.zeros((sz,sz), np.uint8)
    img[:1,:] = 255
    img[-1:,:] = 255
    img[:,:1] = 255
    img[:,-1:] = 255
    img[sz//2-1:sz//2+1,sz//2-1:sz//2+1] = 255
    print('img.shape', img.shape)
    
    plt.axis([0, img.shape[1], img.shape[0], 0])
    ax = plt.gca()
    ax.set_xticks(ticks=range(sz+1))
    ax.set_yticks(ticks=range(sz+1))
    plt.imshow(img, extent=[0, sz, 0, sz], interpolation='nearest')
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      • 2022-10-06
      • 2015-11-17
      • 1970-01-01
      相关资源
      最近更新 更多