简体   繁体   English

为什么“matplotlib.pyplot.imshow”会返回带有框架的形状?

[英]Why “matplotlib.pyplot.imshow” returns shapes with a frame around them?

My question is simple: why do the two pieces of code that I wrote below give two slightly different outputs?我的问题很简单:为什么我在下面编写的两段代码会给出两个略有不同的输出?

More specifically the first one makes use of a numpy.ndarray of shape (1000, 1000) filled with "1.0" np.float64 values, except for the region where I want to have a "square", which is filled with "0.45" np.float64 values.更具体地说,第一个使用 numpy.ndarray 形状 (1000, 1000) 填充“1.0” np.float64 值,除了我想要有一个“正方形”的区域,它填充有“0.45” np.float64 值。 When I call the plt.imshow method on the Axes, using as colormap "nipy_spectral", it returns a square, but with a weird frame around it...当我在轴上调用 plt.imshow 方法时,使用颜色图“nipy_spectral”,它返回一个正方形,但周围有一个奇怪的框架......

See the code below and the left picture at the end:见下面的代码和最后的左图:

#Code1:
foreground = np.ones((1000, 1000))
foreground = foreground.astype(np.float64)

def drawSquare(centerYX : tuple = (0, 0), radius : int = 1):
    squareCoordinates = np.meshgrid([y for y in range(centerYX[0]-radius, centerYX[0]+radius+1, 1)],
                                    [x for x in range(centerYX[1]-radius, centerYX[1]+radius+1, 1)])
    return squareCoordinates

square1 = drawSquare((round(foreground.shape[0]/2), round(foreground.shape[1]/2)), 200)
foreground[square1[0], square1[1]] = 0.45

fig, ax = plt.subplots(1)
ax.imshow(foreground, cmap = "nipy_spectral", vmin = 0.0, vmax = 1.0, , interpolation = None)
plt.show();

In the second piece of code, I make use of a numpy.ndarray of shape (1000, 1000, 4) which I fill with the RGBA sequence corresponding to the last color of the "nipy_spectral" colormap (my background), except for the square region, that I fill with the RGBA sequence obtained by calling the "nipy_spectral" colormap with the argument "0.45".在第二段代码中,我使用了形状为 (1000, 1000, 4) 的 numpy.ndarray,我填充了与“nipy_spectral”颜色图(我的背景)的最后一种颜色相对应的 RGBA 序列,除了正方形区域,我用参数“0.45”调用“nipy_spectral”颜色图获得的 RGBA 序列填充。

In this case, I already have an RGBA image/array that does not need any conversion via the "cmap" argument of the Axes.imshow method.在这种情况下,我已经有了一个不需要通过 Axes.imshow 方法的“cmap”参数进行任何转换的 RGBA 图像/数组。 In this case, the output is the expected one: a square without any weird frame around it .在这种情况下,output 是预期的:一个没有任何奇怪框架的正方形

See the code below and the right picture at the end:见下面的代码和最后的右图:

#Code2:
foreground = np.zeros((1000, 1000, 4))
foreground[:, :] = [0.8, 0.8, 0.8, 1.0]
foreground = foreground.astype(np.float64)

def drawSquare(centerYX : tuple = (0, 0), radius : int = 1):
    squareCoordinates = np.meshgrid([y for y in range(centerYX[0]-radius, centerYX[0]+radius+1, 1)],
                                    [x for x in range(centerYX[1]-radius, centerYX[1]+radius+1, 1)])
    return squareCoordinates

square1 = drawSquare((round(foreground.shape[0]/2), round(foreground.shape[1]/2)), 200)

nipy_spectral_cm = matplotlib.cm.get_cmap("nipy_spectral")
foreground[square1[0], square1[1]] = nipy_spectral_cm(0.45)

fig, ax = plt.subplots(1)
ax.imshow(foreground)
plt.show();

在此处输入图像描述

Why does the first piece of code (Code1) give a square with that weird frame around it?为什么第一段代码(Code1)给出了一个带有奇怪框架的正方形?

The frame is due to interpolation.该帧是由于插值。 It's present in the second code too (just zoom in the image and you'll see it), but less visible because its color is closer to the color of the green square:它也出现在第二个代码中(只需放大图像,您就会看到它),但不太明显,因为它的颜色更接近绿色方块的颜色:

Code 2 --> interpolates to a bluish green:代码 2 --> 内插为蓝绿色:

foreground[299:301,299:301,0]
#array([[0.8, 0.8],
#       [0.8, 0. ]])

foreground[299:301,299:301,1]
#array([[0.8       , 0.8       ],
#       [0.8       , 0.60261373]])

foreground[299:301,299:301,2]
#array([[0.8, 0.8],
#       [0.8, 0. ]])

Code 1 --> interpolates to yellow:代码 1 --> 内插为黄色:

foreground[299:301,299:301]
#array([[1.  , 1.  ],
#       [1.  , 0.45]])

Use interpolate='none' to switch off interpolation and get a clear cut corner.使用interpolate='none'关闭插值并获得清晰的切角。 You used None instead of 'none' .您使用None而不是'none' None is the default and is preset to 'antialiased' , see here for details. None是默认值,并预设为'antialiased' ,有关详细信息,请参见此处

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM