拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 在matplotlib中叠加imshow和scatter时,set_position和set_size_inches无法正常作业

在matplotlib中叠加imshow和scatter时,set_position和set_size_inches无法正常作业

白鹭 - 2022-03-04 1974 0 0

我正在尝试从矩阵z2上的光栅创建影像,该光栅由np.meshgrid(grid_x, grid_y)这样的影像的值定义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)

为了做到这一点,我使用了一个 2D 图,其中 x 和 y 值用于定义点的位置,z 由从颜色图中绘制的颜色指示。

此影像的要求是 1) 实际绘图和图形边缘之间不应有空白;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)使用上述示例资料运行时,会出现以下影像。

在 matplotlib 中叠加 imshow 和 scatter 时,set_position 和 set_size_inches 无法正常作业

本质上,只绘制了栅格资料,而没有绘制散点资料。

然后我尝试了plot_img(x, y, z, grid_x, grid_y, z2, set_fig_size=False)结果是

在 matplotlib 中叠加 imshow 和 scatter 时,set_position 和 set_size_inches 无法正常作业

请注意,这里为了清楚地显示图中的空白,我保留了 PyCharm 的背景围绕它。本质上,我不希望在此图中包含空白。

我想知道为什么会这样,以及如何修复代码以获得正确的输出,这本质上是没有空格的第二个结果。谢谢!

uj5u.com热心网友回复:

将您的 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"。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *