Matplotlib for C++不完全手册

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库:

git clone https://github.com/lava/matplotlib-cpp.git

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

.
├── 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)已经过测试,如果没有可以使用:,

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++编译器编译,调用示例如下:

g++ example.cpp -I/usr/include/python2.7 -lpython2.7

常用的函数和方法

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

#include "matplotlibcpp.h"
namespace plt = matplotlibcpp;

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

plot相关

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

//绘制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关键字可能包含绘图的其他命名参数。

示例:

#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类似,它们对应的函数原型如下:

//以双对数刻度绘制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还提供了文本显示功能,其函数原型如下:

template<typename Numeric>
void text(Numeric x, Numeric y, const std::string &s = "")

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

示例:

#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号初始化一个新图形。

    //number: 图形的编号。如果设置为-1,则使用默认编号(从0开始递增)
    inline long figure(long number = -1)
    
  • 设置figure的宽度和高度

    //w: 图形的宽度(以像素为单位)
    //h: 图形的高度(以像素为单位)
    void figure_size(size_t w, size_t h)
    
  • 启动图例

    /*
    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())
    

    示例:

    //将图例放在右下象限的中心。
    //第一个参数:loc,第二个:bbox_to_anchor
    plt::legend("center", {0.5, 0, 0.5, 0.5});
    
  • 设置x轴范围。

    //left:  左轴限制
    //right: 右轴限制
    template<typename Numeric>
    void xlim(Numeric left, Numeric right)
    
  • 设置y轴范围。

    //bottom: 底部轴限制
    //top:    顶部轴限制
    template<typename Numeric>
    void ylim(Numeric bottom, Numeric top)
    
  • 获取x、y轴范围。

    //返回值: 指向长度为2的数组的指针,该数组包含[left,right]
    inline double *xlim()//返回值: 指向长度为2的数组的指针,该数组包含[bottom,top]
    inline double *ylim()    
    
  • 设置figure的标题。

    //titlestr: 情节的标题
    //keywords: 其他关键字
    inline void title(const std::string &titlestr, const std::map<std::string, std::string> &keywords = {})
    
  • 将居中的标题添加到figure中。

    //suptitle str: 图形的标题
    //keywords:     其他关键字
    inline void suptitle(const std::string &suptitlestr, const std::map<std::string, std::string> &keywords = {})
    
  • 设置坐标轴的一些属性。

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

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

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

    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()清除绘图,例如:

    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();
    

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

    //将图片以恰当的匹配形式保存
    plt::savefig("fig.pdf", {{"bbox_inches", "tight"}});
    
  • 显示图形。

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

其他示例

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

  • 绘制三维图像

    #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;
    }
    

    输出效果:

    在这里插入图片描述

  • 绘制动图:

    #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 plotplt::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 titleplt::title("Sample figure");// Enable legend.plt::legend();// Display plot continuouslyplt::pause(0.01);}}
    }
    

    输出效果:

    在这里插入图片描述

文章首发公众号:iDoitnow如果喜欢话,可以关注一下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/232976.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电子学会C/C++编程等级考试2023年12月(二级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:统计指定范围里的数 给定一个数的序列S,以及一个区间[L, R], 求序列中介于该区间的数的个数,即序列中大于等于L且小于等于R的数的个数。 时间限制:1000 内存限制:65536 输入 第一行1个整数n,分别表示序列的长度。(0 < n ≤…

ThinkPHP5多小区物业管理系统源码(支持多小区)

基于 ThinkPHP5 Bootstrap 倾力打造的多小区物业 管理系统源码&#xff0c;操作简单&#xff0c;功能完善&#xff0c;用户体验良好 开发环境PHP7mysql 安装步骤: 1.新建数据库db_estate,还原数据db_estate.sql 2.修改配置文件&#xff1a;application/database.php 3.运…

pyqt6 + pycharm 搭建+使用入门

首先安装PyQt6和PyQt6-tools。使用如下命令&#xff1a; pip install PyQt6 PyQt6-tools 但是运行后会报如下错误&#xff1a; 这个时候按照提示执行命令升级pip即可 python.exe -m pip install --upgrade pip 配置pycharm&#xff1a; 打开pycharm&#xff0c;进入setting&am…

Java最大优先队列设计与实现

Java 学习面试指南&#xff1a;https://javaxiaobear.cn 1、API设计 类名MaxPriorityQueue构造方法MaxPriorityQueue(int capacity)&#xff1a;创建容量为capacity的MaxPriorityQueue对象成员方法private boolean less(int i,int j)&#xff1a;判断堆中索引i处的元素是否小…

Mathtype7.4安装与嵌入WPS

文章目录 Mathtype安装教程&#xff08;7.4&#xff09;Mathtype简介Mathtype下载安装软件下载软件安装运行MathType.exe运行注册表 Mathtype嵌入wps Mathtype安装教程&#xff08;7.4&#xff09; Mathtype简介 MathType是一款强大的数学公式编辑器&#xff0c;适用于教育教…

npm发布js工具包

一、创建项目 1、在github上创建一个项目&#xff0c;然后拉取至本地&#xff0c;进入项目目录2、执行 npm init 生成json文件3、创建 src/index.ts 入口文件和 src/isObject.ts 工具方法 src/index.ts export { default as isObject } from ./isObject src/isObject.ts /…

通俗易懂的15个Java Lambda表达式案例

文章目录 1. **实现Runnable接口**&#xff1a;2. **事件监听器**&#xff08;如Swing中的ActionListener&#xff09;&#xff1a;3. **集合遍历**&#xff08;使用forEach方法&#xff09;&#xff1a;4. **过滤集合**&#xff08;使用Stream API&#xff09;&#xff1a;5. …

MATLAB基本绘图操作(二维和三维绘图)

MATLAB基本绘图操作 文章目录 MATLAB基本绘图操作1、二维平面绘图1.1、线条&#xff08;折线图&#xff09;1.2、条形图1.3、极坐标图1.4、散点图 2、三维立体绘图2.1、三维曲面图2.2、三维曲线图&#xff08;点图&#xff09; 3、图片分区&#xff08;子图&#xff09; 1、二维…

2024最新最全【CTF攻防夺旗赛教程】,零基础入门到精通

对于想学习或者参加CTF比赛的朋友来说&#xff0c;CTF工具、练习靶场必不可少&#xff0c;今天给大家分享自己收藏的CTF资源&#xff0c;希望能对各位有所帮助。 CTF在线工具 首先给大家推荐我自己常用的3个CTF在线工具网站&#xff0c;内容齐全&#xff0c;收藏备用。 1、C…

(适趣AI)Vue笔试题

&#x1f4d1;前言 本文主要是【Vue】——&#xff08;适趣AI&#xff09;Vue笔试题的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 …

Java 堆的设计,如何用堆进行排序

Java 学习面试指南&#xff1a;https://javaxiaobear.cn 1、堆的定义 堆是计算机科学中一类特殊的数据结构的统称&#xff0c;堆通常可以被看做是一棵完全二叉树的数组对象。 1、堆的特性 它是完全二叉树&#xff0c;除了树的最后一层结点不需要是满的&#xff0c;其它的每一层…

Spring之代理模式

1、概念 1.1 介绍 二十三种设计模式中的一种&#xff0c;属于结构型模式。它的作用就是通过提供一个代理类&#xff0c;让我们在调用目标方法的时候&#xff0c;不再是直接对目标方法进行调用&#xff0c;而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中…

Python 面向对象之反射

Python 面向对象之反射 【一】概念 反射是指通过对象的属性名或者方法名来获取对象的属性或调用方法的能力反射还指的是在程序额运行过程中可以动态获取对象的信息(属性和方法) 【二】四个内置函数 又叫做反射函数 万物皆对象&#xff08;整数、字符串、函数、模块、类等等…

后端开发——JDBC的学习(三)

本篇继续对JDBC进行总结&#xff1a; ①通过Service层与Dao层实现转账的练习&#xff1b; ②重点&#xff1a;由于每次使用连接就手动创建连接&#xff0c;用完后就销毁&#xff0c;这样会导致资源浪费&#xff0c;因此引入连接池&#xff0c;练习连接池的使用&#xff1b; …

霍兰德职业兴趣测试 60题(免费版)

霍兰德职业兴趣理论从兴趣的角度出发探索职业指导的问题&#xff0c;明确了职业兴趣的人格观念&#xff0c;使得人们对于职业兴趣的认识有了质的变化。在霍兰德职业兴趣理论提出来之前&#xff0c;职业兴趣和职业环境二者分别独立存在&#xff0c;正是霍兰德的总结&#xff0c;…

阿里云服务器8080端口怎么打开?在安全组中设置

阿里云服务器8080端口开放在安全组中放行&#xff0c;Tomcat默认使用8080端口&#xff0c;8080端口也用于www代理服务&#xff0c;阿腾云atengyun.com以8080端口为例来详细说下阿里云服务器8080端口开启教程教程&#xff1a; 阿里云服务器8080端口开启教程 阿里云服务器8080端…

[通俗易懂]c语言中指针变量和数值之间的关系

一、指针变量的定义 在C语言中&#xff0c;指针变量是一种特殊类型的变量&#xff0c;它存储的是另一个变量的内存地址。指针变量可以用来间接访问和操作内存中的其他变量。指针变量的定义如下&#xff1a; 数据类型 *指针变量名&#xff1b;其中&#xff0c;数据类型可以是任…

jenkins安装报错:No such plugin: cloudbees-folder

jenkins安装报错&#xff1a;No such plugin: cloudbees-folder 原因是缺少cloudbees-folder.hpi插件 解决&#xff1a; 一&#xff0c;重新启动 http://xxx:8800/restart 二&#xff0c;跳到重启界面时&#xff0c;点击系统设置 三&#xff0c;找到安装插件&#xff0c;然…

Python双端队列的3种实现及应用

概述 双端队列&#xff08;deque&#xff0c;全名double-ended queue&#xff09;是一种具有队列和栈性质的线性数据结构。双端队列也拥有两端&#xff1a;队首&#xff08;front&#xff09;、队尾&#xff08;rear&#xff09;&#xff0c;但与队列不同的是&#xff0c;插入…

【pytorch学习】 深度学习 教程 and 实战

pytorch编程实战博主&#xff1a;https://github.com/lucidrains https://github.com/lucidrains/vit-pytorch