使用matplotlib和imshow平滑二维直方图
我想制作一个二维直方图,并通过某种插值方法来得到一个“平滑”的图像。所以我结合使用了 plt.hist2d
和 plt.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")
如你在下面的图片中看到的,这两个图重叠在一起,这就是我需要帮助解决的问题。
添加 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")
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)