layout: post title: 使用gnuplot绘制山体阴影图 categories:
在使用三维数据绘制热图, 高程图或形貌图(也称景观图)时, 一般会使用颜色映射. 如果所用绘图程序支持3D渲染, 可以直接绘制3D图并开启灯光进行渲染, 这样得到的图看起来更真实. gnuplot虽然支持3D绘制也可以设置灯光进行渲染, 但效果并不出众, 所以一般不怎么用它来做比较复杂的3D效果图.
以前在使用gnuplot绘制地图时, 我曾提到, 在地图绘制中常使用拟3D的作法来表现地形的高低起伏, 坡度变化. 这种图英文称为hillshade, 中译为山体阴影图, 坡度图或晕染图. 采用这种方式绘制的地图有一定的立体感, 虽然精确度相比直接的颜色映射图有所降低, 但更直观, 看起来也更精致些.
山体阴影图的具体的原理和计算方法可以参考以下资料, 这里就不多啰嗦了:
本质上, 这是一种最简单的光照模型, 模拟了平行光照射下高低山坡所留下的阴影. 我觉得将其用于MD论文中常见的自由能形貌图可能比较合适, 这样得到的图可能更直观, 效果也可能会有提升. 所以我就尝试使用gnuplot绘制这种图. 如果可行, 可以考虑将其集成到我的xpm2all
脚本中.
照arcgis的说明英文 中文实现即可, 没什么难度. 需要指出的是, 对于示例说明给出的数据
2450 2461 2483
2452 2461 2483
2447 2455 2477
最后所给的结果不对, 因为有个数值代入错了.
绘制的时候涉及到不同颜色的混合. 颜色混合, 透明度混合的原理, 可以参考:
颜色的混合模式有很多, 可以参考Photoshop中的图层功能, 以下是一些说明:
gnuplot暂时不支持比较复杂的颜色混合, 需要自己写函数来实现, 具体的方法可以参考:
现在来看看添加山体阴影对不同数据的效果.
$$╤ z &=3 (1-x)^2 ℮^{-x^2-(y+1)^2} \ &-10 ({x/5}-x^3-y^5)℮^{-x^2-y^2} \ &-{1/3} ℮^{-(x+1)^2-y^2} ╧$$
x, y范围[-4:4], 步长0.05.
下面为绘制的原始填色图, 山体阴影图, 以及二者的混合图(填色图透明度60%).
对这种连续, 变化不显著的数据, 添加山体阴影后效果并没有太大提高.
下面是山东临沂地区的高程数据, 混合比例80%.
对这种实际地形数据, 添加山体阴影有一定效果, 毕竟这种方法就是为了更好地展示这种数据而设计的.
简单的1crn
蛋白水溶液模拟, 使用RMSD和回旋半径做分量, gmx sham
计算自由能数据. 由于模拟时间很短, 所得自由能分辨率不高, 波动很大, 所以进行了简单的平滑. 混合比例80%.
看起来效果还可以, 比直接的填色图格调高一格吧, 用在论文中应该有一定效果.
类似这种模式的图还可以有其他的扩展, 可以参考下面的一些说明: