使用 Windows 7 绘制在 C++ 中生成的二维数组的最简单方法是什么?

计算科学 C++ 绘图
2021-12-12 17:08:47

这在 Python 中要容易得多(以至于我正在考虑回到 matplotlib 进行数据分析)。但实际上,试图弄清楚 ROOT 和 Boost 图形库和 mathgl 让我想死。

我在短期内考虑的是以某种方式将我的二维数组导出到一个文本文件,然后将该文件导入一个 numpy 数组,因为我已经对该基础架构进行了编码。然后我将使用 matplotlib 来可视化数据。

从长远来看,我想学习从 C++ 可视化数据的“标准方法”,以添加到我的适销技能列表中。我的一些粒子物理学朋友让我害怕远离 Root,被 Linux 势利小人厌恶远离 mathgl,并且喜欢 gnuplot 的外观,但由于它是命令行操作的事实而被关闭。在功能和易用性方面,C++ 中的 matplotlib 没有什么直接的同义词吗?

4个回答

我认为您的问题有几个微妙之处很重要:

  • 您正在将解释语言 (Python) 与编译语言 (C++) 进行比较。
  • 大多数科学和工程软件的开发都偏重于 Linux(和 UNIX),并且通常不以跨平台兼容性或出色的用户支持而闻名(当然,大型库除外)

如果您真的想使用 C++ 库,您可能需要具有基于 CMake 的构建系统的东西。PLplot 就是这样一个库,它看起来很有名,并且有一个 C++ 接口(不幸的是,似乎出现的其他库是 ROOT 和 MathGL ......)。

但是,考虑到上述几点,如果使用 Cygwin 或 MinGW 会让您大发雷霆,我会坚持使用 Python 或您可以从二进制文件安装的可视化程序(例如 Paraview 或 VisIt;其他程序可以也可以工作)。原因如下:

解释语言便于调整可视化

在 C++ 中进行可视化的最大优势在于,您可以将其附加到您可能用于模拟工作的任何 C++ 代码中。也就是说,如果您必须在每次修改后编译您的代码,那么调整您的可视化会更加耗时。使用解释性语言,一旦加载数据,您就可以在命令行上对可视化进行后处理和调整。如果您绘制原始数据并确定它可能看起来更好地标准化,没问题;几行代码,你可以在一两分钟内调出一个新的情节,而无需重新编译。

在 Windows 上编译科学软件很痛苦

...因为很多时候,编写它的人都没有使用像 CMake 这样的跨平台构建系统,所以你要么必须费力地破解一个有效的 Makefile,要么使用 Cygwin 或 MinGW 编译所有内容并希望该软件不依赖于 Linux 库(因为毕竟 Cygwin 是一个 POSIX 兼容层)。如果一个项目使用了 CMake,那很可能意味着开发者已经考虑到了这些问题,CMake 会输出必要的构建脚本来用 Visual Studio 编译软件,这会让你的生活不那么痛苦。否则,可能不值得花时间和精力。

如果您可以从二进制文件中安装所需的可视化软件,您就不必担心与 Visual Studio 搏斗。我能想到的至少有两个 Python 发行版将在多个平台上为 Matplotlib(Continuum 的 Anaconda 和 Enthought Canopy)提供 Python 的二进制安装。Paraview 和 VisIt 都是功能强大的科学可视化软件包,同样可以从二进制文件安装(它们也可以在 Windows 上从源代码构建)。

我认为没有“标准 C++ 方式”来绘制数据

我还没有听说过绘制数据的“标准 C++ 方式”(这并不意味着它不存在);当我与数据科学家交谈时,他们中的很多人都强调流利使用 Python、R 或 MATLAB 等解释语言是多么方便和重要,因为可以使用这些语言快速开发可视化和后处理。许多字段的标准做法是将数据转储为某种文本格式(列分隔、CSV、HDF5、VTK 等),然后使用其中一种解释语言或专用可视化程序(如 VisIt、 Paraview,对于 2-D 绘图,gnuplot)。

好吧,首先,您可以将 gnuplot 称为库。您在提示符下使用的几乎每个命令都有一个名称相似的 API 函数。

C++ 没有包含生成绘图(或者,实际上是任何图形)能力的标准库。C++ 也没有带有包管理器的包系统,允许您导入此功能。

但是,有一些跨平台库可以满足您的需求。使用最广泛的一种,也可以在 Windows 上使用,可能是 Qt。打开一个窗口并绘制一些东西会比在 Python 中多一点工作,但它不应该像你提到的许多其他库那样困难。

CImg,一个只有头文件的库,性能相当好,但不是很可调整。它主要是关于图像处理的,但它也提供了一些用于绘制图形和轴的功能,尽管有限(你得到你得到的图形选项,就是这样)。

它最大的怪癖就是习惯了图像在内部存储的方式。颜色通道是分开的,所以你有连续的蓝色字节,然后是绿色,然后是红色。要输出到屏幕或文件,您必须将它们交错在一起。示例代码很好,很容易弄清楚。

我已经使用过它(它可以足够快地绘制一些图表以跟上 60fps 的实时视频流),但也渴望看到 matplotlib 等。