Python Pyplot imshow在设置纵横比时不显示方形像素
我在使用PyplotPython Pyplot imshow在设置纵横比时不显示方形像素,python,matplotlib,pixel,aspect-ratio,imshow,Python,Matplotlib,Pixel,Aspect Ratio,Imshow,我在使用Pyplotimshow从名为data的numpyndarray绘制图像时遇到了一些问题,无法同时保持其纵横比和方形像素。ndarray的形状是(1122182)。以下是我使用的代码: import matplotlib as mpl from mpl_toolkits.axes_grid1 import make_axes_locatable import numpy as np mpl.use('Agg') import matplotlib.pyplot as plt dat
imshow
从名为data
的numpyndarray
绘制图像时遇到了一些问题,无法同时保持其纵横比和方形像素。ndarray
的形状是(1122182)
。以下是我使用的代码:
import matplotlib as mpl
from mpl_toolkits.axes_grid1 import make_axes_locatable
import numpy as np
mpl.use('Agg')
import matplotlib.pyplot as plt
data = np.random.random_sample((112, 2182))
plt.figure(figsize=(25, 3.5))
plt.subplots_adjust(left=0.1, right=0.9)
ax = plt.subplot(111)
plt.axis('off')
plt.title('Title', fontweight='bold', y=1.15)
im = ax.imshow(data)
# Add same-width colorbar to the bottom of the image
divider = make_axes_locatable(ax)
cax = divider.append_axes("bottom", size="25%", pad=0.3)
cbar = plt.colorbar(im, orientation="horizontal", cax=cax)
# Save image
plt.savefig('image.pdf', dpi=1000, format=pdf)
我认为通过使用ndarray
的形状设置纵横比,图像将显示方形像素。但是,图像似乎保持纵横比,但像素不是正方形,正如您在缩放图像中看到的那样(对不起,我仍然无法发布图像):
这些输出与我在不使用
aspect
参数的情况下使用im=ax.imshow(data)
时得到的输出相同。我在整个绘图的y轴上手动计算像素,其中有112个,因此这不是像素分组的问题。有没有办法解决这个问题
编辑:我正在打印的图像也将有一个颜色栏和一个标题。此外,我需要能够保存到一个pdf文件。我上传的缩放图是在pdf查看器中缩放的图的屏幕截图。文档中说,
方面
参数可能是浮点或
“相等”:确保纵横比为1。像素将为正方形(除非
在数据坐标中使用
范围)
“自动”:轴保持固定,纵横比调整为
数据是否适合轴。一般来说,这将导致
非方形像素
因此,纵横比为1.0是您需要的。如果给定从数组形状计算的值,则不希望获得上面显示的输出。
正如@ImportanceOfBeingErnest所指出的,aspect='equal'
是默认设置,因此它尽可能简单
im = ax.imshow(data)
文档说明,
方面
参数可以是浮点或
“相等”:确保纵横比为1。像素将为正方形(除非
在数据坐标中使用
范围)
“自动”:轴保持固定,纵横比调整为
数据是否适合轴。一般来说,这将导致
非方形像素
因此,纵横比为1.0是您需要的。如果给定从数组形状计算的值,则不希望获得上面显示的输出。
正如@ImportanceOfBeingErnest所指出的,aspect='equal'
是默认设置,因此它尽可能简单
im = ax.imshow(data)
如果使用ax.imshow(data)
将自动获得方形像素。相反,如果将纵横比设置为除1
/“相等”
之外的其他值,则不会得到正方形像素。然而,这与问题中观察到的效果无关
“缩放图像”中的问题是,数据像素的大小与实际屏幕像素的顺序相同。因此,图像像素的大小变化可能与屏幕像素的变化一样大。解决这个问题的方法是保存一个图形,使一个图像像素正好是一个屏幕像素,或者是该像素的任意倍数
在这种情况下,这将非常简单
data = np.random.random_sample((2182, 112))
plt.imsave("filename.png", data)
如果使用ax.imshow(data)
将自动获得方形像素。相反,如果将纵横比设置为除1
/“相等”
之外的其他值,则不会得到正方形像素。然而,这与问题中观察到的效果无关
“缩放图像”中的问题是,数据像素的大小与实际屏幕像素的顺序相同。因此,图像像素的大小变化可能与屏幕像素的变化一样大。解决这个问题的方法是保存一个图形,使一个图像像素正好是一个屏幕像素,或者是该像素的任意倍数
在这种情况下,这将非常简单
data = np.random.random_sample((2182, 112))
plt.imsave("filename.png", data)
您需要使用imshow选项重新缩放像素:形状和范围:
import numpy as np
import matplotlib.pyplot as plt
shape = (112, 2182)
extent = [0, 112, 0, 2182]
data = np.random.random_sample(shape)
plt.figure(figsize=(5, 3.5))
ax = plt.subplot(111)
plt.axis('off')
dx = (extent[1] - extent[0]) / shape[1]
dy = (extent[3] - extent[2]) / shape[0]
dx_dy = dx/dy
im = ax.imshow(data, extent=extent, aspect=dx_dy)
plt.show()
您需要使用imshow选项重新缩放像素:形状和范围:
import numpy as np
import matplotlib.pyplot as plt
shape = (112, 2182)
extent = [0, 112, 0, 2182]
data = np.random.random_sample(shape)
plt.figure(figsize=(5, 3.5))
ax = plt.subplot(111)
plt.axis('off')
dx = (extent[1] - extent[0]) / shape[1]
dy = (extent[3] - extent[2]) / shape[0]
dx_dy = dx/dy
im = ax.imshow(data, extent=extent, aspect=dx_dy)
plt.show()
我没有提到,该情节将有一个标题和一个颜色栏,需要保存到一个pdf文件。我猜这个答案不起作用,对吗?请看我的编辑。好的,你能提供你感兴趣的实际代码吗?在这个问题中,您有一个25英寸宽的图形,但是数组的行比列多得多。另外,
plt.axis(“off”)
并不表示您想要一个标题。我更正了随机数据的形状,因为行和列被切换了。我在这里读了你的答案,但我不完全理解figsize
,dpi
和ppi
如何在imshow
和pdf中工作。设置dpi=1000
使像素更为方形,但仍然不是完美的正方形。你知道如何计算figsize
和dpi
来解决这个问题吗?现在的色条让这非常困难。所以需要leftmargin+axessize+space+colorbar+righmargin=figuresizedpi和axessize=narrayshape,其中n需要是一个整数。垂直方向也一样。问题是边距的单位与图形大小不同。因此,这将是麻烦的。我不确定我是否有时间和动机把它写在代码里。我没有提到这个情节会有一个标题和一个色条,需要保存到一个pdf文件中。我猜这个答案不起作用,对吗?请看我的编辑。好的,你能提供你感兴趣的实际代码吗?在这个问题中,您有一个25英寸宽的图形,但是数组的行比列多得多。另外,plt.axis(“off”)
并不表示您想要一个标题。我更正了随机数据的形状,因为行和列被切换了。我在这里读了你的答案,但我不完全理解figsize
,dpi
和ppi
如何在imshow
和pdf中工作。设置dpi=1000
使像素更为方形,但仍然不是完美的正方形。你知道如何计算figsize吗