仓库源文站点原文


layout: post title: gnuplot:绘制热度图上的等高线 categories:


前些日子简单地讲了下如何用gnuplot绘制蛋白拉氏图. 在数据不太多的情况下, 简单的热度图就够了. 如果数据量比较大, 为热度图添加等高线效果可能更好, 而且也更容易分析趋势. gnuplot是支持绘制等高线的, 但存在问题. 其中最主要的是等高线对数据的噪声比较敏感, 不进行平滑的话, 比较难看. 但进行平滑的话, 平滑后的数据与原始数据会存在差距, 不好确定范围. 所以大多是时候绘制等高线的示例都使用解析函数.

对于gnuplot 5.x版本, 有两种绘制热度图+等高线的方法, 一种是splot直接绘制, 另一种是先生成等高线数据, 然后自行将其添加到热度图上. 前者使用简单但灵活性不及后者. 绘制热度图时, 既可以用splot, 也可以用plot with image. 这两种方法可根据数据的具体情况, 图形需要的效果自行选择.

我们先拿解析函数来看看具体效果如何.

$$f(x,y) = (x^2+y-11)^2 + (x+y^2-7)^2$$

这是二维的Himmelblau函数, 常用来作为优化算法的测试函数.

下面试试离散数据. 先使用gmx rama得到rama.xvg, 然后统计(φ,ψ)的二维频数.

这种dgrid3d的方法可以做平滑, 但需要重采样, 网格大的时候速度很慢. 一种替代方案是, 先将等高线保存下来, 然后使用plot将其绘制在image上. 这样得到的图使用的是原始数据, 噪声很大, 看起来不大漂亮.

当然, 你也可以将后两种方法结合起来, 这样热度图使用原始数据, 等高线使用平滑数据, 但这样的话二者不容易对应, 容易产生误导.

参考