set_position 和 set_size_inches 在 matplotlib 中叠加 imshow 和 scatter 时无法正常工作
set_position and set_size_inches does not work properly when overlaying imshow and scatter in matplotlib
我正在尝试在 np.meshgrid(grid_x, grid_y)
定义的光栅上从矩阵 z2
创建图像,使得 vx=grid_x[i], vy=grid_y[j]
处的图像值为 z2[i, j]
。在此图像之上,我试图添加由三个向量 x, y, z
获得的多个点的散点图,使得第 i 个点具有坐标 (x[k], y[k])
和值 z[k]
.所有这些散点都位于上述栅格的区域内。
这是我试图绘制的上述数据的示例。
import numpy as np
np.random.seed(1)
z2 = np.ones((1000, 1000)) * 0.66
z2[0, 0] = 0
z2[-1, -1] = 1
x = np.random.rand(1000) * 1000
y = np.random.rand(1000) * 1000
z = np.random.rand(1000)
grid_x = np.linspace(0, 999, 1000)
grid_y = np.linspace(0, 999, 1000)
为了做到这一点,我使用了一个二维图,其中 x 和 y 值用于定义点的位置,z 由从颜色图中绘制的颜色表示。
这张图的要求是:1)实际情节和图形边缘之间不能有白色space; 2)x轴和y轴上的单位长度应该相等; 3)图像不宜过大。为了实现这些,我使用以下代码进行绘图。
import matplotlib.pyplot as plt
from matplotlib import cm
def plot_img(x, y, z, grid_x, grid_y, z2, set_fig_size=True):
# determine the figure size
if set_fig_size:
height, width = np.array(z2.shape, dtype=float)
dpi = max(max(640 // height, 640 // width), 1)
width, height = width * dpi, height * dpi
plt.gcf().set_size_inches(width, height)
plt.gcf().set_dpi(dpi)
# plot the figure
plt.gca().axis('off')
plt.gca().axis('equal')
plt.gca().set_position([0, 0, 1, 1])
plt.xlim((grid_x[0], grid_x[-1]))
plt.ylim((grid_y[0], grid_y[-1]))
# the raster
cmap = cm.get_cmap('gray')
cmap.set_bad(color='red', alpha=0.5)
plt.imshow(z2, cmap=cmap, interpolation='none', origin='lower',
extent=(grid_x[0], grid_x[-1], grid_y[0], grid_y[-1]))
# the scatter plot
min_z, max_z = np.min(z), np.max(z)
c = (z - min_z) / (max_z - min_z)
plt.scatter(x, y, marker='o', c=c, cmap='Greens')
plt.show()
奇怪的是,当我运行 plot_img(x, y, z, grid_x, grid_y, z2)
使用上述示例数据时,出现了下图。
基本上只绘制了栅格数据,而没有绘制散点数据。
然后我尝试了 plot_img(x, y, z, grid_x, grid_y, z2, set_fig_size=False)
。结果是
注意这里为了清楚显示图中白色的space,我保留了PyCharm周围的背景。本质上,有一些白色的 space 我不希望包含在这个图中。
我想知道为什么会这样,以及如何修复代码以获得正确的输出,这实际上是没有白色 space 的第二个结果。谢谢!
将您的 dpi 和 figsize 代码替换为
# determine the figure size
height, width = np.array(z2.shape, dtype=float)
dpi = 200
# get size in inches:
width, height = height / dpi, width / dpi
plt.gcf().set_size_inches(width, height)
plt.gcf().set_dpi(dpi)
您将得到一个 1000x1000 像素的图形,在 200 dpi 下为 5"x5"。
我正在尝试在 np.meshgrid(grid_x, grid_y)
定义的光栅上从矩阵 z2
创建图像,使得 vx=grid_x[i], vy=grid_y[j]
处的图像值为 z2[i, j]
。在此图像之上,我试图添加由三个向量 x, y, z
获得的多个点的散点图,使得第 i 个点具有坐标 (x[k], y[k])
和值 z[k]
.所有这些散点都位于上述栅格的区域内。
这是我试图绘制的上述数据的示例。
import numpy as np
np.random.seed(1)
z2 = np.ones((1000, 1000)) * 0.66
z2[0, 0] = 0
z2[-1, -1] = 1
x = np.random.rand(1000) * 1000
y = np.random.rand(1000) * 1000
z = np.random.rand(1000)
grid_x = np.linspace(0, 999, 1000)
grid_y = np.linspace(0, 999, 1000)
为了做到这一点,我使用了一个二维图,其中 x 和 y 值用于定义点的位置,z 由从颜色图中绘制的颜色表示。
这张图的要求是:1)实际情节和图形边缘之间不能有白色space; 2)x轴和y轴上的单位长度应该相等; 3)图像不宜过大。为了实现这些,我使用以下代码进行绘图。
import matplotlib.pyplot as plt
from matplotlib import cm
def plot_img(x, y, z, grid_x, grid_y, z2, set_fig_size=True):
# determine the figure size
if set_fig_size:
height, width = np.array(z2.shape, dtype=float)
dpi = max(max(640 // height, 640 // width), 1)
width, height = width * dpi, height * dpi
plt.gcf().set_size_inches(width, height)
plt.gcf().set_dpi(dpi)
# plot the figure
plt.gca().axis('off')
plt.gca().axis('equal')
plt.gca().set_position([0, 0, 1, 1])
plt.xlim((grid_x[0], grid_x[-1]))
plt.ylim((grid_y[0], grid_y[-1]))
# the raster
cmap = cm.get_cmap('gray')
cmap.set_bad(color='red', alpha=0.5)
plt.imshow(z2, cmap=cmap, interpolation='none', origin='lower',
extent=(grid_x[0], grid_x[-1], grid_y[0], grid_y[-1]))
# the scatter plot
min_z, max_z = np.min(z), np.max(z)
c = (z - min_z) / (max_z - min_z)
plt.scatter(x, y, marker='o', c=c, cmap='Greens')
plt.show()
奇怪的是,当我运行 plot_img(x, y, z, grid_x, grid_y, z2)
使用上述示例数据时,出现了下图。
基本上只绘制了栅格数据,而没有绘制散点数据。
然后我尝试了 plot_img(x, y, z, grid_x, grid_y, z2, set_fig_size=False)
。结果是
注意这里为了清楚显示图中白色的space,我保留了PyCharm周围的背景。本质上,有一些白色的 space 我不希望包含在这个图中。
我想知道为什么会这样,以及如何修复代码以获得正确的输出,这实际上是没有白色 space 的第二个结果。谢谢!
将您的 dpi 和 figsize 代码替换为
# determine the figure size
height, width = np.array(z2.shape, dtype=float)
dpi = 200
# get size in inches:
width, height = height / dpi, width / dpi
plt.gcf().set_size_inches(width, height)
plt.gcf().set_dpi(dpi)
您将得到一个 1000x1000 像素的图形,在 200 dpi 下为 5"x5"。