仓库源文站点原文

较现代的数据分析和绘图工具中提供了很多新的绘图类型, 在论文中适当的采用一些不仅能够更直观地展现结果, 方便解读数据提供的信息, 传达自己的论点, 也可以锻炼自己图形表达的能力. 我们不能囿于工具, 只使用工具所支持的绘图类型, 而是要学着像设计师一样, 根据数据和要表达论点, 来设计一下采用哪种绘图方式更容易让人明白和接受你的论点. 另外, 绘制漂亮美观的图形对自己也是一种奖赏, 绘制出满意的图形, 就像画家完成一幅画, 诗人写完一首诗, 作曲家谱完一首曲子, 是一件令人愉悦的事, 虽然过程可能并没有那么令人愉悦.

前段时间偶然看到一种绘图类型, 桑基图, 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暂时不支持这种圆形绘图模式, 只能自己画, 就先不考虑了.