Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pyplot imshow在设置纵横比时不显示方形像素_Python_Matplotlib_Pixel_Aspect Ratio_Imshow - Fatal编程技术网

Python Pyplot imshow在设置纵横比时不显示方形像素

Python 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

我在使用Pyplot
imshow
从名为
data
的numpy
ndarray
绘制图像时遇到了一些问题,无法同时保持其纵横比和方形像素。
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吗