Python Matplotlib轮廓图中的非线性缩放

3

我在可视化一组等高线图的数据时遇到了一些困难。问题在于,我的数据点(X,Y,Z)中的Z值范围从大约2到0,而很多有趣的特征都位于0到0.3的范围内。使用普通的缩放比例,它们很难看到,如下图所示:

http://i.stack.imgur.com/7O8hH.png

现在,我考虑还能做些什么。当然,可以使用对数缩放,但是首先需要考虑某种映射方式,我不确定如何做到100%。受this question的启发,可以考虑一种类型的映射scaling(x) = Log(x/min)/Log(max/min),在那个问题中效果还不错。

同样有趣的是后续discussed here

他们使用了某种ArcSinh缩放函数。这似乎相当不错地扩大了小特征,与整体成比例。

因此,我的问题在某种程度上是双重的。

  1. 如何缩放我的等高线图数据,使小幅振荡特征不会被异常值吹走?

  2. 您会使用上述任一方法或完全不同的方法进行处理吗?

我对Python比较新,我经常被已经存在的所有东西所惊讶,所以我相信可能有一种内置方式比我上面提到的任何一种都更好。
为了完整起见,我上传了数据文件(上传站点是robustfiles.com,一个快速的谷歌搜索告诉我这是一个值得信赖的网站,可以分享这些东西)
我用以下内容绘制了上述图表:
data = np.load("D:\SavedData\ThreeQubitRess44SpecHighResNormalFreqs.npy")

fig, (ax1) = plt.subplots(1,figsize=(16,16))    
cs = ax1.contourf(X, Y, data, 210, alpha=1,cmap='jet')
fig.colorbar(cs, ax=ax1, shrink=0.9)
ax1.set_title("Freq vs B")
ax1.set_ylabel('Frequency (GHz)'); ax1.set_xlabel('B (arb.)')

作为注释,您可以看到一些围绕6.2 GHz和-0.6 B的特性。这是我想要更明确的内容。 - user129412
2个回答

2

很好的问题。

不要对数据进行缩放。这会导致在许多缩放函数中寻找折衷方案。

相反,使用自定义颜色映射。这样,您就不必重新映射实际数据,并且可以轻松自定义要突出显示的区域的可视化效果。另一个例子可以在scipy cookbook中找到,而且互联网上还有很多其他例子。


这是一个很好的见解!我会查阅文档并尝试进行实验。但是,对我来说,这并不完全明显,因为这可能只是将缩放问题移动到了颜色映射中。首先当然要选择对比度高的颜色(这也不是微不足道的),但是接下来我仍然需要确保过渡是这样的,以便我感兴趣的细节变得可见。假设我在0到1的范围内从蓝色到红色,但是我的大部分细节都在0到0.2的范围内。那么我仍然需要一些特殊的颜色映射比例尺,对吗? - user129412
1
@user129412 我理解你的问题是是否会将缩放问题转移到颜色映射上。但是颜色映射可以完全任意设置。要使用数据的缩放函数来实现这一点,您需要寻找分段连续函数。通过更改颜色映射,您可以更快地完成此操作。至于选择,您确实可以使其在边界处非连续(例如:1为红色,0.2为蓝色,然后为灰度),或者只需“拉伸”cmap:从蓝色到橙色为[0,.2],从橙色到红色为(.2,1]。 - Oliver W.
是的,那很有道理。我认为关于颜色映射的文档已经足够了,所以我应该能够自己解决这个问题。谢谢! - user129412

1

另一个选择是通过打断轴(例如这样)将图形分成两个独立的区域。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接