使用matplotlib和imshow平滑二维直方图

13 投票
3 回答
20430 浏览
提问于 2025-04-18 07:41

我想制作一个二维直方图,并通过某种插值方法来得到一个“平滑”的图像。所以我结合使用了 plt.hist2dplt.imshow

import matplotlib.pyplot as plt
import numpy as np

data = np.loadtxt("parametre_optMC.dat", skiprows=50, usecols=(1,2))

h, x, y, p = plt.hist2d(data[:,0], data[:,1], bins = 20)
plt.imshow(h, origin = "lower", interpolation = "gaussian")
plt.savefig("test.pdf")

如你在下面的图片中看到的,这两个图重叠在一起,这就是我需要帮助解决的问题。

enter image description here

添加 clf 是有效的,但我失去了坐标轴的尺寸:

import matplotlib.pyplot as plt
import numpy as np

data = np.loadtxt("parametre_optMC.dat", skiprows=50, usecols=(1,2))

h, x, y, p = plt.hist2d(data[:,0], data[:,1], bins = 20)
plt.clf()
plt.imshow(h, origin = "lower", interpolation = "gaussian")
plt.savefig("test.pdf")

enter image description here

3 个回答

0

你需要在你的 imshow 命令中添加一个叫做 'extent' 的参数。imshow 可以接受任意值的网格,但它不知道这些值的具体大小。

1

关于你的第一个问题:

你需要清除之前图表的数据,在你绘制图表之前加上以下代码就可以做到这一点:

plt.clf()
plt.close()

关于你的第二个问题:

如果想要改变坐标轴的数值,我建议使用 extent 参数(可以参考 这个回答)。

比如可以这样写:

plt.imshow(h, origin = "lower", interpolation = "gaussian",extent=[-100,100,-75,75])
17

也许绘制一个核密度估计图会更好?

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

data = np.random.multivariate_normal([0, 0], [(1, .6), (.6, 1)], 100)
f, ax = plt.subplots(figsize=(7, 7))
sns.kdeplot(data, shade=True, ax=ax)

在这里输入图片描述

撰写回答