计算化学公社

 找回密码 Forget password
 注册 Register
Views: 1707|回复 Reply: 5
打印 Print 上一主题 Last thread 下一主题 Next thread

[VMD] 用matplotlib或gnuplot给VMD定义渐变色标尺

[复制链接 Copy URL]

881

帖子

3

威望

1664

eV
积分
2605

Level 5 (御坂)

傻傻的木瓜

本帖最后由 Uus/pMeC6H4-/キ 于 2025-1-11 17:10 编辑

用matplotlib或gnuplot给VMD定义渐变色标尺
Defining gradient color scale for VMD using matplotlib or gnuplot
Uus_pMeC6H4- | Init post 2025-01-08 / Last edit 2025-01-11


一、前言

If you're feeling lonely and you're still searching for your true friends, just look up in the sky. Who knows? Maybe you and your future best friends are all looking at the same rainbow.

1.9.3版VMD可绘制的颜色共有1057种,其中0-32号这33种为给定RGB的有名颜色,33-1056号这1024种为线性组合起中末三色RGB产生的渐变色,每种颜色的RGB值均由三个0到1的浮点数定义;颜色的定义可在VMD的Graphics - Colors窗口设置,或在VMD的命令行用colorinfo指令查询、color指令修改。目前仍在开发中的1.9.4版VMD扩展了颜色支持,可对比在此帖5楼和6楼展示的,分别对应于1.9.3版和1.9.4版颜色设置窗口的截图。

然而1.9.3版VMD因稳定性更佳仍广泛使用,此时内置的颜色略显不足,需要编写tcl脚本修改。比如,为使原子按元素着色,社长的在VMD中使用GaussView的元素着色的方法http://sobereva.com/652)提供了gview_color.tcl以修改101-211号颜色,而slxc920113的VMD使用Jmol风格的颜色策略提供了JmolColor.tcl以修改101-195号颜色。又比如,为使蛋白质结构按原子序号着色,ene在在VMD中以PyMOL rainbow着色风格绘制蛋白质结构提供了pymol_rainbow.tcl(更新为rainbow_v2.tcl)以修改渐变色。

VMD内置的渐变色方案种类偏少,起中末三色选择仅限于红绿蓝白灰黑的几个搭配。另一个可视化程序OVITO虽然内置也不多,但亦可加载外部图像定义渐变色来扩展可能性。而且VMD混色模式的算法亦不合理,正如liyuanhe211在用 PyMOL 渲染 HSV 混色模式的 RDG 填色等值面图所言,VMD和PyMOL的线性加权平均混色模式会导致部分颜色显得暗、“污”,但PyMOL可定义任意多颜色节点来产生渐变色来间接解决,而VMD自己只能定义起中末三个。同样是RDG分析,欧拉角在[Quantum ESPRESSO] 固体和表面的非共价相互作用分析一帖采用的是VESTA按内置的彩虹渐变色方案绘制填色等值面,以及matplotlib用jet渐变色方案绘制散点图;VESTA可在Properties - Sections的Sections and slices区设置渐变色,内置方案总体也比VMD的明亮些。

本帖将介绍如何用matplotlibgnuplot这两种常用科学绘图工具定义渐变色,载入VMD替换内置方案获得更好的绘制效果。相关脚本在下述文件包里已提供,后缀为.py的是python脚本,.gp的是gnuplot脚本。使用前放入VMD目录,这样方便在VMD的命令行找到执行脚本产生的文件。脚本是在Windows下写的,如果放到Linux系统下可能需要chmod添加权限和sed -i "s/\r$//"修改换行符等操作。
extcolor.zip (2.28 KB, 下载次数 Times of downloads: 34)

与颜色相关的知识纷繁复杂,推荐阅读ColorFAQ及其Other Color Links ...里链接的众多网页。

二、用matplotlib定义渐变色

matplotlib在已安装python的系统中用python -m pip install matplotlib即可安装,官网上专门详细讲解了颜色定义与使用。matplotlib一般结合numpy使用,若安装matplotlib时还没有numpy也会顺便装上。matplotlib既有内置的渐变色方案,也有借助任意长度列表创建ListedColormap或LinearSegmentedColormap来定义新渐变色方案的方法。

文件包中make_palette.py脚本有下述语句,即直接调用内置的名为rainbow的渐变色方案。
  1. import matplotlib as mpl
  2. ...
  3. name = "rainbow"
  4. cmap = mpl.colormaps.get_cmap(name)
复制代码
旧版matplotlib调用内置方案的一种写法如下所示,然而从3.7版开始matplotlib会警告即将弃用,并提示新版的写法。
  1. import matplotlib.cm as cm
  2. ...
  3. name = "rainbow"
  4. cmap = cm.get_cmap(name)
复制代码
  1. The get_cmap function was deprecated in Matplotlib 3.7 and will be removed in 3.11. Use ``matplotlib.colormaps[name]`` or ``matplotlib.colormaps.get_cmap()`` or ``pyplot.get_cmap()`` instead.
复制代码
在命令行运行python make_palette.py,提示Color palette with 1024 discrete colors saved to "rainbow.vmd".并产生rainbow.png和rainbow.vmd两个文件。其中rainbow.png给出渐变色中RGB分量和按NTSC系数线性组合所得视亮度brightness随灰度在0到1之间变化的曲线,并绘制水平的渐变色条。

另一个文件rainbow.vmd包含了渐变色中所有1024个RGB值,已按VMD命令格式整理成脚本,开头和结尾是这样的。
  1. color change rgb 33 0.50000 0.00000 1.00000
  2. color change rgb 34 0.50000 0.00000 1.00000
  3. color change rgb 35 0.50000 0.00000 1.00000
  4. color change rgb 36 0.50000 0.00000 1.00000
  5. ...
  6. color change rgb 1053 1.00000 0.00000 0.00000
  7. color change rgb 1054 1.00000 0.00000 0.00000
  8. color change rgb 1055 1.00000 0.00000 0.00000
  9. color change rgb 1056 1.00000 0.00000 0.00000
复制代码
此时在VMD命令行内输入source rainbow.vmd,渐变色方案立刻生效。

注意到上面rainbow.png中的曲线略微不光滑,rainbow.vmd中记录的每个RGB值都重复了四遍。由于matplotlib内置的rainbow渐变色方案只有256个RGB值不同的颜色(定义cmap后用cmap.N可查),并且将0到1的灰度映射到RGB时采用最近邻插值,按VMD所需的1024个RGB来超采样就会有此问题。其他连续过渡的渐变色方案也可能如此,但总体来说,肉眼观察VMD绘制效果时此问题影响并不比灯光、视角等其他因素明显。

如果一定要RGB曲线光滑、颜色不重复,一种方法是定义内置方案后把颜色的列表传给LinearSegmentedColormap.from_list(),自动用线性插值重新产生渐变色。
  1. import matplotlib as mpl
  2. import matplotlib.colors as co
  3. import numpy as np
  4. ...
  5. cmin = 33   # vmd > colorinfo num
  6. cmax = 1057 # vmd > colorinfo max
  7. cnum = cmax - cmin
  8. ...
  9. name_orig = "rainbow"
  10. cmap_orig = mpl.colormaps.get_cmap(name_orig)
  11. cmap = co.LinearSegmentedColormap.from_list(
  12.     "rainbow_linear_interpolated",
  13.     cmap_orig(np.linspace(0, 1, cmap_orig.N)),
  14.     N=cnum)
  15. name = cmap.name
复制代码
from_list()强制首个参数为渐变色方案名称,自行起名即可;第二个参数若只传颜色的列表,则对应的灰度默认均匀分布,也可以传灰度和颜色的组合的列表来让灰度非均匀分布。参数之间的断行并非语法要求而是出于习惯。(LinearSegmentedColormap其实不用from_list()也可以写,对RGB每个分量分别创建灰度节点及其值的列表,组成字典并传给segmentdata;这样不同分量可按不同节点分段、节点左右也可跳变,但是更复杂些,看官网示例。)

另一种方法是,鉴于rainbow渐变色方案的数学函数定义已知且很简单,直接产生1024个RGB值的列表并传给ListedColormap来产生渐变色。这里cgry是0到1均匀采样的灰度组成的列表,三个函数以灰度为自变量计算RGB三个分量,最后用np.column_stack()构成ListedColormap所需的有三列的列表。此处省略表示透明度的第四列,颜色均默认不透明,毕竟导出给VMD用的.vmd脚本也用不上透明度。
  1. import matplotlib.colors as co
  2. import numpy as np
  3. ...
  4. cmin = 33   # vmd > colorinfo num
  5. cmax = 1057 # vmd > colorinfo max
  6. cnum = cmax - cmin
  7. cgry = np.linspace(0, 1, cnum)

  8. cmap = co.ListedColormap(np.column_stack((
  9.         np.minimum(np.abs(2*cgry-0.5), 1),
  10.         np.sin(np.pi*cgry),
  11.         np.cos(0.5*np.pi*cgry)
  12.         )))
  13. name = "rainbow_true"
复制代码

以上即为matplotlib的三种渐变色自定义方式,可按需使用。如果定义cmap_orig渐变色后想反转作为cmap,一般可以用cmap = cmap_orig.reversed()这种写法,而内置方案只需给名称加上_r后缀来用。

顺便说一句,Palettable是一个定义了大量渐变色方案的外部python库,进一步丰富了matplotlib作图的风格选择。用python -m pip install palettable安装后,在python脚本里以import palettable as pt调用。如取用来自CartoColors、类型为Sequential、名称为Purp_7的渐变色方案,即定义cmap = pt.cartocolors.sequential.Purp_7.mpl_colormap,后续使用与matplotlib自己定义的cmap一致。

三、用gnuplot定义渐变色

gnuplot可以从sourceforge下载,目前最新版为6.0版,而非gnuplot homepage链接的Download页那样停留在5.4版。gnuplot中定义渐变色方案的语句为set palette开头,其中set palette mode设置颜色的模式,可以为RGB、HSV、CMY,默认为RGB。注意不同模式对分量的解读差异,比如0 1 1在RGB模式下指绿蓝加法混色所得青色,在HSV模式下是最大饱和度的红色,除此之外混色算法也有关键差异。

set palette的不同模式列举如下,具体格式和一些例子可在gnuplot手册中找到。
  • defined 定义灰度节点及相应颜色,按线性插值产生中间颜色。
  • file 同上,但是颜色定义从外部文件导入,可以从多列数据中选择。
  • rgbformulae 定义三个内置函数编号,以灰度为自变量产生三个分量各浮点数值。
  • functions 同上,但是函数形式可自定义,其中灰度这个自变量写作gray。
  • cubehelix 一类视亮度随灰度单调递增的渐变色方案,有几个参数可调。
  • viridis 一种蓝到黄的渐变色方案,设计理念是对色盲色弱者友好,在6.0版gnuplot新增。

其中rgbformulae的编号对应的函数表达式可用show palette rgbformulae查,比如前文所述rainbow渐变色对应于编号33,13,10,这也是文件包中make_palette.gp的渐变色定义。定义好渐变色后,用show palette可输出渐变色的信息,test palette可绘制RGB曲线和水平渐变色条并以set terminal设定的格式输出,参考维基百科Color gradient页所用例图的信息。

在命令行运行gnuplot make_palette.gp,输出的rainbow.png和rainbow.vmd与上面matplotlib的类似,但还多一个.tmp后缀的文件,命令行有提示。此文件也包含1024个RGB值,与.vmd里完全一致,当成临时文件删除即可。具体而言,make_palette.gp先定义渐变色及其上限1024个颜色,输出到此临时文件后再重新读取,这样产生的图像中渐变色条更佳,也能按VMD命令格式整理好颜色定义。这种曲折的实现是因为gnuplot的test palette有功能限制,本来执行此语句时灰度、RGB分量和NTSC会记录于内存的数据块$PALETTE以供调用,但无论颜色如何定义都只能采样256个不同的RGB值,也即能用$PALETTE[n]读取的颜色信息仅限于n从1到256。test palette的另一个小问题是输出的图像格式固定,gnuplot脚本不像前面python脚本那样有一堆设置可调整作图效果,如果想用set colorbox等改变效果需重写脚本另外作图。gnuplot给rainbow渐变色输出的RGB和NTSC曲线如下图所示,和上面matplotlib只有些细节不同。


小结一下,无论是matplotlib还是gnuplot,给VMD定义渐变色并应用的步骤为:

  • 下载上述文件包,放入VMD所在目录,即VMD命令行中输入pwd返回的路径;
  • 用文本编辑器打开脚本,修改# Define color map and name of files below注释下面的渐变色定义和名称(例如名称叫rainbow);
  • 在命令行切换到VMD目录后运行脚本,获得后缀分别为.png和.vmd的两个文件(例如rainbow.png和rainbow.vmd);
  • 启动VMD并在其命令行source上述.vmd脚本(例如source rainbow.vmd);
  • 从VMD中Graphics - Colors打开Color Controls窗口切换到Color Scale,如显示的渐变色条与上述.png图像一致即为成功;
  • 添加着色方式采用渐变色的显示方式,等等。

如果希望每次启动VMD默认就用脚本里的渐变色方案,只需要将第四步的source指令加入vmd.rc(或.vmdrc)里,不过需要注意些兼容性问题,最后一节会说。现在先看几个例子。

四、效果展示

下图是用rainbow渐变色方案按Index着色的蛋白质。此结构是VMD自带proteins文件夹下的示例brH.pdb,用NewCartoon风格绘制。

虽然rainbow渐变色方案与ene的帖子实现的Pymol彩虹色风格仍有些差异,但总体效果还是不错的。

下图是用turbo渐变色方案按静电势着色的分子范德华表面。在B3LYP/6-311G(d,p)级别下优化2-氰基胍(又称双氰胺),无振动虚频的结构中两个胍氨基皆非平面。将.chk文件转为.fch后,按社长博文使用Multiwfn+VMD快速地绘制静电势着色的分子范德华表面图和分子间穿透图(含视频演示)http://sobereva.com/443)的方法用Multiwfn计算电子密度和静电势,并用ESPiso.vmd将所得.cube文件载入VMD,调节渐变色对应的数值下上限为-0.06到0.06 a.u.即为此效果。

可见即使不专门使用开发中的1.9.4版VMD,也完全能用丰富的色彩展示静电势的细节。turbo方案来自matplotlib内置,在上图中由蓝到红对应静电势从负到正;如果想像一些文章那样用红色代表负值、蓝色代表正值,把名称改成turbo_r来运行make_palette.py。
注意修改脚本!Multiwfn附带的ESPiso.vmd(及ESPpt.vmd)脚本有一行为color scale method BWR,必须事先替换成上述第四步的source指令,才能在使用ESPiso.vmd时应用外部定义的turbo渐变色。使用Multiwfn做Hirshfeld surface分析直观展现分子晶体和复合物中的相互作用http://sobereva.com/701)所使用的hirsh_rho.vmd、使用Multiwfn通过局部电子附着能(LEAE)考察亲核反应位点、难易及弱相互作用http://sobereva.com/676)所用的LEAE_isoext.vmd等同理。

下二图是用蓝绿红渐变色按sign(λ_2)ρ着色的IRI等值面图与相应填色散点图。在B3LYP-D3(BJ)/6-311G(d,p)级别下优化季戊四醇某个构象,无振动虚频的结构中两个羟基取向可形成分子内氢键。将.chk文件转为.fch后,按社长博文的方法用Multiwfn计算IRI,并用IRIfill.vmd将所得.cube文件载入VMD,调节等值面的isovalue为1.15即为此效果,同时还用IRIscatter.gnu绘制彩色散点图。



社长开发的Multiwfn所实现的NCI/aNCI(http://sobereva.com/68http://sobereva.com/186http://sobereva.com/591)、IRI(http://sobereva.com/598)、IGM/aIGM(http://sobereva.com/407)、IGMH(http://sobereva.com/621)等波函数分析方法均可按sign(λ_2)ρ着色等值面,在Multiwfn的examples文件夹内附带相关VMD等值面绘制脚本和gnuplot散点图作图脚本(http://sobereva.com/399),其采用的蓝绿红渐变色形象表现了相互作用从显著吸引到显著排斥的过渡,不过获得高质量等值面图像比较有讲究(http://sobereva.com/291)。现在除了Pymol渲染外,用VMD也能实现了。
注意修改脚本!下面以IRI为例说明,但同样适用其他几个方法。Multiwfn附带的IRIscatter.gnu里定义渐变色方案的这一行
  1. set palette defined (-0.04 "blue",0 "green", 0.02 "red")
复制代码
应当改成下述写法
  1. set palette model HSV defined (-0.04 2/3.0 1 1, 0 1/3.0 1 1, 0.02 0 1 1)
复制代码
这正是以HSV混色模式产生蓝绿红渐变色的写法,除上下限数值稍宽外与liyuanhe211在Pymol渲染一帖中的建议相符,饱和度和明度均拉满。把同样的渐变色方案放到make_palette.gp里,名称取为hsv-bgr,运行gnuplot make_palette.gp即可获得hsv-bgr.vmd。而IRIfill.vmd有下面这两行
  1. color scale midpoint 0.666
  2. color scale method BGR
复制代码
和ESPiso.vmd的处理一样,必须事先注释掉并加上source语句。
  1. #color scale midpoint 0.666
  2. #color scale method BGR
  3. source hsv-bgr.vmd
复制代码
然后打开VMD并在命令行输入source IRIfill.vmd,即获得上述图像,可见十分美观,相比旧有蓝绿红方案更加鲜亮。同样是从0到正值的一段,HSV混色模式下绿黄红过渡比RGB混色模式下绿棕红过渡要顺眼得多。现在有了hsv-bgr.png和填色散点图右边的渐变色条,可以参照Multiwfn自带的IRI_colorbar.png编辑,添加文字来说明颜色与相互作用类型的关系。
snljty在这帖这帖也提供了matplotlib绘制填色散点图的方案,但用的是LinearSegmentedColormap产生蓝绿红渐变色,也就是原始的RGB混色模式的效果。相比gnuplot,用matplotlib定义HSV混色模式的蓝绿红渐变色稍微复杂些,一个是需要自行把-0.04到0.02的区间归一化,再一个是HSV和RGB需通过rgb_to_hsv()和hsv_to_rgb()来转换,具体写法如下所示。
  1. import matplotlib.colors as co
  2. import numpy as np
  3. ...
  4. cmin = 33   # vmd > colorinfo num
  5. cmax = 1057 # vmd > colorinfo max
  6. cnum = cmax - cmin
  7. cgry = np.linspace(0, 1, cnum)

  8. colors_rgb = np.array([
  9.     [0.0, 0.0, 1.0],
  10.     [0.0, 1.0, 0.0],
  11.     [1.0, 0.0, 0.0]
  12. ])
  13. nodes = [-0.04, 0, 0.02]
  14. colors_hsv = co.rgb_to_hsv(colors_rgb)
  15. nodes_normal = (nodes - np.min(nodes))/(np.max(nodes) - np.min(nodes))
  16. colors_hsv_full = np.column_stack(
  17.     [np.interp(cgry, nodes_normal, colors_hsv[:,c]) for c in range(3)])
  18. colors_rgb_full = co.hsv_to_rgb(colors_hsv_full)
  19. cmap = co.ListedColormap(colors_rgb_full)
  20. name = "hsv-bgr"
复制代码


五、总结

以上便是利用matplotlib和gnuplot给VMD定义渐变色的讲解。二者在这方面的功能上大致相当,比如常见的单个颜色都可以用浮点型分量、十六进制色号、名称来定义,产生渐变色的方式都支持直接列表和线性插值。不过matplotlib内置的方案多些,利用numpy的数组操作还能方便地定义不同渐变色方案的拼接融合。

网上还有很多渐变色方案库,比如NCL Graphics: Color Table Gallery,只要能获得颜色分量或其与灰度的函数关系,都可以用matplotlib或gnuplot处理以载入VMD,注意对凑不够1024个RGB值的情况要自行插值补全。

如果担心应用外部渐变色与其他VMD操作冲突,可以看一看下面的列表。
  • 可兼容:绘制颜色标尺的内置插件。从Extensions - Visualization - Color Scale Bar启用此插件后,可按渐变色绘制颜色标尺。此插件的原始脚本在VMD目录下plugins/noarch/tcl/colorscalebar1.4/colorscalebar.tcl,可见绘制原理是取colorinfo num和(colorinfo max减一)之间的颜色,逐条画细线叠加成渐变色条。不过既然渐变色方案都是外部定义的,不如直接在外部产生颜色标尺,这样对小数位数、科学计数法、单位等格式的调节灵活度更高,也免得像这帖这帖一样折腾tcl脚本。
  • 可兼容:Throb着色方式。用Throb着色的显示方式会按wall clock time闪烁,即根据渐变色方案实时更新图形窗口里的颜色,达到高亮的突出效果。不过所有Throb任何时刻都是同一颜色,闪烁是没有相位差的。
  • 可兼容:VolumeSlice的绘制方式。与填色等值面类似,填色截面图也是常用的观察格点数据(体数据)的方式,同样支持按渐变色着色。不过VMD的填色截面图不甚理想,用VESTA或直接在Multiwfn里观察效果更佳。
  • 可兼容:调整显示方式的颜色标尺数据范围。从Graphics - Representations打开Graphical Representations窗口切换到Trajectory修改Color Scale Data Range,或者等价地在命令行用mol scaleminmax指令,不影响渐变色方案本身的颜色。
  • 可兼容:绘图命令的颜色设置。graphics或者draw命令可以设置绘制的线、球、柱、锥等对象的颜色,指定在33-1056号之间即使用渐变色的定义。
  • 无关:绘制颜色方案的另一个内置插件。Extensions - Visualization - PaletteTool可以启用另一个插件,与上面Color Scale Bar很容易搞混,这个插件并不涉及渐变色。此插件的原始脚本在VMD目录下plugins/noarch/tcl/palettetool1.0/palettetool.tcl,可见其绘制的颜色全在colorinfo num以内,即VMD内置的给定RGB的颜色。
  • 无关:修改背景色。虽然图形窗口的背景也可显示为渐变色,但这是定义顶上和底下两个端点的颜色后线性混色自动产生的,无法修改中间的RGB或者混色的方式,因而不涉及外部定义的渐变色。
  • 无关:修改按类别着色的若干方式。在VMD目录下scripts/vmd/colordefs.dat定义了按名称、元素、残基名等类别着色的定义,一看就知道是用的colorinfo colors列举的有名颜色,不涉及渐变色。
  • 不兼容:修改渐变色的Method、Offset、Midpoint。无论是在Color Controls窗口操作还是等价地在命令行用color scale <method|midpoint|min|max>指令,都会退回VMD内置方案而覆盖载入的渐变色定义。这也是为什么上面的例子要修改ESPiso.vmd和IRIfill.vmd。
  • 不兼容:ColorID着色方式。修改显示方式为ColorID着色时,Graphical Representations没法指定33号及以上的数,而在命令行用脚本指定时与指定32号是一个效果,没法用渐变色。
  • 不兼容:其他可能涉及颜色修改的VMD脚本。如前文提到的按元素着色的脚本也要改动33-1056号颜色的一部分,显然不便同时使用。

还有一条不好放在列表里的是外部渲染器导出图像。VMD的图形窗口是基于OpenGL的,因程序算法设计、渲染选项等不同,渲染结果可能与VMD图形窗口显示有所偏差,当然此问题会影响画面所有内容而不只是渐变色。用Snapshot直接导出截图的效果与图形窗口完全一致,但是又容易有“不清晰”的问题,解决方法参考社长的谈谈与计算化学有关的作图的图像清晰问题http://sobereva.com/607)。至于外部渲染器,1.9.3版VMD的相关接口也存在局限性,如给POV-Ray或Wavefront OBJ渲染的文件缺失信息,使渲染出的等值面只有灰白色,参考邮件列表这条这条讨论串。社长在用Multiwfn+VMD做RDG分析时的一些要点和常见问题http://sobereva.com/291)推荐的外部渲染器是VMD自带的Tachyon,其渲染效果总体比Snapshot直接截图要好,而且对渐变色的展示也比较符合原始定义,所以渲染上面的例图都是用的Tachyon。

利用VMD、Multiwfn等软件绘图分析、发表成果时记得按要求引用。本帖谢绝搬运转载但欢迎有署名分享链接;for non-Chinese speakers, English explanation or help can be provided upon request in this thread. 掌握这个技巧,让VMD更酷20%。

评分 Rate

参与人数
Participants 13
威望 +2 eV +53 收起 理由
Reason
爱喝茶 + 5 牛!
RandomError + 5 GJ!
LittlePupil + 5 GJ!
南北多歧路 + 3 不明觉厉
叁拾叁 + 4 牛!
SiqiLee + 5 GJ!
hdhxx123 + 3 GJ!
丁越 + 5 赞!
zsu007 + 5 赞!
sobereva + 2 精品内容
Serious + 5 GJ!
imasen + 3
student0618 + 5 精品内容

查看全部评分 View all ratings

√546=23.36664289109

881

帖子

3

威望

1664

eV
积分
2605

Level 5 (御坂)

傻傻的木瓜

2#
 楼主 Author| 发表于 Post on 2025-1-10 15:46:47 | 只看该作者 Only view this author
本帖最后由 Uus/pMeC6H4-/キ 于 2025-1-11 17:11 编辑

第一篇精品帖达成,谢谢大家!这两天稍微做了点修改,补充几个刚搜索到的同样涉及渐变色绘制的讨论帖链接,以及添加一段matplotlib用HSV混色模式定义渐变色的示例,脚本也有小变动,所以顶一顶。开头和脚本里的署名是有意修改的,去掉了我现在用户名里的非ASCII字符。

gnuplot生成的.vmd脚本似乎总要在每行开头加个空格,虽然不影响使用但尝试多次也没法移除。

2025-01-11编辑:修正了一处可能引起误解的脱漏,并添加一个讲解颜色知识的外部链接。现在想来这篇帖子发得太急了,应该早点开始多打磨下的。另外我也没意识到800*800的图对论坛页面而言这么大……
√546=23.36664289109

881

帖子

3

威望

1664

eV
积分
2605

Level 5 (御坂)

傻傻的木瓜

3#
 楼主 Author| 发表于 Post on 2025-1-12 21:25:16 | 只看该作者 Only view this author
今天刚看到ggdh的这个帖子,钟老师指出VMD里有指令color scale colors <mode> <c1> <c2> <c3>可以修改内置渐变色方案的起中末所用颜色,其中mode是RWB、BGR等内置方案的名称,c1、c2、c3在0到1056号之间。这样前言里“起中末三色选择仅限于红绿蓝白灰黑的几个搭配”的描述并不完全准确,但行文不好改了,不过只有三个颜色节点来线性插值混色的结论不变。

注意这条指令和总结里列表倒数第三点是类似的,不兼容外部定义的渐变色。例如先color scale method BWR指定内置方案名为BWR,再source rainbow.vmd把颜色改成rainbow渐变色方案的,假如此时又执行color scale colors RGB 1 3 4,那么RGB方案被改成红(1)橙(3)黄(4)渐变时BWR方案也被退回内置的蓝白红渐变,rainbow.vmd失效。总之,给VMD加载外部渐变色后不能再动相关设置!

另外,Choosing Colormaps in Matplotlib介绍的matplotlib的内置渐变色方案可批量导出,以便无python情形使用。由于文件大小限制(以及懒得传网盘),按类别分成两个内容不同的独立压缩包传附件。

mpl_cm_pt1.7z (6.68 MB, 下载次数 Times of downloads: 5)
mpl_cm_pt2.7z (5.11 MB, 下载次数 Times of downloads: 6)

实际上.vmd也可以给gnuplot读取,比如用set palette model RGB file "turbo.vmd" using 5:6:7即导入gnuplot暂无的turbo渐变色方案,此处5:6:7表示RGB三个分量所在的列。
√546=23.36664289109

881

帖子

3

威望

1664

eV
积分
2605

Level 5 (御坂)

傻傻的木瓜

4#
 楼主 Author| 发表于 Post on 2025-1-18 16:50:53 | 只看该作者 Only view this author
本帖最后由 Uus/pMeC6H4-/キ 于 2025-1-20 14:27 编辑

考古中又看到这帖问了VMD如何扩展渐变色方案种类的问题,社长回复了个博客链接。此站搭载于Google Site,如今网页已失效,不过Wayback Machine能找到一份存档。今将文字内容复制如下以便参考:
Matthew Perkett wrote in Fun with VMD:
Color a protein by RMSF using a custom color scale
It is often useful to calculate the Root Mean Squared Fluctuation (RMSF) for each residue in a protein (which can also be converted the crystal B-factors) since this gives a measure of how flexible each part of the protein is.  This is easily achieved using a helper program such as g_rmsf, which is included in the Gromacs MD package.  To visualize this on the protein, you can set the beta value for each residue to the RMSF (or B-factor) and then color the protein by Beta. VMD provides a number of built-in color scales, but if you would like to use a custom color scale, you need to do a little more work.  Here I will describe how to generate a custom color scale using the output from a g_rmsf calculation.

Run the code

  • Download ms2_cc.pdb, rmsf.xvg, and colorByRMSF.vmd into the same directory.
  • Open VMD and use the TkConsole to navigate to the download directory
  • The following commands in the TkConsole will load and color the ms2_cc.pdb file
    1. mol new ms2_cc.pdb type pdb
    2. source colorByRMSF.vmd
    3. colorByRMSF top rmsf.xvg 0.05 0.4
    复制代码

syntax:
colorByRMSF <molid> <rmsf_file> <lower_bound> <upper_bound>
<molid>: the molecule ID
<rmsf_file>: the rmsf.xvg output file generated by g_rmsf from which RMSF values will be read for each atom
<lower_bound>: the minimum value for the color scale (all lower values will be set to lower_bound)
<upper_bound>: the maximum value for the color scale (all higher values will be set to upper_bound)

Setting the upper and lower bounds allows you to explicitly control the start and end of the color scale between different loaded structures.  This is necessary for comparing the plots and has the advantage of only needing a single color legend.

When run properly, you will get a structure with a custom Teal -> Orange -> Magenta color scale that looks like Fig. 1.

How does it work

The majority of the procedure colorByRMSF is reading the RMSF values into beta for each atom.  Modifying the color scale is done by invoking the procedure tricolor.  Setting a representation to color by beta value scales the beta values to correspond to color IDs between between 32 and 1056.  This procedure modifies these color IDs to have custom RGB values, which are determined by a linear interpolation between three specified colors (in this case Cyan -> Orange -> Magenta).  See the procedure tricolor for more details.

Defining custom colors and generating a legend

To generate your own custom three-color scale, you need only modify three lines to give the three RGB colors you would like to use.
  1.     set firstColor { 0.0 0.88 1.0 }
  2.     set middleColor { 1.0 0.25 0.0 }
  3.     set lastColor { 0.9 0.0 0.9 }
复制代码

To do this, it is useful to use Mathematica to determine the desired RGB values and also generate a color scale.  The notebook colorSlider.nb (generated in Mathematica 10), will allow you to select different colors and determine their RGB values.  You can then copy these RGB values to the variables c1, c2, c3 to generate a custom color scale bar.  

It is simple to modify these procedures to work with other custom color functions, and you certainly are not restricted to coloring by RMSF.  For example, Fig. 2 was generated by setting beta values to the residue number.

博文相关的文件在这个压缩包里:
fun_with_vmd.7z (57.36 KB, 下载次数 Times of downloads: 4)

其中colorByRMSF.vmd的tricolor_scale也涉及渐变色的修改,不过从几个向量操作可见渐变色仍仅从三种颜色开始线性插值混色产生。另外colorSlider.nb可以转换颜色和创建渐变色标尺,然而需要用商业软件Wolfram Mathematica。不过这种“加载结构、读取数据、修改结构B因子、按B因子着色”的渐变色应用思路值得参考,正如社长开发的绘制静电势着色分子表面顶点的流程。

1月20日编辑:由于这条回复较长,把另一个话题的讨论放到新回复里了。
√546=23.36664289109

17

帖子

0

威望

974

eV
积分
991

Level 4 (黑子)

5#
发表于 Post on 2025-1-18 22:36:25 | 只看该作者 Only view this author
叹为观止
我才是旅途的终点!

881

帖子

3

威望

1664

eV
积分
2605

Level 5 (御坂)

傻傻的木瓜

6#
 楼主 Author| 发表于 Post on 2025-1-20 15:32:17 | 只看该作者 Only view this author
本帖最后由 Uus/pMeC6H4-/キ 于 2025-2-2 15:57 编辑

两天前的一段讨论值得用一条新回复解释清楚,感谢楼上的评论避免了我在连续盖楼的观感(笑)

注意到此帖的tricolor.tcl也有tricolor_scale,产生的“渐变色”方案只有三个不同的RGB值,用来给电子定域化函数(ELF)的等值面图按不同区域着色。社长曾有博文《在Chimera中用不同的颜色显示不同的等值面》(http://sobereva.com/168)和帖子[Multiwfn视频演示] 使用Multiwfn和ChimeraX绘制自定义着色的电子定域化函数(ELF)等值面图介绍了Chimera/ChimeraX里实现的方法,另外liyuanhe211也在[波函数分析交流] 分块自定义着色/隐藏 (填色) 等值面 (RDG/ELF) 区块的工具介绍了Pymol里实现的方法;但经过此帖的讨论后,Multiwfn已更新程序和辅助脚本来支持VMD实现了,详见手册4.17.10的解释。简单来说,Multiwfn在用主功能17对ELF做盆分析后,将盆导出为格点数据时用特殊选项b,同时导出ELF数据本身basinfunc.cub和monosynaptic/disynaptic/other分类的判定用basinsyn.cub;然后用examples/scripts文件夹下basinsyn.vmd脚本把两个cube文件同时载入VMD,以color scale method GWR设置渐变色方案为绿白红,按basinfunc.cub绘制等值面并按basinsyn.cub着色。

basinsyn.cub的判定作用类似于numpy数组操作经常涉及的mask,作为“掩码”或“遮罩”辅助确定主要数据的处理或展示方式,每个格点上的数据只有0,1,-1三个可能。正如本回复第一个链接里tricolor.tcl所示,按“遮罩”着色时颜色方案不需要连续渐变,少数几个离散的RGB值即足够使用;此类方案称为Qualitative colormaps,用matplotlib的ListedColormap可以创建,palettable或者pypalettes还有更多的选择。

这种思路也可以扩展到其他实空间函数:先照常用Multiwfn的主功能5计算格点数据并导出主要的cube文件,再按社长博文《使用Multiwfn做电子密度、ELF、静电势、密度差等函数的盆分析》(http://sobereva.com/179)的方法用主功能17做盆分析,用子功能-5的特殊选项a导出按盆编号给格点赋值的basin.cub(比只有0和正负1的选项b更灵活),然后根据实际着色需要适当合并编号(用文本编辑器的替换功能即可),定义相应的离散型颜色方案,最后把两个cube文件同时载入VMD并作图。当然等值面的isovalue选择就得多考虑一个问题,如果等值面太大而与盆边界相交,单个区域(在Chimera里叫blob)就会同时有两个盆对应的颜色。
√546=23.36664289109

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2025-8-12 20:25 , Processed in 0.200685 second(s), 26 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list