0

所以在右边我得到了 1000 个矩阵的特征值谱,它们相互散布。在左侧,我想获得一个直方图或密度函数,以了解特征值出现的位置和频率。

两面板特征值分布图

直方图是用 numpy 完成的:

bins = 200
d = max(max(re), max(im), -min(re), -min(im))
histogram2D, binsX, binsY = np.histogram2d(re, im, bins=bins, range=((-d,d),(-d,d)))
histogram2D = histogram2D.T

除了每个 bin 中的特征值数量之外,我希望直方图仍能清楚地显示特征值出现的位置和没有出现的位置。所以我制作了自己的颜色图:

def redblue_zeta(Zmin, Zmax, zeta=0.0):
   breakingpoint = float(Zmin)+float(zeta)/(float(Zmax)-float(Zmin))
   cdict = {'red':   ((0.0, 1.0, 1.0), (breakingpoint, 1.0, 0.0), (1.0, 1.0, 1.0)),
            'green': ((0.0, 1.0, 1.0), (breakingpoint, 1.0, 0.0), (1.0, 0.0, 0.0)),
            'blue':  ((0.0, 1.0, 1.0), (breakingpoint, 1.0, 1.0), (1.0, 0.0, 0.0))}
   return(cdict)

(这有点复杂,因为我将地图用于 zeta>0 的其他图。)然后我绘制了:

Zmax = histogram2D.max()
cdict=cc.redblue_zeta(0,Zmax,zeta=0.0)
plt.register_cmap(name='rb', data=cdict)

plt.imshow(histogram2D, cmap=cm.get_cmap('rb'), extent=[-d, d, -d, d], interpolation='nearest')

因此,如果该 bin 中的特征值恰好为零,则 2D 图中的一个点应该是白色的。否则它应该是蓝色和红色之间的任何东西。但这不是我得到的。似乎直方图或颜色图将小值四舍五入为零,因为我在直方图中得到了一个太小的蓝色区域。有任何想法吗?谢谢。

4

1 回答 1

0

您是否有理由需要自己的颜色图,而不是其中一个内置插件的缩放版本?如果没有,则转到内置颜色图,看看是否可以使其工作。您以后可以随时调整颜色。

如果您确实需要自己的,那么我怀疑颜色图还不能正常工作。您可以修改 register_cmap 以首先创建 LinearSegmentedColor 贴图,然后注册该贴图吗? http://matplotlib.org/api/colors_api.html#matplotlib.colors.LinearSegmentedColormap

您是否尝试过仅显示地图以查看其外观?

其次,为了遵循文档,我会将 cdict 的定义从元组元组字典切换到元组列表字典。

于 2014-02-20T18:32:14.973 回答