科学可视化:Python和Matplotlib(英文原名:Scientific Visualization: Python + Matplotlib)阅读记录【第4章】

本文是阅读《科学可视化:Python和Matplotlib》(英文原名:《Scientific Visualization: Python + Matplotlib》)的记录,书和代码均为开源。请添加图片描述

第0章 引言(Introduction)

附有链接

链接

第1章 基础原理(Fundamentals)

附有链接

链接

第2章 图像设计(Figure design)

附有链接

链接

第3章 高级概念(Advanced concepts)

附有链接

链接

第4章 案例展示(Showcase)

4.1 用阴影填充轮廓(Filled contours with dropshadows)

请添加图片描述

这是一种很好的效果,允许在区分正值和负值的同时使用顺序颜色图(sequential colormap)(这里是 Viridis 颜色图)。

由上图可以看到,正值的阴影是在外的,负值的阴影是在内的。

为了实现这一结果,轮廓需要单独渲染两次。

第一步,在屏幕外渲染轮廓,并将生成的图像读入数组。

然后,使用高斯滤波器对其进行模糊处理,并对图像进行变换,使其完全变黑,但 α \alpha α 通道除外。

然后,使用 imshow 显示图像,它将与图中已经呈现的元素优雅地融合在一起。

最后,使用颜色图添加相同的轮廓,并迭代这个过程。

诀窍是从下到上开始,让阴影保持可见。

4.2 域着色(Domain coloring)

请添加图片描述

域着色是一种“通过给复平面的每个点赋予颜色来可视化复函数的技术。通过给复平面上的点赋予不同的颜色和亮度,域着色可以很容易地表示和理解四维复函数。这提供了对复函数流动性的洞察,并显示了实函数的自然几何扩展”(来自维基百科)。

上图表示域 [ − 2.5 , 2.5 ] 2 [-2.5,2.5]^2 [2.5,2.5]2 中的虚函数 z + 1 / z z+1/z z+1/z

使用(复数)结果的角度来设置颜色,使用绝对余弦来周期性地调节它的范数。

本可以使用循环颜色图(cyclic colormap),如 twilight,但本书作者认为 Spectral 在视觉上更令人愉悦,尽管它会引起一些不连续性。

为了绘制网格,在实域和虚域中使用整数值的等高线图。

4.3 埃舍尔式映射(Escher like projections)

请添加图片描述

这可以利用复杂的指数函数和一些可以很容易计算的特定周期来获得。

上图是本书作者主要参考滑铁卢大学教授 Craig S. Kaplan 在其博客文章 Escherlike Spiral Tilings (2019) 中的解释。

制作此图的唯一困难就是线的粗细。如果把这个图像和以前的图像进行比较,会发现在以前的图像中,线的粗细是恒定的,而在此图中,线的粗细是变化的。

为了达到这样的效果,必须使用由几个不同粗细度的线段组成的多边形。这并没有真正的困难,只是一些几何计算。

4.4 自组织映射(Self-organizing maps)

请添加图片描述

自组织映射(Self-organizing map,SOM)“是一种人工神经网络,它使用无监督学习来训练,以产生训练样本输入空间的低维(通常是二维)离散表示,称为映射(map),因此是一种降维方法”(来自维基百科)。

本书作者和 Georgios Detorakis 一起开发了一个基于神经元蓝噪声分布的随机 SOM

上图显示了当输入随机 RGB 颜色时的 SOM。此图本身由一个多边形集合组成,其中每个多边形都涂有神经元的颜色。这并不难,但必须注意禁用抗锯齿(antialias),否则多边形之间会出现细线。

代码地址(并非本书 GitHub 项目地址)

4.5 瀑布图(Waterfall plots)

请添加图片描述

瀑布图“是一种三维图,其中同时显示了多条数据曲线,通常是光谱。通常,曲线在屏幕上和垂直方向上交错排列,‘较近’的曲线掩盖了后面的曲线。结果是一系列并排的‘山’形状。瀑布图通常用于显示二维信息随时间或其他变量的变化”(来自维基百科)。

为了制作此图,使用 3D axis 和多边形(即未填充的 plot)。

使用多边形的原因是为了在每条曲线上获得颜色渐变效果。做到这一点的唯一方法(据本书作者所知)是将每条曲线水平切片为几个条纹,并使用特定颜色渲染切片。

困难在于计算那些不规则的切片,这就是使用 Shapely 库的原因,该库允许计算多边形之间的交点。

4.6 流线图(Streamlines)

请添加图片描述

流线图是“一族与流速矢量瞬时相切的曲线。这些曲线显示了一个无质量流体元素在任意时间点上的运动方向”(来自维基百科)。

上图展示了这样的流线,实际上是一幅来自动画的截屏。

每条流线被分割成线段,并聚集在一个线集合中,使得每条线段都有自己的颜色。由此可知,利用梯度很容易给出水流方向。

注意,可以对所有的流线使用单独的线集合。奇怪的是,这个图像中唯一的难点是线圆帽(line round cap)。根据这里解释的原因,不得不创造一个特定的图形语境,比如有圆形的帽子(have round caps)。

4.7 曼德布洛特集(Mandelbrot set)

请添加图片描述

Mandelbrot集“是复数 c c c 的集合,其从 z = 0 z=0 z=0 迭代时不发散,即序列 f c ( 0 ) f_c(0) fc(0) f c ( f c ( 0 ) ) f_c(f_c(0)) fc(fc(0)) 等保持绝对有界”(来自维基百科)。

为了绘制上图,使用了一个带有阴影和归一化重新计数的常规 imshow,在 Smooth Shading for the Mandelbrot Exterior 这篇文章中进行了解释。该脚本也出现在本书作者几年前贡献的 matplotlib 图库中。

4.8 递归 Voronoi 图(Recursive Voronoi)

请添加图片描述

这个递归 Voronoi 集(recursive Voronoi set)的设计非常痛苦,因为它需要一些非常精确的设置来获得一个美丽的结果。

这些设置是具有良好视觉特性的随机点的放置,为此,使用了 Robert Bridson 的快速泊松盘采样(Fast Poisson Disk Sampling),它简单快捷。

还广泛地使用 shapey 库来裁剪不同的多边形,同时如何在多边形内绘制随机点。

最后,使用线条粗细、多边形颜色和透明度来实现这个结果,涉及 5 个级别的递归。在本书作者的电脑上,计算大约需要 1 分钟。

4.9 三维高度图(3D Heightmap)

请添加图片描述

圣海伦斯火山(Mount St Helens)爆炸后的 3D 高度图。

用本书作者的 experimental 3D axis 制作的。

没有什么真正复杂的,只是有点慢,因为需要对一堆三角形进行排序。

4.10 Voronoi 马赛克(Voronoi mosaic)

请添加图片描述

此图基于蓝色噪声分布,其中每个 Voronoi 单元都是根据原始图像中 Voronoi 单元格中心的颜色绘制的。这导致了廉价的彩色玻璃窗效果。

4.11 阴影文本(Text shadow)

请添加图片描述

此图比看起来更难设计。

从一个文本路径对象开始,在构成路径的片段上迭代,以创建构成阴影的剪切矩形。

为了使阴影在背景中消失,使用半透明颜色(顶部完全透明,底部完全不透明)创建了一个具有垂直渐变的图像,这会产生很好的渐变阴影效果。

4.12 螺旋文本(Text spiral)

请添加图片描述

此图是用阿基米德螺旋(Archimedean spiral) ( r = a + b θ ) (r=a+b\theta) (r=a+bθ) 制作的。

该螺旋线保证沿着以恒定角速度旋转的直线保持恒定的速度,换句话说,螺旋的连续转弯具有恒定的间隔距离。

从表示 π \pi π(使用 mpmath 库)的一些小数的很长的文本路径开始,只需将顶点变换为螺旋线即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值