快繪圖:通過數(shù)據(jù)可視化推動科學發(fā)現(xiàn)
介绍一下fastplotlib 是一个快速且互动的、GPU 加速的科学绘图库,它利用了 WGPU。
科学可视化很难——但这不必如此。
这里有一些使用fastplotlib库的可视化示例
为什么科学可视化如此具有挑战性?
- 高维度、大规模的数据集 — 经常跨越数太字节的数据
- 计算瓶颈 — 高效利用资源并不容易
- 有限的交互式工具 — 大多数工具设计用于静态绘图,而无法扩展到大数据
- 实时分析障碍 — 可视化跟不上现代数据生成的速度
fastplotlib,专为高性能、快速、交互式科学可视化设计的工具。
fastplotlib注:快速绘图库 (kuài sù huì tú kù)
你可以在这里找到Fastplotlib的GitHub仓库: https://github.com/fastplotlib/fastplotlib
fastplotlib
是一个基于 Python 的支持 GPU 加速的科学绘图库,非常新且开源。
一个大规模的钙成像数据集,包含相应的行为数据和下游分析。
你用 fastplotlib 可以做什么?
- GPU加速的,可视化(对于大多数用例来说,现代的集成GPU已经足够)
- 快速原型开发和算法设计
- 大规模数据的探索和快速渲染
- 创建仪器的实时采集系统
这只是精彩之处的简要介绍,远远不是详尽的列表哦。
议程接下来在本文中,我将讨论以下几点,来展示fastplotlib
的强大之处,以及它是如何通过数据可视化来促进科学发现的。
- 科学可视化不仅仅局限于静态图表
- API设计也很关键
- 充分利用新硬件同样十分重要
尽管科学可视化过去主要依赖于静态图表,但动态及交互式的可视化工具才是增强数据探索和分析的关键所在。
比如,看下面这个互动图表。
奥利维特面部数据集的交互式协方差矩阵
这个图显示了 fastplotlib
里一个简单的协方差矩阵的互动可视化。简单来说,协方差矩阵用来衡量成对随机变量是如何共同变化的。
在左侧的子图中,显示了Olivetti面部数据集的协方差矩阵。在这种情况下,协方差矩阵中的每个条目表示任意两个像素强度变化的程度。右侧的子图是从当前选定的协方差矩阵行重建的图像。我们可以通过移动选择器轻松地改变查看的协方差矩阵行。
从视觉效果上看,查看每行协方差矩阵的重构图像比单纯展示静态的协方差矩阵要清楚得多。通过观察这些重构的图像,可以感受到数据集中人脸像素强度的变化。
展示这张图的目的并不是详细分析协方差矩阵,而是展示即使轻微的互动性也能提升我们对数据的理解,最终可能改变我们未来可能采用的分析方式。
fastplotlib
的目标是通过提供一种机制来扩展科学可视化领域的范围,允许创建交互式图表,从而推动科学发现。
自从2000年代初期以来,科学可视化领域的生态圈已经有了很大的进步。
Python科学可视化生态系统的年表
如今,开源的Python可视化工具有很多。然而,对于科学家和其他用户来说,一个限制因素是学习使用这些工具的高门槛的限制。通常,用户被迫学习这些复杂的API,这使得他们难以专注于数据或研究问题等。
在 fastplotlib
中,我们希望通过一个易于使用且直观的 API 提供快速交互式可视化。
1) 数据交换
我们 API 的设计理念是,你应当只把数据视为数组,不需要考虑其他形式的数据。
如果我们的可视化数据保持熟悉的数组结构,与可视化交互就会变得更加简单。
看以下例子:
假设我们要画一个简单的正弦曲线。
import fastplotlib as fpl
import numpy as np
# 生成一些数据点
xs = np.linspace(-10, 10, 100)
ys = np.sin(xs)
data = np.dstack([xs, ys])[0]
# 创建一个图形
figure = fpl.Figure()
# 添加数据到图形中
sine_wave = figure[0, 0].add_line(data=data, thickness=10)
# 显示图形
figure.show()
简单的正弦曲线
现在,假设我们想把正弦波上的每隔两个点的颜色改为红色。如果我们把可视化中的数据视为一个数组,那么这种巧妙的索引操作和普通的 NumPy 数组操作没什么区别。
sine_wave.颜色[::3] = "红色"
# 将每第三个元素的颜色设置为红色
华丽的正弦波颜色
有了这个框架,我们可以在首次绘制图形之后对图形的不同特征(如颜色映射、颜色、数据等)进行各种动态调整。
采用这种设计方式的目标是减少使用 fastplotlib
时所需的思考负担,从而使这个库更灵活、更直观、也更容易使用,最终使这个库更灵活、更直观、也更容易使用。
活动
我们API的另一个简化部分是事件系统。通过简单的回调函数,我们可以定义图形和图表之间的事件,这使得创建和构建交互式可视化成为可能。
比如说,假设我们要定义一个简单的点击事件处理程序。我们先生成一些数据。
import fastplotlib as fpl
import numpy as np
# 生成一些圆的坐标
def make_circle(center, radius: float, n_points: int = 75) -> np.ndarray:
theta = np.linspace(0, 2 * np.pi, n_points)
xs = radius * np.sin(theta)
ys = radius * np.cos(theta)
return np.column_stack([xs, ys]) + center
circles = list()
for x in range(0, 50, 10):
circles.append(make_circle(center=(x, 0), radius=4, n_points=100))
# 创建一个图形
fig = fpl.Figure()
# 在图中添加圆的坐标
circles_graphic = fig[0,0].add_line_collection(data=circles, cmap="tab10", thickness=10)
fig.show()
简单圆圈图
既然我们已经生成了数据,可以定义一个点击事件,这样当我们点击图表时,就会找到离点击点最近的圆并将其“高亮显示”。
# 获取被点击的最近的图形并改变其颜色
@fig.renderer.add_event_handler('点击')
def click_event(ev):
# 重置颜色
# 将颜色映射重置为预设的 'tab10' 颜色方案
circles_graphic.cmap = "tab10"
# 将点击位置转换为世界坐标
xy = fig[0, 0].map_screen_to_world(ev)[:-1]
# 找到离点击位置最近的图形
nearest = fpl.utils.get_nearest_graphics(xy, circles_graphic)[0]
# 将最近的图形颜色设为白色
nearest.colors = "w"
简单的点击
在 fastplotlib
中,定义一个事件就像定义我们如何处理该事件,然后添加我们的处理函数到相关的图形或图表中一样简单。这种方法的好处在于,用户不需要学习新的、复杂的库特定 API 特性,只需要知道如何定义函数即可。
我们的API在数据交互和事件处理方面的简洁高效设计是该库的一大优势,使得fastplotlib
既直观又容易上手。
如今,拥有一块GPU显卡几乎成了做科学的必备条件,科学可视化也不例外。
最大化GPU上的计算资源是实现高质量的高分辨率可视化效果的关键所在。
如下所示,这是一个使用 fastplotlib
工具绘制了300万个点的例子。我们不仅绘制了这些线,还可以轻松地放大和缩小,并更改线的颜色映射,甚至可以单独改变特定点的颜色。
fastpotlib 3百万点线示例
在同一时间画出这么多点,并对每个点的颜色进行精细控制,在许多其他的Python科学可视化库来说是做不到的。
使_fastplotlib_的出色性能得益于其强大的底层图形技术。
那些具体的细节
fastplotlib
是在 pygfx 渲染引擎之上构建的。pygfx
则是基于 WGPU,一个跨平台图形 API,该 API 针对 Vulkan(Linux)、Metal(Mac)和 DX12(Windows)进行了适配。
fastplotlib软件栈
本质上,这些新的图形API(Vulkan、Metal和DX12)非常快和高效,并且相比旧图形标准OpenGL更好地利用GPU硬件。
我们在 pygfx
之上构建 fastplotlib
是因为,抽象掉一些底层的渲染引擎细节(例如,相机、渲染器、场景等),这些细节在许多可视化中都很常见,就像样板代码一样。这使用户能够更加专注于他们的数据。
轻松查看你的数据并探索不同维度是一回事,但这只是第一步。我们相信,能否与数据进行互动才是促进科学发现的关键。然而,创建这些易于探索和分析数据的交互式图表却并非易事。
许多流行的Python可视化库迫使你学习复杂的API接口,这使得入门的门槛变得很高。此外,其中许多库是基于OpenGL构建的,OpenGL是一个较旧的图形API,正在被这些新的图形API逐步取代。这些新的图形API更好地利用了GPU的性能,从而能够实现更强大和更具表现力的可视化效果。
fastplotlib
旨在通过提供一个易用的数组类似API,利用现代图形硬件的优势,解决当前在Python科学可视化中面临的挑战,从而实现GPU加速的快速交互式可视化。
我们的文档和示例可以在这里找到here。这包括用户手册和快速入门指南,帮助您开始使用fastplotlib
。我们的示例图库也在不断更新。
最后,我们总是很高兴帮您把数据可视化,并且我们也很乐意为我们的库添加更多适合您需求的示例。
联系我们吧我们喜欢和社区的朋友们互动 ❤️
如果你有任何问题或想交流,欢迎随时在GitHub上提出问题或参与讨论!
未来的几篇文章我们计划这将是系列文章的第一篇。我们希望在将来添加一些使用fastplotlib
的示例文章,或许还会有一些关于底层图形技术的深入探讨。
如果你对这个感兴趣的话,请告诉我们一声哈
共同學習,寫下你的評論
評論加載中...
作者其他優(yōu)質文章