前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Matplotlib for C++不完全手册

Matplotlib for C++不完全手册

作者头像
艰默
发布于 2024-01-11 07:59:40
发布于 2024-01-11 07:59:40
1.2K00
代码可运行
举报
文章被收录于专栏:iDoitnowiDoitnow
运行总次数:0
代码可运行

matplotlib-cpp是Matplotlib(MPL)为C++提供的一个用于python的matplotlib绘图库的C++包装器。它的构建类似于Matlab和matplotlib使用的绘图API

However, the function signatures might differ and Matplotlib for C++ does not support the full functionality of MPL. The purpose is providing an easy-to-use wrapper to MPL in C++, not to fully translate the library. 然而,函数签名可能不同,C++的Matplotlib不支持MPL的全部功能。其目的是为C++中的MPL提供一个易于使用的包装器,而不是完全翻译库。

库下载和环境要求

下载matplotlib-cpp库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone https://github.com/lava/matplotlib-cpp.git

matplotlibcpp库的结构比较简单,其目录结构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.
├── cmake
├── CMakeLists.txt  //cmake文件
├── contrib
├── examples
├── LICENSE
├── LICENSE.matplotlib
├── matplotlibcpp.h //头文件
└── README.md

其中最核心的就是matplotlib.h,该头文件封装了大量C++调用matplotlib的API,在实际使用的时候,只需要将其复制到项目的include就可以。头matplotlibcpp.h取决于Python头Python.h、相应的Python库libpythonnumpy/arrayobject.h。如果不在标准include路径中,则必须分别使用选项-I-L-l编译器指定头文件的路径、库的路径和库本身。

matplotlib-cpp通过包装器调用python的matplotlib来工作。因此使用matplotlib-cpp必须有python环境、matplotlibnumpy/arrayobject.h。目前Python2.7和Python3(>=3.6)已经过测试,如果没有可以使用:,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt-get install python-matplotlib python-numpy python2.7-dev
//or sudo apt-get install python-matplotlib python-numpy python3-dev

By default Matplotlib for C++ uses Numpy arrays. This requires the above header file. However it is possible to avoid this header by defining -DWITHOUT_NUMPY. 默认情况下,C++的Matplotlib使用Numpy数组。这需要上面的头文件。但是,可以通过定义-DWITHOUT_NUMPY来避免此标头。

目前C++代码与python2和python3都兼容。但是,CMakeLists.txt文件当前默认设置为使用python3,因此如果需要python2,则必须手动更改。

By design (of python), only a single python interpreter can be created per process. When using this library, no other library that is spawning a python interpreter internally can be used. 根据(python的)设计,每个进程只能创建一个python解释器。当使用这个库时,不能使用其他在内部生成python解释器的库。

如果不使用cmake,我们也可以使用最基本的g++编译器编译,调用示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
g++ example.cpp -I/usr/include/python2.7 -lpython2.7

常用的函数和方法

matplotlib-cpp的所有函数都组织在名称空间matplotlibcpp中。通常情况下,为了方便(并本着Python规范的精神),我们通常定义缩写plt,即:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "matplotlibcpp.h"
namespace plt = matplotlibcpp;

后面的介绍默认使用了namespace plt = matplotlibcpp;,即用缩写代替matplotlibcpp

plot相关

绘制曲线最常用的就是plot函数,其原型如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//绘制x,y
template<typename VectorX, typename VectorY>
bool plot(const VectorX &x, const VectorY &y, const std::string &s = "",                       const std::map<std::string, std::string> &keywords = {})

//绘制y 
//对于大小为n的向量y,x数据被设置为0,。。。,n−1
template<typename VectorY>
bool plot(const VectorY &y, const std::string &format = "", const std::map<std::string, std::string> &keywords = {})

该函数用来绘制y与x的关系图。两个向量x 并且y必须具有相同的长度。格式化字符串s可以指定线条的颜色、标记和样式。map关键字可能包含绘图的其他命名参数。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <vector>
#include "matplotlibcpp.h"
namespace plt = matplotlibcpp;

int main() {
  std::vector<double> x = {1, 2, 3, 4};
  std::vector<double> y = {1, 4, 9, 16};

  plt::plot(x, y);
  //plt::plot(x, y, "r*");  // 红色的*作标记,没有连线
  //plt::plot(x, y, "bo-");  // 蓝色的点+蓝色的线
  //plt::plot(x, y, "bo-", {{"label", "f(x)"}});  // 添加f(x)标签
  //plt::plot(x, y, {{"label", "$y = x^2$"}});  // 支持latex
  //plt::legend();                                // 激活图例
  plt::show();

  return 0;
}

运行结果:

另外matplotlib-cpp还提供了对数为刻度的坐标系函数,其用法与plot类似,它们对应的函数原型如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//以双对数刻度绘制y与x的关系图
template<typename VectorX, typename VectorY>
bool loglog(const VectorX &x, const VectorY &y, const std::string &s = "",
            const std::map<std::string, std::string> &keywords = {})

//用对数x和线性y标度绘制y与x的关系图
template<typename VectorX, typename VectorY>
bool semilogx(const VectorX &x, const VectorY &y, const std::string &s = "", const std::map<std::string, std::string> &keywords = {})

//用对数x和线性y标度绘制y
template<typename VectorY>
bool semilogx(const VectorY &y, const std::string &s = "", const std::map<std::string, std::string> &keywords = {})

//以线性x和对数y标度绘制y与x的关系图
template<typename VectorX, typename VectorY>
bool semilogy(const VectorX &x, const VectorY &y, const std::string &s = "", const std::map<std::string, std::string> &keywords = {})

//以线性x和对数y标度绘制y
template<typename VectorY>
bool semilogy(const VectorY &y, const std::string &s = "", const std::map<std::string, std::string> &keywords = {})

除了对数坐标系外,matplotlib-cpp还提供了文本显示功能,其函数原型如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template<typename Numeric>
void text(Numeric x, Numeric y, const std::string &s = "")

xy分别代表文本的位置坐标,s为文本内容

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <vector>
#include "matplotlibcpp.h"
namespace plt = matplotlibcpp;

int main() {

  std::vector<double> x = {0.1, 0.2, 0.5};
  plt::plot(x, "s");
  plt::text(1.0, 0.1, "Text under a square");
  plt::show();

  return 0;
}

输出结果:

figure相关

使用一个ID号初始化一个新图形。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//number: 图形的编号。如果设置为-1,则使用默认编号(从0开始递增)
inline long figure(long number = -1)

设置figure的宽度和高度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//w: 图形的宽度(以像素为单位)
//h: 图形的高度(以像素为单位)
void figure_size(size_t w, size_t h)

启动图例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
loc: 图例的位置。可以是以下任意一种:“best”, “upper left”, “upper center”, 
                                “upper left”, “center left”, “center”,   
                                “center right” (= “right”), “lower left”,
                                “lower center”, “lower right”
bbox_to_anchor: 如果设置为长度为2或4的矢量,则指定图例边界框的位置(和大小)。
                格式为(x,y)或 (x,y,宽度,高度)。
                坐标以与绘图轴相同的单位进行解释(因此没有归一化坐标)
*/
template<typename Vector = std::vector<double>>
inline void legend(const std::string &loc = "best", const Vector &bbox_to_anchor = Vector())

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//将图例放在右下象限的中心。
//第一个参数:loc,第二个:bbox_to_anchor
plt::legend("center", {0.5, 0, 0.5, 0.5});

设置x轴范围。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//left:  左轴限制
//right: 右轴限制
template<typename Numeric>
void xlim(Numeric left, Numeric right)

设置y轴范围。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//bottom: 底部轴限制
//top:    顶部轴限制
template<typename Numeric>
void ylim(Numeric bottom, Numeric top)

获取x、y轴范围。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//返回值:指向长度为2的数组的指针,该数组包含[left,right]
inline double *xlim()

//返回值:指向长度为2的数组的指针,该数组包含[bottom,top]
inline double *ylim()    

设置figure的标题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//titlestr: 情节的标题
//keywords: 其他关键字
inline void title(const std::string &titlestr, const std::map<std::string, std::string> &keywords = {})

将居中的标题添加到figure中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//suptitle str: 图形的标题
//keywords:     其他关键字
inline void suptitle(const std::string &suptitlestr, const std::map<std::string, std::string> &keywords = {})

设置坐标轴的一些属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
option: 要激活的选项
其支持的选项有:
on-------启用轴线和标签
off------关闭轴线和标签
equal----通过更改轴限制来设置相等的缩放比例。
scaled---通过更改绘图框的尺寸来设置相等的缩放比例。
tight----设置足够大的限制以显示所有数据。
auto-----自动缩放(用数据填充绘图框)。
image----以等于数据限制的轴限制进行缩放。
square---方形地块;类似于缩放,但最初强制相同的x轴和y轴长度。
*/
inline void axis(const std::string &option)

保存当前图形。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
filename: 将图形保存为文件名(必须包含文件格式),支持的文件类型取决于用户后端,但通常包含             pdf、eps和png等。
keywords: 其他关键字
*/
inline void savefig(const std::string &filename, const std::map<std::string, std::string> &keywords = {})

其会始终存储图形的当前状态。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt::plot(time, apple_sales);
plt::savefig("sales.pdf");  // 仅包含apple_sales
plt::plot(time, kiwi_sales);
plt::savefig("sales.pdf");  // 包含apple 和 kiwi sales

我们可以使用调用plt::show()清除绘图,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt::plot(x, y);
plt::show();
plt::savefig("is_this_empty.pdf");  // 是的,这个是空的

plt::plot(x, y);
plt::savefig("this_isnt_empty.pdf");  // 建议始终在show之前调用savefig
plt::show();

有时候如果轴标签在外面太远在保存图片的时候可能会被切断,我们可以尝试使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//将图片以恰当的匹配形式保存
plt::savefig("fig.pdf", {{"bbox_inches", "tight"}});

显示图形。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
block: 如果为true,则停止执行代码,直到关闭显示的图形为止。
       否则,代码不会停止。根据后端的不同,数字可能根本无法显示。
*/
inline void show(const bool block = true)

其他示例

matplotlibcpp还提供了一些其他示例,我们可以根据需要,在其上面做相应的调整供自己使用。

绘制三维图像

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "matplotlibcpp.h"
 
namespace plt = matplotlibcpp;
 
int main()
{
    std::vector<std::vector<double>> x, y, z;
    for (double i = -5; i <= 5;  i += 0.25) {
        std::vector<double> x_row, y_row, z_row;
        for (double j = -5; j <= 5; j += 0.25) {
            x_row.push_back(i);
            y_row.push_back(j);
            z_row.push_back(::std::sin(::std::hypot(i, j)));
        }
        x.push_back(x_row);
        y.push_back(y_row);
        z.push_back(z_row);
    }
 
    plt::plot_surface(x, y, z);
    plt::show();

    return 0;
}

输出效果:

绘制动图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define _USE_MATH_DEFINES
#include <cmath>
#include "matplotlibcpp.h"

namespace plt = matplotlibcpp;

int main()
{
	int n = 1000;
	std::vector<double> x, y, z;

	for(int i=0; i<n; i++) {
		x.push_back(i*i);
		y.push_back(sin(2*M_PI*i/360.0));
		z.push_back(log(i));

		if (i % 10 == 0) {
			// Clear previous plot
			plt::clf();
			// Plot line from given x and y data. Color is selected automatically.
			plt::plot(x, y);
			// Plot a line whose name will show up as "log(x)" in the legend.
			plt::named_plot("log(x)", x, z);

			// Set x-axis to interval [0,1000000]
			plt::xlim(0, n*n);

			// Add graph title
			plt::title("Sample figure");
			// Enable legend.
			plt::legend();
			// Display plot continuously
			plt::pause(0.01);
		}
	}
}

输出效果:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iDoitnow 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
五分钟学会C++高效图表绘制神器调用
给大家介绍一个C++上简单高效的图表绘制与数据可视化的神器 matplotlib-cpp。先交代我的系统配置跟软件版本信息
OpenCV学堂
2020/02/21
8.9K0
【C++】开源:matplotlib-cpp静态图表库配置与使用
项目Github地址:https://github.com/lava/matplotlib-cpp
DevFrank
2024/07/24
8950
配置C++版本的matplotlibcpp:Visual Studio
  本文介绍在Visual Studio软件中配置、编译C++环境下matplotlibcpp库的详细方法。
疯狂学习GIS
2023/10/24
1.2K0
配置C++版本的matplotlibcpp:Visual Studio
【C++】ROS:PID控制算法原理与仿真实现示例
PID(比例-积分-微分)算法是一种经典的控制算法,常用于控制系统中的反馈控制。它根据当前误差的大小和变化率,计算输出信号来调节控制器的行为,以使系统稳定并达到期望的目标。
DevFrank
2024/07/24
7720
C++ 动态新闻推送 第7期
从reddit/hackernews/lobsters/meetingcpp摘抄一些c++动态。
王很水
2021/08/31
4870
教程 | 如何优雅而高效地使用Matplotlib实现数据可视化
选自pbpython 机器之心编译 参与:路雪、蒋思源 Matplotlib 能创建非常多的可视化图表,它也有一个丰富的 Python 工具生态环境,很多更高级的可视化工具使用 Matplotlib 作为基础库。因此本文旨在提供一种高效的 Matplotlib 使用方法,并希望该方法可以帮助大家理解如何更有效地进行日常数据分析工作。 简介 对新手来说 Python 可视化实在有些令人挫败。有很多不同的选项,如何选择正确的选项是一个挑战。例如,两年前这篇文章《Overview of Python Visua
机器之心
2018/05/11
2.8K0
高效使用 Python 可视化工具 Matplotlib
Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型的2D图表和一些基本的3D图表。本文主要推荐一个学习使用Matplotlib的步骤。
1480
2019/09/17
2.6K0
高效使用 Python 可视化工具 Matplotlib
Python & C++ - pybind11 实现解析
IEG 自研引擎 CE 最早支持的脚本是 Lua, 在性能方面, Lua是有一定优势的. 但除此之外的工程组织, 以及现在即将面临的 AI 时代的语料问题, Lua 都很难很好的解决. 在这种情况下, 支持工程组织和语料更丰富的 Python, 就成了优先级较高的任务了. 由于Python的虚拟机以及相关的C API较复杂, 我们选择的方式是将 pybind11 - 一个Python社区知名度比较高, 实现质量也比较高的 Python 导出库与我们引擎的 C++ 反射适配的整合方式, 这样可以在工作量较小的情况下, 支持好 Python 脚本, 同时也能比较好的利用上引擎的C++反射实现. 在做好整合工作前, 我们肯定需要先较深入的了解 pybind11 的相关实现机制, 这也是本篇主要讲述的内容.
fangfang
2023/10/16
2.6K0
Python & C++ - pybind11 实现解析
C++ 动态新闻推送 第34期
从reddit/hackernews/lobsters/meetingcpp摘抄一些c++动态
王很水
2021/10/25
5570
Matplotlib库
Matplotlib 是 Python 中非常流行且广泛使用的数据可视化库,主要用于创建各种类型的图表和图形。它提供了丰富的绘图功能,支持静态、动态和交互式的图表。以下是关于 Matplotlib 的基础知识总结:
用户11315985
2024/10/16
6890
Matplotlib库
matplotlib个人手册
plt.plot() 方法可以将给定的数据绘制成图片,再用 plt.show() 将图片展示出来
棒棒鸡不棒
2022/09/02
4670
Matplotlib 基础
Matplotlib 是一个 Python 绘图库,可以跨平台生成各种硬拷贝格式和交互式环境的出版品质数据。
iOSDevLog
2019/05/28
2.1K0
一篇文章学会Matplotlib
这个示例演示了如何使用Matplotlib绘制一个折线图。列表x和y分别包含水平和垂直坐标数据,并使用plt.plot()函数连接它们以绘制线条。添加标题、坐标轴标签和刻度标签可以提高图表可阅读性。
GeekLiHua
2025/01/21
6360
数据科学 IPython 笔记本 8.3 Matplotlib 可视化
我们现在将深入研究M atplotlib 包,以便在 Python 中进行可视化。Matplotlib 是一个基于 NumPy 数组的多平台数据可视化库,旨在兼容更广泛的 SciPy 技术栈。它由 John Hunter 在 2002 年构思,最初是作为 IPython 的补丁,用于通过来自 IPython 命令行的gnuplot实现 MATLAB 风格的交互式绘图。
ApacheCN_飞龙
2022/05/07
1.1K0
数据科学 IPython 笔记本 8.3 Matplotlib 可视化
<<C++之旅>>阅读笔记
几周前,出版社赠了本C++之父新作<<C++之旅>>,因为当时比较忙,所以一直在手边放着,有时间的时候随意翻几页,断断续续也看了一部分,今天借助本文,分享下。
高性能架构探索
2024/02/01
1860
<<C++之旅>>阅读笔记
matplotlib入门
MATlAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、量化金融与风险管理、机器人,控制系统等领域。MATLAB在数值计算方面首屈一指,也是使用最广泛的科研绘图软件之一。优点:编程效率高 便于矩阵计算。缺点:循环效率低 封装性不好。
IT从业者张某某
2022/11/12
4.6K0
matplotlib入门
matplotlib安装及使用
matplotlib是基于python语言的开源项目,旨在为python提供一个数据绘图包。我将在这篇文章中介绍matplotlib API的核心对象,并介绍如何使用这些对象来实现绘图。实际上,matplotlib的对象体系严谨而有趣,为使用者提供了巨大的发挥空间。用户在熟悉了核心对象之后,可以轻易的定制图像。matplotlib的对象体系也是计算机图形学的一个优秀范例。即使你不是python程序员,你也可以从文中了解一些通用的图形绘制原则。matplotlib使用numpy进行数组运算,并调用一系列其他的python库来实现硬件交互。matplotlib的核心是一套由对象构成的绘图API。
狼啸风云
2023/10/07
5930
matplotlib安装及使用
C++ 动态新闻推送 第46期
这个就是c++14-c++17那会社区一直念叨的function_ref function_view,一个轻量的function
王很水
2022/01/19
4510
C++ 学习笔记
作者:readywang(王玉龙) template 是 c++ 相当重要的组成部分,堪称 c++语言的一大利器。在大大小小的 c++ 程序中,模板无处不在。c++ templates 作为模板学习的经典书籍,历来被无数 c++学习者所推崇。第二版书籍覆盖了 c++ 11 14 和 17 标准,值得程序猿们精读学习,特此整理学习笔记,将每一部分自认为较为重要的部分逐条陈列,并对少数错误代码进行修改 一、函数模板 1.1 函数模板初探 1.模板实例化时,模板实参必须支持模板中类型对应的所有运算符操作。 te
腾讯技术工程官方号
2022/03/03
7K0
C++ 模板开发
template是关键字,<class type>表示指定的类型(类似java的泛型),ret-type表示返回类型 func-name(parameter list):函数名称和参数
包子388321
2020/06/16
9350
相关推荐
五分钟学会C++高效图表绘制神器调用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验