layout: post title: 使用gnuplot绘制氢键数据的平行轴图 categories:
较现代的数据分析和绘图工具中提供了很多新的绘图类型, 在论文中适当的采用一些不仅能够更直观地展现结果, 方便解读数据提供的信息, 传达自己的论点, 也可以锻炼自己图形表达的能力. 我们不能囿于工具, 只使用工具所支持的绘图类型, 而是要学着像设计师一样, 根据数据和要表达论点, 来设计一下采用哪种绘图方式更容易让人明白和接受你的论点. 另外, 绘制漂亮美观的图形对自己也是一种奖赏, 绘制出满意的图形, 就像画家完成一幅画, 诗人写完一首诗, 作曲家谱完一首曲子, 是一件令人愉悦的事, 虽然过程可能并没有那么令人愉悦.
前段时间偶然看到一种绘图类型, 桑基图, Sankey diagram, 有各种不同的形制和变体. 思考了一下, 觉得借用这种图用来表达分子模拟中常见的能量分析比较合适, 当然, 已经有些程序是这么做的了, 因为基本思想是简单的.
gnuplot目前是不支持绘制这种图的, 除非自己手动画. 不过, 它倒是支持平行轴图, 利用这种图, 我们可以近似的表达桑基图的思想, 这里就示例说明一下吧.
平行轴图的具体说明可以参考gnuplot手册和gnuplot in action中的说明, 这里不再啰嗦. 但使用时要注意gnuplot新旧版本的语法有差别.
我们先来重复一个网上的示例图. 那里所给的脚本适用于5.2版本, 我们将它改成5.4版本的, 以测试/学习平行轴图的绘制方式.
<table class="highlighttable"><th colspan="2" style="text-align:left">pax.gpi</th><tr><td><div class="linenodiv" style="background-color: #f0f0f0; padding-right: 10px"><pre style="line-height:125%"> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51</pre></div></td><td class="code"><div class="highlight"><pre style="line-height:125%"><span></span><span style="color: #B8860B">grid_color</span> <span style="color: #666666">=</span> <span style="color: #BB4444">"#d5e0c9"</span> <span style="color: #B8860B">text_color</span> <span style="color: #666666">=</span> <span style="color: #BB4444">"#000000"</span> <span style="color: #B8860B">font_big</span> <span style="color: #666666">=</span> <span style="color: #BB4444">",105"</span> <span style="color: #B8860B">font_normal</span> <span style="color: #666666">=</span> <span style="color: #BB4444">",85"</span> <span style="color: #B8860B">font_small</span> <span style="color: #666666">=</span> <span style="color: #BB4444">",65"</span> <span style="color: #B8860B">font_smallest</span> <span style="color: #666666">=</span> <span style="color: #BB4444">",55"</span> <span style="color: #AA22FF; font-weight: bold">set</span> <span style="color: #AA22FF">palette</span> <span style="color: #00A000">defined</span> (<span style="color: #666666">0</span> <span style="color: #BB4444">'</span><span style="color: #008800; font-style: italic">#f7edf5', 0.8 '#c98abf' ,1 '#941680')</span> <span style="color: #AA22FF; font-weight: bold">set</span> <span style="color: #AA22FF">style</span> parallel lw <span style="color: #666666">1</span> <span style="color: #AA22FF; font-weight: bold">set</span> <span style="color: #AA22FF">style</span> data parallelaxes <span style="color: #AA22FF; font-weight: bold">set</span> <span style="#FF0000">pax</span><span style="color: #AA22FF">is</span> <span style="color: #666666">1</span> range [] noreverse nowriteback <span style="color: #AA22FF; font-weight: bold">set</span> <span style="#FF0000">pax</span><span style="color: #AA22FF">is</span> <span style="color: #666666">2</span> range [] noreverse nowriteback <span style="color: #AA22FF; font-weight: bold">set</span> <span style="#FF0000">pax</span><span style="color: #AA22FF">is</span> <span style="color: #666666">3</span> range [] noreverse nowriteback <span style="color: #AA22FF; font-weight: bold">set</span> <span style="#FF0000">pax</span><span style="color: #AA22FF">is</span> <span style="color: #666666">4</span> range [] noreverse nowriteback <span style="color: #AA22FF; font-weight: bold">set</span> <span style="#FF0000">pax</span><span style="color: #AA22FF">is</span> <span style="color: #666666">5</span> range [] noreverse nowriteback <span style="color: #AA22FF; font-weight: bold">set</span> <span style="#FF0000">pax</span><span style="color: #AA22FF">is</span> <span style="color: #666666">6</span> range [] noreverse nowriteback <span style="color: #AA22FF; font-weight: bold">set</span> <span style="#FF0000">pax</span><span style="color: #AA22FF">is</span> <span style="color: #666666">1</span> tics <span style="color: #666666">0.5</span> textcolor rgb text_color font font_smallest offset <span style="color: #666666">1.5</span> right format <span style="color: #BB4444">"%1.1f"</span> <span style="color: #AA22FF; font-weight: bold">set</span> <span style="#FF0000">pax</span><span style="color: #AA22FF">is</span> <span style="color: #666666">2</span> tics <span style="color: #666666">0.5</span> textcolor rgb text_color font font_smallest offset <span style="color: #666666">1.5</span> right format <span style="color: #BB4444">"%1.1f"</span> <span style="color: #AA22FF; font-weight: bold">set</span> <span style="#FF0000">pax</span><span style="color: #AA22FF">is</span> <span style="color: #666666">3</span> tics <span style="color: #666666">0.2</span> textcolor rgb text_color font font_smallest offset <span style="color: #666666">0.</span> right format <span style="color: #BB4444">"%1.1f"</span> <span style="color: #AA22FF; font-weight: bold">set</span> <span style="#FF0000">pax</span><span style="color: #AA22FF">is</span> <span style="color: #666666">4</span> tics <span style="color: #666666">2</span> textcolor rgb text_color font font_smallest offset <span style="color: #666666">1.5</span> right format <span style="color: #BB4444">"%1.0f"</span> <span style="color: #AA22FF; font-weight: bold">set</span> <span style="#FF0000">pax</span><span style="color: #AA22FF">is</span> <span style="color: #666666">5</span> tics <span style="color: #666666">10</span> textcolor rgb text_color font font_smallest offset <span style="color: #666666">1.5</span> right format <span style="color: #BB4444">"%1.0f"</span> <span style="color: #AA22FF; font-weight: bold">set</span> <span style="#FF0000">pax</span><span style="color: #AA22FF">is</span> <span style="color: #666666">6</span> tics textcolor rgb text_color font font_smallest offset <span style="color: #666666">1.5</span> right <span style="color: #AA22FF; font-weight: bold">set</span> <span style="color: #AA22FF">label</span> <span style="color: #BB4444">'</span>Design Space<span style="color: #BB4444">'</span> at screen <span style="color: #666666">0.5,0.95</span> center textcolor rgb text_color font font_big <span style="color: #AA22FF; font-weight: bold">unset</span> <span style="color: #AA22FF">key</span> <span style="color: #AA22FF; font-weight: bold">unset</span> <span style="color: #AA22FF">border</span> <span style="color: #AA22FF; font-weight: bold">unset</span> <span style="color: #AA22FF">ytics</span> <span style="color: #AA22FF; font-weight: bold">set</span> <span style="color: #AA22FF">xrange</span> [<span style="color: #666666">0.75:6.25</span>] <span style="color: #AA22FF; font-weight: bold">set</span> <span style="color: #AA22FF">xtics</span> (<span style="color: #BB4444">"P1"</span> <span style="color: #666666">1,</span> <span style="color: #BB4444">"P2"</span> <span style="color: #666666">2,</span> <span style="color: #BB4444">"P3"</span> <span style="color: #666666">3,</span> <span style="color: #BB4444">"P4"</span> <span style="color: #666666">4,</span> <span style="color: #BB4444">"P5"</span> <span style="color: #666666">5,</span> <span style="color: #BB4444">"Obj2"</span> <span style="color: #666666">6</span>) \ font font_small textcolor rgb text_color nomirror <span style="color: #AA22FF; font-weight: bold">set</span> <span style="color: #AA22FF">cbrange</span> [<span style="color: #666666">0:0.55</span>] noreverse nowriteback <span style="color: #AA22FF; font-weight: bold">set</span> <span style="color: #AA22FF">cbtics</span> font font_smallest textcolor rgb text_color offset <span style="color: #666666">-1</span> <span style="color: #AA22FF; font-weight: bold">set</span> <span style="color: #AA22FF">cblabel</span> <span style="color: #BB4444">"Efficiency"</span> font font_normal textcolor rgb text_color \ rotate by <span style="color: #666666">-270</span> offset <span style="color: #666666">-2.5</span> <span style="color: #AA22FF; font-weight: bold">set</span> <span style="color: #AA22FF">rmargin</span> <span style="color: #666666">0</span> <span style="color: #AA22FF; font-weight: bold">set</span> <span style="color: #AA22FF">bmargin</span> <span style="color: #666666">1.5</span> <span style="color: #AA22FF; font-weight: bold">set</span> <span style="color: #AA22FF">tmargin</span> <span style="color: #666666">2</span> <span style="color: #AA22FF; font-weight: bold">plot</span> <span style="color: #BB4444">"GenValid.csv"</span> <span style="color: #AA22FF">u</span> <span style="color: #666666">6:0</span> lw <span style="color: #666666">.01</span> lc pal<span style="color: #666666">,</span> \ <span style="color: #BB4444">''</span> <span style="color: #AA22FF">u</span> <span style="color: #666666">10,</span> \ <span style="color: #BB4444">''</span> <span style="color: #AA22FF">u</span> <span style="color: #666666">9</span> <span style="color: #666666">,</span> \ <span style="color: #BB4444">''</span> <span style="color: #AA22FF">u</span> <span style="color: #666666">7</span> <span style="color: #666666">,</span> \ <span style="color: #BB4444">''</span> <span style="color: #AA22FF">u</span> <span style="color: #666666">8</span> <span style="color: #666666">,</span> \ <span style="color: #BB4444">''</span> <span style="color: #AA22FF">u</span> <span style="color: #666666">5</span></pre></div> </td></tr></table>新脚本中主要清除了无关的选项, 调整了字体大小和线宽. 因为我所用的默认设置与示例有所不同. 绘制的基本的效果是一样的, 是使用颜色表示线的强度.
理解了这种绘图方式之后, 我们就用它来绘制氢键分析数据. 在常规的MD分析中, 特别是使用AMBER的那些论文中, 常会有一个氢键分析表格, 列出所有比较重要的氢键, 给出施体/受体原子, 以及相应氢键在轨迹中的占有率. 我写过一个脚本gmx_hbdat, 可以基于GROMACS的氢键分析结果统计出类似的结果. 这种表格数据很多, 适合用于详细的对比, 但很不直观. 我们可以将它绘制成平行轴图, 只需要两个平行轴, 都代表残基编号或原子编号, 中间的连线代表氢键, 并用连线的颜色或宽度来表示氢键的占有率. 这样看一眼图, 就可以很直观地了解哪些氢键是主要的.
下面是一个示例, 1crn
小蛋白水盒子, 简单模拟几个ns, 然后gmx hbond
分析氢键, gmx_hbdat
统计氢键信息, 根据统计结果将施体/受体原子所属残基抽取出来, 因为我后面使用残基编号来绘制, 而不是用原子编号. 基本数据类似
#Donor Hydrogen Acceptor Occupancy%
1 THR 1 THR 1 THR 0.3
1 THR 1 THR 1 THR 0.1
1 THR 1 THR 2 THR 0.2
1 THR 1 THR 23 GLU 1.3
1 THR 1 THR 35 ILE 45.0
1 THR 1 THR 36 PRO 2.5
1 THR 1 THR 37 GLY 0.2
1 THR 1 THR 1 THR 0.1
使用下面的脚本来绘制平行轴图, 并使用颜色映射氢键占有率的大小, 因为gnuplot的平行轴图无法方便地改变线宽.
实际上, 对于这种只有两个轴的平行轴图, 使用常规的绘图方式来近似可能更容易, 只要在相应点之间绘制连线即可. 借助gnuplot提供的向量绘制方法, 我们很容易使用线宽来表示氢键的占有率.
论文图形的特点是精确, 自明, 信息丰富. 要想在上面的氢键分析图中提供更多信息, 可以将结构信息也集成进去. 比如, 对蛋白, 可以给出每个残基的名称(单字母或三字母), 每个原子的名称, 以及相应的二级结构, 甚至画上二级结构的示意图, 类似我以前的做法; 对配体, 可以给出原子名称. 即便这样, 比起类似LigPlot的图来说, 还是有所差距, 但好在可以显示所有可能的相互作用.
当然, 这种图也可以作成圆形的, 类似网络图, 但gnuplot暂时不支持这种圆形绘图模式, 只能自己画, 就先不考虑了.