iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >matplotlib的核心是什么
  • 783
分享到

matplotlib的核心是什么

2023-06-02 06:06:52 783人浏览 安东尼
摘要

小编给大家分享一下matplotlib的核心是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!matplotlib使用numpy进行数组运算,并调用一系列其他的

小编给大家分享一下matplotlib的核心是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

matplotlib使用numpy进行数组运算,并调用一系列其他的python库来实现硬件交互。matplotlib的核心是一套由对象构成的绘图api

matplotlib的核心是什么

matplotlib项目是由John D. Hunter发起的。John D. Hunter由于癌症于去年过世,但他发为社区作出的无比贡献将永远留存。

matplotlib的核心是什么

John D. Hunter

你需要安装Python, numpy和matplotlib。(可以到python.org下载Python编译器。相关Python包的安装,请参看我的Python小技巧)

matplotlib的官网是: Http://matplotlib.org/  官网有丰富的图例和文档说明。

matplotlib在GitHub的地址为:https://github.com/matplotlib 欢迎有兴趣的开发者fork。

函数式绘图

matplotlib是受MATLAB的启发构建的。MATLAB是数据绘图领域广泛使用的语言和工具。MATLAB语言是面向过程的。利用函数的调用,MATLAB中可以轻松的利用一行命令来绘制直线,然后再用一系列的函数调整结果。

matplotlib有一套完全仿照MATLAB的函数形式的绘图接口,在matplotlib.pyplot模块中。这套函数接口方便MATLAB用户过度到matplotlib包。下面,我们调用该模块绘制一条直线。

# a strait line: use pyplot functionsfrom matplotlib.pyplot import *plot([0, 1], [0, 1])      # plot a line from (0, 0) to (1, 1)title("a strait line")xlabel("x value")ylabel("y value")savefig("demo.jpg")

上面的每一条命令都很简单,你可以从函数名读出该函数所要实现的功能。比如plot为画线,title为增加标题。最终保存的demo.jpg如下:

matplotlib的核心是什么

上面的函数式调用很方便。在Python特殊方法与多范式中,我们已经谈到,Python中的函数式编程是通过封装对象实现的。matplotlib中的函数式调用其实也是如此。matplotlib本质上还是构建对象来构建图像。函数式编程将构建对象的过程封装在函数中,从而让我们觉得很方便。

在matplotlib.pyplot中,你还可以找到下面的绘图函数。如果你经常使用数据绘图程序,应该会很熟悉这些图形:

matplotlib的核心是什么 

绘图程序如下:

matplotlib的核心是什么View Code

上面用到的marvin.jpg是下图,请保存到当地电脑:

matplotlib的核心是什么

函数式编程创造了一个仿真MATLAB的工作环境,并有许多成形的绘图函数。如果只是作为Matplotlib的一般用户(非开发者),pyplot可以满足大部分的需求。

(当然,matplotlib是免费而开源的,MATLAB昂贵而封闭。这是不“仿真”的地方)

面向对象编程

尽管函数式绘图很便利,但利用函数式编程会有以下缺点:

1) 增加了一层“函数”调用,降低了效率。

2) 隶属关系被函数掩盖。整个matplotlib包是由一系列有组织有隶属关系的对象构成的。函数掩盖了原有的隶属关系,将事情变得复杂。

3) 细节被函数掩盖。pyplot并不能完全复制对象体系的所有功能,图像的许多细节调中最终还要回到对象。

4) 每件事情都可以有至少两种方式完成,用户很容易混淆。

而对于开发者来说,了解对象是参与到Matplotlib项目的第一步。

我们将上面的直线绘图更改为面向对象式(OO, object-oriented)的,为此,我们引入两个类: Figure和Figurecanvas。(函数式编程也调用了这些类,只是调用的过程被函数调用所遮掩。)

matplotlib的核心是什么

# object-oriented plotfrom matplotlib.figure import Figurefrom matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvasfig    = Figure()canvas = FigureCanvas(fig)ax     = fig.add_axes([0.1, 0.1, 0.8, 0.8])line,  = ax.plot([0,1], [0,1])ax.set_title("a straight line (OO)")ax.set_xlabel("x value")ax.set_ylabel("y value")canvas.print_figure('demo.jpg')

matplotlib的核心是什么

新的demo.jpg如下:

matplotlib的核心是什么

理解对象

上面的例子中,我们至少构建了四个对象: fig, canvas, ax, line。它们分别属于Figure类,FigureCanvas类,Axes类和Line2D类。(使用obj.__class__.__name__来查询对象所属的类)

在深入各个对象之前,我们先来做一个比喻。看下面一个图片:

matplotlib的核心是什么

这个图片是用KTurtle绘制。参看把你的孩子打造成为码农

可以看到,图中有一个房子,房子上有窗户和门,窗户上有条纹,门上有把手,此外图像外还有一只小乌龟。我们所提到的房子,窗户,门,条纹,把手,都可以称其为对象。不同的对象之间有依附关系,比如窗户和门属于房子,而把手属于门。乌龟和房子则是并行的两个对象。此外,整个图像外有一个方框,用来表明可绘图的范围,所有上面提到的元素都依附于该方框。

这就是用面向对象的方式来理解一个图像。事实上,对象是描述图像的最自然的方式,面向对象编程最成功的领域就是在计算机图形方面。

我们先来看什么是Figure和Axes对象。在matplotlib中,整个图像为一个Figure对象。在Figure对象中可以包含一个,或者多个Axes对象。每个Axes对象都是一个拥有自己坐标系统的绘图区域。其逻辑关系如下:

matplotlib的核心是什么

转过头来看直线图。整个图像是fig对象。我们的绘图中只有一个坐标系区域,也就是ax。此外还有以下对象。(括号中表示对象的基本类型)

matplotlib的核心是什么

Title为标题。Axis为坐标轴,Label为坐标轴标注。Tick为刻度线,Tick Label为刻度注释。各个对象之间有下面的对象隶属关系:

matplotlib的核心是什么

(yaxis同样有tick, label和tick label,没有画出)

尽管data是数据绘图的关键部分,也就是数据本身的图形化显示,但是必须和xaxis, yaxis, title一起,才能真正构成一个绘图区域axes。一个单纯的,无法读出刻度的线是没有意义的。xaxis, yaxis, title合起来构成了数据的辅助部分(data guide)。

上面元素又包含有多种图形元素。比如说,我们的data对象是一条线(Line2D)。title, tick label和label都是文本(Text),而tick是由短线(Line 2D)和tick label构成,xaxis由坐标轴的线和tick以及label构成,ax由xaxis, yaxis, title, data构成,ax自身又构成了fig的一部分。上面的每个对象,无论是Line2D, Text还是fig,它们都来自于一个叫做Artist的基类。

OO绘图的原程序还有一个canvas对象。它代表了真正进行绘图的后端(backend)。Artist只是在程序逻辑上的绘图,它必须连接后端绘图程序才能真正在屏幕上绘制出来(或者保存为文件)。我们可以将canvas理解为绘图的物理(或者说硬件)实现。

在OO绘图程序中,我们并没有真正看到title, tick, tick label, xaxis, yaxis对象,而是使用ax.set_*的方法间接设置了这些对象。但这些对象是真实存在的,你可以从上层对象中找到其“真身”。比如,fig.axes[0].xaxis就是我们上面途中的xaxis对象。我们可以通过fig -> axes[0] (也就是ax) -> xaxis的顺序找到它。因此,重复我们刚才已经说过的,一个fig就构成了一个完整的图像。对于每个Artist类的对象,都有findobj()方法,来显示该对象所包含的所有下层对象。

坐标

坐标是计算机绘图的基础。计算机屏幕是由一个个像素点构成的。想要在屏幕上显示图像,计算机必须告诉屏幕每个像素点上显示什么。所以,最贴近硬件的坐标体系是以像素为单位的坐标体系。我们可以通过具体说明像素位置来标明显示器上的某一点。这叫做显示坐标(display coordinate),以像素为单位。

然而,像素坐标不容易被纳入绘图逻辑。相同的程序,在不同的显示器上就要调整像素值,以保证图像不变形。所以一般情况下,还会有图像坐标和数据坐标。

图像坐标将一张图的左下角视为原点,将图像的x方向和y方向总长度都看做1。x方向的0.2就是指20%的图像在x方向的总长,y方向0.8的长度指80%的y方向总长。(0.5, 0.5)是图像的中点,(1, 1)指图像的右上角。比如下面的程序,我们在使用add_axes时,传递的参数中,前两个元素为axes的左下角在fig的图像坐标上的位置,后两个元素指axes在fig的图像坐标上x方向和y方向的长度。fig的图像坐标称为Figure坐标,储存在为fig.transFigure

(类似的,每个axes,比如ax1,有属于自己的图像坐标。它以ax1绘图区域总长作为1,称为Axes坐标。也就是ax1.transAxes。(0.5, 0.5)就表示在Axes的中心。Axes坐标和Figure坐标原理相似,只是所用的基准区域不同。)

matplotlib的核心是什么

# object-oriented plotfrom matplotlib.figure import Figurefrom matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvasfig    = Figure()canvas = FigureCanvas(fig)# first axesax1    = fig.add_axes([0.1, 0.1, 0.2, 0.2])line,  = ax1.plot([0,1], [0,1])ax1.set_title("ax1")# second axesax2    = fig.add_axes([0.4, 0.3, 0.4, 0.5])sca    = ax2.scatter([1,3,5],[2,1,2])ax2.set_title("ax2")canvas.print_figure('demo.jpg')

matplotlib的核心是什么

我们在绘图,比如使用plot的时候,绘制了两点间的连线。这两点分别为(0, 0)和(1, 1)。(plot中的第一个表为两个x坐标,第二个表为两个y坐标)。这时使用的坐标系为数据坐标系(ax1.transData)。我们可以通过绘出的坐标轴读出数据坐标的位置。

matplotlib的核心是什么

如果绘制的是具体数据,那么数据坐标符合我们的需求。如果绘制的是标题这样的附加信息,那么Axes坐标符合符合我们的需求。如果是整个图像的注解,那么Figure坐标更符合需求。每一个Artist对象都有一个transfORM属性,用于查询和改变所使用的坐标系统。如果为显示坐标,transform属性为None。

深入基础

在上面的例子中,无论是使用plot绘制线,还是scatter绘制散点,它们依然是比较成熟的函数。matplotlib实际上提供了更大的自由度,允许用户以更基础的方式来绘制图形,比如下面,我们绘制一个五边形。

matplotlib的核心是什么

# object-oriented plotfrom matplotlib.figure import Figurefrom matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvasfig    = Figure()canvas = FigureCanvas(fig)ax     = fig.add_axes([0.1, 0.1, 0.8, 0.8])from matplotlib.path import Pathimport matplotlib.patches as patchesverts = [    (0., 0.),     (0., 1.),    (0.5, 1.5),    (1., 1.),    (1., 0.),    (0., 0.),    ]codes = [Path.MOVETO,         Path.LINETO,         Path.LINETO,         Path.LINETO,         Path.LINETO,         Path.CLOSEPOLY,         ]path = Path(verts, codes)patch = patches.PathPatch(path, facecolor='coral')ax.add_patch(patch)ax.set_xlim(-0.5,2)ax.set_ylim(-0.5,2)canvas.print_figure('demo.jpg')

matplotlib的核心是什么

在上面的程序中。我们首先确定顶点,然后构建了一个path对象,这个对象实际上就是5个顶点的连线。在codes中,我们先使用MOVETO将画笔移动到起点,然后依次用直线连接(LINETO)(我们也可以用曲线来连线,比如CURVE4,但这里没有用到)。 在path建立了封闭的5边形后,我们在path的基础上构建了patch对象,是一个图形块。patch的背景颜色选为coral。最后,我们将这个patch对象添加到预先准备好的ax上,就完成了整个绘图。

matplotlib的核心是什么

上面的过程中,我们就好像拿着一个画笔的小孩,一步步画出心目中的图画。这就是深入理解matplotlib的魅力所在——创造你自己的数据绘图函数!

(将上面的程序封装到函数中,保留顶点以及其它参数接口,就构成了一个五边形绘图函数。O(∩_∩)O~ 我们也创造了新的“一键绘图”)

可以相像,一个plot函数如何用path对象实现。

以上是“matplotlib的核心是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: matplotlib的核心是什么

本文链接: https://www.lsjlt.com/news/229183.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • matplotlib的核心是什么
    小编给大家分享一下matplotlib的核心是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!matplotlib使用numpy进行数组运算,并调用一系列其他的...
    99+
    2023-06-02
  • hadoop的核心是是什么
    Hadoop的核心是一个分布式存储和计算框架,它允许用户在大规模集群上存储和处理大量数据。Hadoop包括两个主要组件:Hadoop...
    99+
    2024-04-02
  • 什么是JavaScript的核心
    本篇内容主要讲解“什么是JavaScript的核心”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是JavaScript的核心”吧! ...
    99+
    2024-04-02
  • vuex核心是什么
    这篇文章主要介绍“vuex核心是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vuex核心是什么”文章能帮助大家解决问题。 vuex是专门帮助vue管理的一个...
    99+
    2024-04-02
  • hadoop核心是什么
    hadoop的核心是分布式文件系统hdfs和MapReduce,HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算,Hadoop是一个由Apache基金会所开发的分布式系统基础架构,用户可以在不了解分布式底层细节的...
    99+
    2024-04-02
  • javascript核心是什么写的
    随着互联网的发展,JavaScript已经成为了一个非常重要的程序设计语言,不仅仅在Web开发中占据了重要地位,同时也在桌面程序开发、服务器端编程和游戏开发等领域得到了广泛应用。而JavaScript的成功之处在于,它不仅仅是一门语言,更是...
    99+
    2023-05-14
  • Zookeeper的核心原理是什么
    这篇文章主要介绍“Zookeeper的核心原理是什么”,在日常操作中,相信很多人在Zookeeper的核心原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Zookee...
    99+
    2024-04-02
  • ApacheBeam的核心概念是什么
    ApacheBeam的核心概念是将数据处理任务表示为数据流图,并提供统一的编程模型来处理批处理和流处理任务。关键概念包括: Pi...
    99+
    2024-03-06
    ApacheBeam
  • Vue的核心原理是什么
    这篇文章主要介绍“Vue的核心原理是什么”,在日常操作中,相信很多人在Vue的核心原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue的核心原理是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-29
  • Kafka的核心实践是什么
    这篇文章将为大家详细讲解有关Kafka的核心实践是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Kafka的核心实践  1.版本升级  之前大数据平台一...
    99+
    2024-04-02
  • Kubernetes的核心功能是什么
    本篇内容主要讲解“Kubernetes的核心功能是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Kubernetes的核心功能是什么”吧!Kubernetes 的核心功能整个系统由一个主节点...
    99+
    2023-06-27
  • Dubbo的核心功能是什么
    本篇内容介绍了“Dubbo的核心功能是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.Dubbo是什么?Dubbo 是一个分布式、高性...
    99+
    2023-06-05
  • ReentrantLock核心原理是什么
    本篇内容介绍了“ReentrantLock核心原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!&n...
    99+
    2024-04-02
  • 什么是AJAX核心对象
    本篇文章为大家展示了什么是AJAX核心对象,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。    Ajax是2005年2月才诞生但是现在...
    99+
    2024-04-02
  • Axios核心原理是什么
    这篇文章主要介绍“Axios核心原理是什么”,在日常操作中,相信很多人在Axios核心原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Axios核心原理是什么”的疑惑...
    99+
    2024-04-02
  • Angular2核心概念是什么
    这篇文章主要介绍“Angular2核心概念是什么”,在日常操作中,相信很多人在Angular2核心概念是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Angular2核心...
    99+
    2024-04-02
  • Flutter核心原则是什么
    这篇文章主要介绍“Flutter核心原则是什么”,在日常操作中,相信很多人在Flutter核心原则是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Flutter核心原则是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-04
  • Vue核心思想是什么
    这篇文章给大家分享的是有关Vue核心思想是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Vue核心思想:数据驱动、组件化1、数据驱动传统的前端数据交互是用 Ajax 从服务端...
    99+
    2024-04-02
  • JavaScript核心语法是什么
    本文小编为大家详细介绍“JavaScript核心语法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript核心语法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新...
    99+
    2024-04-02
  • javascript核心对象是什么
    这篇文章主要介绍了javascript核心对象是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。javascript核心对象:1、Math...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作