使用imshow()创建更高质量的hist2d

2024-04-23 16:56:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我在玩体积数据,并试图投射出一幅类似“宇宙网”的图像。在

我几乎创建了一个文件路径,并用打开hdf5文件的模块打开数据。xy值是通过从文件gas_pos建立索引来表示的,并且直方图由不同的属性来加权,gas_density在这种情况下:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
from matplotlib.ticker import LogFormatter 


cmap = LinearSegmentedColormap.from_list('mycmap', ['black', 'steelblue', 'mediumturquoise', 'darkslateblue'])

fig = plt.figure()
ax = fig.add_subplot(111)

H = ax.hist2d(gas_pos[:,0]/0.7, gas_pos[:,1]/0.7, bins=500, cmap=cmap, norm=matplotlib.colors.LogNorm(), weights=gas_density);

cb = fig.colorbar(H[3], ax=ax, shrink=0.8, pad=0.01, orientation="horizontal", label=r'$ \rho\ [M_{\odot}\ \mathrm{kpc}^{-3}]$')
ax.tick_params(axis=u'both', which=u'both',length=0)
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)

plt.show()

给我这个:

enter image description here

这很好,但我想提高质量,去掉它的颗粒。当我尝试imshow插值时:

^{pr2}$

enter image description here

我用错了吗?或者有更好的方法可以用来修改像素吗?在

如果有人想玩我的数据,我会在今天晚些时候上传数据!在


Tags: 文件数据fromposimportmatplotlibasfig
2条回答

您可能需要在对imshow的调用中设置interpolation='None',而不是{}

使用interpolation='sinc'确实是一种平滑绘图的好方法。其他的例如"gaussian""bicubic"或{}。在

您观察到的问题是imshow图绘制在hist2d图的顶部,因此采用了它的轴限制。这些限制似乎小于imshow图中的点数,因此您只能看到全部数据的一部分。在

解决方案要么根本不绘制hist2d图,要么至少将其绘制到另一个子图或图形中。在

为了实现第一个想法,您可以使用numpy.histogram2d计算直方图而不绘制它

H, xedges, yedges = np.histogram2d(gas_pos[:,0]/0.7, gas_pos[:,1]/0.7,
                                   bins=500, weights=gas_density)
im = ax.imshow(H.T, cmap=cmap, interpolation='sinc', norm=matplotlib.colors.LogNorm())

我还建议您阅读^{}文档,其中包括在matplotlib中绘制直方图输出的示例。在

相关问题 更多 >