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

    输出效果:

    在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java学习苦旅(二十六)——反射,枚举和lamda表达式

本篇博客将讲解反射&#xff0c;枚举和lamda表达式。 文章目录 反射定义用途反射基本信息反射相关的类Class类Class类中相关的方法 反射示例反射的优缺点优点缺点 枚举背景及定义常用方法枚举优缺点优点缺点 Lambda表达式背景语法函数式接口定义基本使用 变量捕获Lambda在集合…

在drawio中使用BPMN2.0绘制详细的业务流程图和编排模型

在drawio中使用BPMN2.0绘制详细的业务流程图和编排模型 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功…

Qt pro文件

1. 项目通常结构 2.pri文件 pri文件可定义通用的宏&#xff0c;例如创建一个COMMON.pri文件内容为 COMMON_PATH D:\MyData 然后其它pri或者pro文件如APPTemplate.pro文件中通过添加include(Common.pri) &#xff0c;QtCreator就会自动在项目结构树里面创建对应的节点 3.变量…

如何信任机器学习模型的预测结果?

在本篇中&#xff0c;我将通过一个例子演示在 MATLAB 如何使用 LIME 进行复杂机器学习模型预测结果的解释。 我使用数据集 carbig&#xff08;MATLAB 自带的数据集&#xff09;训练一个回归模型&#xff0c;用于预测汽车的燃油效率。数据集 carbig 是 70 年代到 80 年代生产的汽…

Android AIDL 创建的DEMO

使用AIDL创建一个demo 主要参考文件&#xff0c; 以及其他地址 Android 接口定义语言 (AIDL) | Android 开发者 | Android Developers 绑定服务概览 | Android 开发者 | Android Developers Android 接口定义语言 (AIDL) Android 接口定义语言 (AIDL) 与您可能使用…

倍思科技红海突围要义:紧随新趋势,“实用而美”理念从一而终

移动数码周边市场始终不缺热度。 销售端是业绩的节节高升&#xff0c;如在2023年京东双十一&#xff0c;移动数码周边产品销售成果丰硕&#xff0c;根据京东战报&#xff0c;大功率充电器成交额同比提升 200%&#xff0c;65W以上移动电源成交额同比提升 150%&#xff0c;自带线…

服务器内存不足怎么办?会有什么影响?

服务器内存&#xff0c;也被称为RAM&#xff08;Random Access Memory&#xff09;&#xff0c;是一种临时存储设备&#xff0c;用于临时存放正在运行的程序和数据。它是服务器上的超高速存储介质&#xff0c;可以快速读取和写入数据&#xff0c;提供给CPU进行实时计算和操作。…

Python基础入门第八课笔记(自定义函数 lambda)

什么时候用lambda表达式&#xff1f; 当函数有一个返回值&#xff0c;且只有一句代码&#xff0c;可以用lambda简写。 2、lanbda语法 lambda 形参 : 表达式 注意&#xff1a; 1、形参可以省略&#xff0c;函数的参数在lambda中也适用 2、lambda函数能接收任何数量的参数但只能…

Dockerfile的EXPOSE

文章目录 环境总结测试使用EXPOSE测试1&#xff1a;不做端口映射测试2&#xff1a;-p 8080:80测试3&#xff1a;-P测试4&#xff1a;--networkhost 不使用EXPOSE 参考 环境 RHEL 9.3Docker Community 24.0.7 总结 如果懒得看测试的详细信息&#xff0c;可以直接看结果&#…

MYSQL篇--sql优化高频面试题

sql优化 1 如何定位及优化SQL语句的性能问题&#xff1f;创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因&#xff1f; 其实对于性能比较低的sql语句定位&#xff0c;最重要的也是最有效的方法其实还是看sql的执行计划&#xff0c;而对于mysql来说 它…

228. 汇总区间

给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖&#xff0c;并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,b] 应该按…

[C#]使用onnxruntime部署yolov8-onnx实例分割模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 是一个 SOTA 模型&#xff0c;它建立在以前 YOLO 版本的成功基础上&#xff0c;并引入了新的功能和改进&#xff0c;以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新…

OpenCV图像处理|1.1 OpenCV介绍与环境搭建

1.1.1 介绍 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;开放源代码计算机视觉库&#xff0c;主要算法涉及图像处理、计算机视觉和机器学习相关方法。OpenCV 其实就是一堆 C 和 C语言的源代码文件&#xff0c;这些源代码文件中实现了许多常用的计算机视…

智慧医院预约及支付平台—智慧支付

医保支付流程 自费支付流程 智慧医院支付业务介绍 社保卡绑定(身份认证) 认证方案:银行身份已验证客户,可通过本人银行登记的手机号码登录医院APP后,在完善APP注册身份信息时,将相关信息发送苏州银行,由银行核对客户身份信息正确性并将社保卡绑定本人手机。核实后的身份…

Java:File类详解

文章目录 1、概述2、创建File实例3、常用方法3.1 获取功能的方法3.2 绝对路径和相对路径3.3 判断功能的方法3.4 创建删除功能的方法3.5 文件过滤功能的方法 4、文件夹的遍历5、综合练习5.1 创建文件夹5.2 查找文件&#xff08;不考虑子文件夹&#xff09;5.3 查找文件&#xff…

视频剪辑技巧:添加srt字幕,提升视频品质的方法

在视频制作和剪辑过程中&#xff0c;字幕的添加是一项常见的技巧。通过添加srt字幕&#xff0c;可以提升视频的品质和观感&#xff0c;让观众更好地理解视频内容。下面一起来看云炫AI智剪如何批量添加srt字幕的方法&#xff0c;如何通过这些技巧提升视频品质。 原视频画面与添…

XAgent调研

文章目录 1 简介2 快速测试 Quick Start3 结构分析 1 简介 XAgent&#xff08;链接&#xff09;是一个开源的&#xff0c;基于大语言模型的agent构建框架&#xff1b;其目标是构建出能够辅助人类处理各类任务的自动助手 定位&#xff1a;一个全能的&#xff0c;自动的辅助agen…

LeetCode刷题11:滑动窗口解决1423.可获得的最大点数

几张卡牌 排成一行&#xff0c;每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动&#xff0c;你可以从行的开头或者末尾拿一张卡牌&#xff0c;最终你必须正好拿 k 张卡牌。 你的点数就是你拿到手中的所有卡牌的点数之和。 给你一个整数数组 cardPoi…

java SSM体育器材租借管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM体育器材租借管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要…

修改Gitee用户名

首先进入首页&#xff0c;点击右上角下拉列表中的账号设置 只想改姓名的话&#xff0c;就只要改下下面这里 还想把个人空间地址改了的话还要改下面这里