- 2022-04-30 09:37:59
在使用三维数据绘制热图, 高程图或形貌图(也称景观图)时, 一般会使用颜色映射. 如果所用绘图程序支持3D渲染, 可以直接绘制3D图并开启灯光进行渲染, 这样得到的图看起来更真实. gnuplot虽然支持3D绘制也可以设置灯光进行渲染, 但效果并不出众, 所以一般不怎么用它来做比较复杂的3D效果图.
以前在使用gnuplot绘制地图时, 我曾提到, 在地图绘制中常使用拟3D的作法来表现地形的高低起伏, 坡度变化. 这种图英文称为hillshade, 中译为山体阴影图, 坡度图或晕染图. 采用这种方式绘制的地图有一定的立体感, 虽然精确度相比直接的颜色映射图有所降低, 但更直观, 看起来也更精致些.
山体阴影图的具体的原理和计算方法可以参考以下资料, 这里就不多啰嗦了:
- ArcGIS中利用DEM制作立体晕渲图的说明
- GDAL使用DEM数据计算山体阴影(Hillshade)
- 使用自定义山体阴影图解地形可以在 ArcGIS Pro 中使用栅格函数以构建逼真的光线和阴影感觉
- IDRISI-ANDES教程1图像显示、计算山地阴影(HILLSHADE)及融合(Blend)
- Create a Hillshade from a Terrain Raster in Python
- Create A Hillshade From a Digital Elevation Model Using EarthPy
- Topographic hillshading
本质上, 这是一种最简单的光照模型, 模拟了平行光照射下高低山坡所留下的阴影. 我觉得将其用于MD论文中常见的自由能形貌图可能比较合适, 这样得到的图可能更直观, 效果也可能会有提升. 所以我就尝试使用gnuplot绘制这种图. 如果可行, 可以考虑将其集成到我的xpm2all
脚本中.
代码
照arcgis的说明英文 中文实现即可, 没什么难度. 需要指出的是, 对于示例说明给出的数据
2450 2461 2483
2452 2461 2483
2447 2455 2477
最后所给的结果不对, 因为有个数值代入错了.
绘制的时候涉及到不同颜色的混合. 颜色混合, 透明度混合的原理, 可以参考:
颜色的混合模式有很多, 可以参考Photoshop中的图层功能, 以下是一些说明:
gnuplot暂时不支持比较复杂的颜色混合, 需要自己写函数来实现, 具体的方法可以参考:
- Gnuplot: transparency of data points when using palette
- add transparency support to palette specification
测试
现在来看看添加山体阴影对不同数据的效果.
连续函数
\[╤ 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%.
看起来效果还可以, 比直接的填色图格调高一格吧, 用在论文中应该有一定效果.
扩展
类似这种模式的图还可以有其他的扩展, 可以参考下面的一些说明: