所以在右边,我得到了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
除了每个箱子中特征值的数量之外,我还希望直方图能够清楚地显示特征值出现的位置和未出现的特征值。所以我制作了自己的色彩图:
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')
因此,如果该区域中的特征值恰好为零,则2D图中的点应该为白色。否则它应该是蓝色和红色之间的任何东西。但那不是我得到的。似乎直方图或色彩图将小值舍入为零,因为我在直方图中获得了一个太小的蓝色区域。有任何想法吗?感谢。
答案 0 :(得分:0)
是否有理由需要自己的颜色贴图,而不是其中一个内置插件的缩放版本?如果没有,那么移动到内置颜色映射,看看是否可以使它以这种方式工作。您可以随时调整颜色。
如果你确实需要自己的,那么我怀疑色彩图还没有正常工作。你能修改register_cmap以首先创建LinearSegmentedColor地图,然后注册那个地图吗? http://matplotlib.org/api/colors_api.html#matplotlib.colors.LinearSegmentedColormap
您是否尝试过单独显示地图以查看其外观?
其次,只是为了遵循文档,我将你的cdict的定义从一个元组元组的字典切换到一个元组列表的字典。