精华内容
下载资源
问答
  • 运用python库matplotlib绘制坐标图

    千次阅读 2019-10-16 16:00:37
    很多时候我们数据处理的时候要画坐标图,下面我用第三方库matplotlib以及scipy绘制光滑的曲线图 需要安装的库有 matplotlib,scipy, numpy import matplotlib.pyplot as plt import numpy as np from mpl_toolkits....

    很多时候我们数据处理的时候要画坐标图,下面我用第三方库matplotlib以及scipy绘制光滑的曲线图

    需要安装的库有 matplotlib,scipy, numpy

    import matplotlib.pyplot as plt
    import numpy as np
    from mpl_toolkits.axisartist.axislines import Subplot
    from scipy import interpolate
    
    
    def sommth_plot(x_arr, y_arr):
        fig = plt.figure()   # 创建一个figure
        ax = Subplot(fig, 111)   # 利用Subplot将figure加入ax
        fig.add_axes(ax)
        ax.axis['bottom'].set_axisline_style("->", size=1.5)  # x轴加上箭头
        ax.axis['left'].set_axisline_style("->", size=1.5)  # y轴加上上箭头
        ax.axis['top'].set_visible(False)  # 去除上方坐标轴
        ax.axis['right'].set_visible(False)  # 去除右边坐标轴
        xmin = min(x_arr)  
        xmax = max(x_arr)
        xnew = np.arange(xmin, xmax, 0.0005)  # 在最大最小值间以间隔为0.0005插入点
        func = interpolate.interp1d(x_arr, y_arr) 
        ynew = func(xnew)  # 得到插入x对应的y值
        plt.plot(xnew, ynew, '-')  # 绘制图像
        plt.show()  # show图像
    
    
    if __name__ == '__main__':
        x = eval(input('输入x:'))
        y = eval(input('输入y:'))
        smooth_plot(x, y)
    

    如果想进一步完善你的图像,可以用以下代码

    # 设置图像标题
    plt.title('title')
    
    # 设置x范围,y同理
    plt.xlim(1, 4)
    
    # 给x,y轴添加说明
    plt.xlabel('x')
    plt.ylabel('y')
    
    # 设置线条的颜色,宽度,线条样式,标志以及曲线的标签
    plt.plot(x, y, color='blue', linewidth=1.0, linestyle='--', marker='o', label='')
    # 如果传递了label参量,则使用下面函数使标签显示,loc选择位置,frameon=True标签会在一个框内
    plt.legend(loc='upper left', frameon=True)
    
    
    展开全文
  • matplotlib绘图

    2017-12-15 19:36:33
    matplotlib是基于Python语言的开源项目,旨在为Python提供一个数据绘图包。我将在这篇文章中介绍matplotlib API的核心对象,并介绍如何使用这些对象来实现绘图。实际上,matplotlib的对象体系严谨而有趣,为使用者...

    转自:http://www.cnblogs.com/vamei/archive/2013/01/30/2879700.html

    matplotlib是基于Python语言的开源项目,旨在为Python提供一个数据绘图包。我将在这篇文章中介绍matplotlib API的核心对象,并介绍如何使用这些对象来实现绘图。实际上,matplotlib的对象体系严谨而有趣,为使用者提供了巨大的发挥空间。用户在熟悉了核心对象之后,可以轻易的定制图像。matplotlib的对象体系也是计算机图形学的一个优秀范例。即使你不是Python程序员,你也可以从文中了解一些通用的图形绘制原则。

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

     

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

    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 functions

    from
    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如下:

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

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

     

     

    绘图程序如下:

    View Code

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

     

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

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

     

    面向对象编程

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

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

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

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

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

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

     

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

    复制代码
    # object-oriented plot

    from
    matplotlib.figure import Figure from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas fig = 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')
    复制代码

    新的demo.jpg如下:

     

    理解对象

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

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

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

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

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

     

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

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

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

    (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坐标原理相似,只是所用的基准区域不同。)

    复制代码
    # object-oriented plot
    from matplotlib.figure import Figure
    from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
    
    fig    = Figure()
    canvas = FigureCanvas(fig)
    
    # first axes
    ax1    = fig.add_axes([0.1, 0.1, 0.2, 0.2])
    line,  = ax1.plot([0,1], [0,1])
    ax1.set_title("ax1")
    
    # second axes
    ax2    = 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')
    复制代码

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

     

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

     

    深入基础

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

    复制代码
    # object-oriented plot
    
    from matplotlib.figure import Figure
    from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
    
    fig    = Figure()
    canvas = FigureCanvas(fig)
    ax     = fig.add_axes([0.1, 0.1, 0.8, 0.8])
    
    from matplotlib.path import Path
    import matplotlib.patches as patches
    
    verts = [
        (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')
    复制代码

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

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

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

     

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

     

    总结

    我们已经了解了matplotlib的最重要的方面,它们是:

    1) pyplot函数绘图借口

    2) 对象如何组合成为图像

    3) 坐标系统

    希望我的讲解没有消耗完你对matplotlib的兴趣。事实上,matplotlib是发展相当迅猛的绘图包,而它的开放性也让它成为了解计算机图形学的一个好接口。利用开放的核心对象,你可以随心的定制自己的数据绘图,而不用受制于高层的调用函数。谢谢John D. Hunter。

     

    展开全文
  • 流线图可以被用来可视化矢量场的流态。如科学和自然学科中的磁场、万有引力和流体运动等均可以用流线图表示。矢量场通过为每个点指定一个线条和一个或多个箭头的...这时就需要使用matplotlib来画这样的流线图了。 .

    流线图可以被用来可视化矢量场的流态。如科学和自然学科中的磁场、万有引力和流体运动等均可以用流线图表示。矢量场通过为每个点指定一个线条和一个或多个箭头的方式进行可视化。强度可以用线条长度表示,方向由指向特定方向的箭头表示。通常,力的强度用特定流线的长度显示,但是有时也可以用流线的密度来表示。

     

    这种图示经常会在物理应用上,比如要展示磁铁磁场。如果你是物理老师要想在PPT上显示这种图,怎么样来画呢?要使用普通的绘图工具,显然画不出来这样的专业的图。这时就需要使用matplotlib来画这样的流线图了。

     

    matplotlib定义一个函数专门画这样的图:

    Axes.streamplot(axes, x, y, u, v, density=1, linewidth=None, color=None, cmap=None, norm=None, arrowsize=1, arrowstyle='-|>', minlength=0.1, transform=None, zorder=None, start_points=None, maxlength=4.0, integration_direction='both', *, data=None)

    函数里定义有很多参数,先来学会使用x,y,u,v这四个参数。

    x, y &#x

    展开全文
  • python之matplotlib详解

    万次阅读 多人点赞 2018-07-15 16:18:18
    matplotlib是基于Python语言的开源项目,旨在为Python提供一个数据绘图包。我将在这篇文章中介绍matplotlib API的核心对象,并介绍如何使用这些对象来实现绘图。实际上,matplotlib的对象体系严谨而有趣,为使用者...

        matplotlib是基于Python语言的开源项目,旨在为Python提供一个数据绘图包。我将在这篇文章中介绍matplotlib API的核心对象,并介绍如何使用这些对象来实现绘图。实际上,matplotlib的对象体系严谨而有趣,为使用者提供了巨大的发挥空间。用户在熟悉了核心对象之后,可以轻易的定制图像。matplotlib的对象体系也是计算机图形学的一个优秀范例。即使你不是Python程序员,你也可以从文中了解一些通用的图形绘制原则。

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

                     

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

                                                 

    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 functions
    
    from 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如下:

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

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

    绘图程序如下:

    import matplotlib.pyplot as plt
    
    # 1D data
    x = [1,2,3,4,5]
    y = [2.3,3.4,1.2,6.6,7.0]
    
    plt.figure(figsize=(12,6))
    
    plt.subplot(231)
    plt.plot(x,y)
    plt.title("plot")
    
    plt.subplot(232)
    plt.scatter(x, y)
    plt.title("scatter")
    
    plt.subplot(233)
    plt.pie(y)
    plt.title("pie")
    
    plt.subplot(234)
    plt.bar(x, y)
    plt.title("bar")
    
    # 2D data
    import numpy as np
    delta = 0.025
    x = y = np.arange(-3.0, 3.0, delta)
    X, Y = np.meshgrid(x, y)
    Z    = Y**2 + X**2
    
    plt.subplot(235)
    plt.contour(X,Y,Z)
    plt.colorbar()
    plt.title("contour")
    
    # read image
    import matplotlib.image as mpimg
    img=mpimg.imread('marvin.jpg')
    
    plt.subplot(236)
    plt.imshow(img)
    plt.title("imshow")
    
    plt.savefig("matplot_sample.jpg")

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

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

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

     面向对象编程

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

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

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

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

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

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

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

    # object-oriented plot
    
    from matplotlib.figure import Figure
    from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
    
    fig    = 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')

    新的demo.jpg如下:

    理解对象

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

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

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

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

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

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

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

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

    (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坐标原理相似,只是所用的基准区域不同。)

    # object-oriented plot
    from matplotlib.figure import Figure
    from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
    
    fig    = Figure()
    canvas = FigureCanvas(fig)
    
    # first axes
    ax1    = fig.add_axes([0.1, 0.1, 0.2, 0.2])
    line,  = ax1.plot([0,1], [0,1])
    ax1.set_title("ax1")
    
    # second axes
    ax2    = 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')
    ​

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

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

    深入基础

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

    # object-oriented plot
    
    from matplotlib.figure import Figure
    from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
    
    fig    = Figure()
    canvas = FigureCanvas(fig)
    ax     = fig.add_axes([0.1, 0.1, 0.8, 0.8])
    
    from matplotlib.path import Path
    import matplotlib.patches as patches
    
    verts = [
        (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')

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

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

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

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

    总结

    我们已经了解了matplotlib的最重要的方面,它们是:

    1) pyplot函数绘图接口

    2) 对象如何组合成为图像

    3) 坐标系统

    希望我的讲解没有消耗完你对matplotlib的兴趣。事实上,matplotlib是发展相当迅猛的绘图包,而它的开放性也让它成为了解计算机图形学的一个好接口。利用开放的核心对象,你可以随心的定制自己的数据绘图,而不用受制于高层的调用函数。谢谢John D. Hunter。

    原文:http://www.cnblogs.com/vamei 

    展开全文
  • 当我们要显示数据时,偶尔会遇到这样的问题,比如一条连续的曲线,由于物理条件限制,导致在某一个区域里不能取值,那么画曲线的时候,中间不能有值,也不能用连线连接起来。这时需要怎么处理呢?如果只是删除中间的...
  • matplotlib 绘图之坐标变换

    千次阅读 2021-01-23 16:15:24
    因为涉及到坐标变换,因此先把 matplotlib 的坐标变换总结一下。 示例代码有很多重复部分,文中仅贴出关键不同的部分,需要完整的代码,请到这里 https://download.csdn.net/download/sinat_32570141/14926207 下载...
  • 当我们想要使用坐标系来表示数据的关系时,往往需要给坐标系进行命名,比如物理学上的时间-距离曲线,就会把X轴命名为时间,Y轴命名为距离,这样画出来的曲线就是时间-距离曲线。当我们想表示收入-时间曲线时,可以...
  • [机器学习篇]机器学习知识总结篇

    万次阅读 热门讨论 2017-03-08 22:36:48
    numpy/scipy/matplotlib/panda的介绍和典型使用 多元高斯分布 泊松分布、幂律分布 典型图像处理 #5、Python基础2 - 机器学习库 scikit-learn的介绍和典型使用 损失函数的绘制 多种数学曲线 多项式拟合 ...
  • matplotlib安装及使用

    万次阅读 多人点赞 2018-12-14 15:44:20
    1、Matplotlib简介 2、Matplotlib安装 3、Matplotlib导入 4、Matplotlib基本应用 5、画图种类 5.1、Scatter散点图 5.2、条形图 5.3、等高线图 5.4、Image图片 5.5、3D图像 6、多图合并显示 6.1、Subplot...
  • 大家好,最近在研究在搞Python的大作业,有个需求就是利用Matplotlib画几个像模像样的统计图然后合并在一张图中,因为此前很少用这方面的东西,所以折腾了不少时间,今天介绍一下。 subplot多合一 其实,利用python...
  • ”——物理学家惠勒 分形理论是在上世纪70年代由芒德布罗几乎集一己之力创立的,但其严格的数学基础之一——芒德布罗集,却是70年代末芒德布罗及布鲁克斯、马蒂尔斯基以及道阿迪、哈伯德、沙斯顿等人几乎同时分别...
  • 点上方人工智能算法与Python大数据获取更多干货 在右上方 ··· 设为星标 ★,第一时间获取资源 仅做学术分享,如有侵权,联系删除 转载于 :来源:网络 | 编辑:法纳斯特 编辑:JackCui 导读 Matplotlib 是一个...
  • matplotlib核心剖析

    2017-10-12 15:42:16
    matplotlib是基于Python语言的开源项目,旨在为Python提供一个数据绘图包。我将在这篇文章中介绍matplotlib API的核心对象,并介绍如何使用这些对象来实现绘图。实际上,matplotlib的对象体系严谨而有趣,为使用者...
  • 如果作为一个物理老师,也需要讲述力向量的方向和合成。如果需要现场可以动态在修改示意图时,你再采用预先绘制的方式,就不会适用,这时就可以采用matplotlib来动态编程,以便课堂上动态在修改,也可以分发给学生去...
  • import matplotlib.pyplot as plt courses = ["语文", "数学", "英语", "物理", "化学", "生物"] x_arange = np.arange(len(courses)) # [0 1 2 3 4 5],相当于x轴上的坐标序列 scores_zhangsan = [76, 98, 67, 95...
  • 在默认情况下,Matplotlib在设置title和标注text时如果使用中文,会出现尴尬的框框。使用以下两种方法可以轻松化解尴尬,让您在使用Matplotlib绘图时展露愉悦笑容。1,使...
  • Matplotlib pyplot嵌入PYQT5的实战与反思

    千次阅读 多人点赞 2019-04-14 14:16:03
    ‘’‘第一次使用csdn的博客内容,写的有问题的地方以后再行更改’’’ 最近因为毕业设计的原因接触到pyqt5的库,用了一段时间,就想把使用过程中发生的事情记录下来,以供日后学习使用。 0.参考书目 ...
  • from matplotlib import pyplot import numpy import math e=math.e # loge那个e # x=[-6.0,-4.0,-2.0,0.26,1.17,2.84,3.18,3.32,3.56,3.71,3.82,3.93,4.02,4.11,4.19] # y=[-3.5,-1.4,-0.7,0.22,1.02,4.0,7.0,10,20...
  • matplotlib绘制雷达图

    千次阅读 2021-05-22 21:55:34
    import matplotlib.pyplot as plt # 用于正常显示中文 #plt.rcParams['font.family'] = ['sans-serif']#如果是windows系统请去掉这行注释 #plt.rcParams['font.sans-serif'] = ['SimHei']#如果是windows系统请去掉...
  • Matplotlib中,条形图用以下的函数来画: ax.bar(x, height, width, bottom, align) 该函数制作了一个大小为(x -width=2;x+width=2;底;底+高)的约束矩形的条形图。 参数解释如下: 参数
  • 注:关于环境的搭建:安装Python, numpy和matplotlib。(可以到python.org下载Python编译器。相关Python包的安装,请参看Python小技巧)。matplotlib的官网是: http://matplotlib.org/ 官网有丰富的图例和文档说明...
  • 觉得物理太难了?本文将模拟N维空间中的某些向量场(例如电磁场),以便你更清晰地理解这些概念。 理论基础 向量 任何物理场景的基本元素都是向量。我们需要什么?需要向量的算术运算、距离、模块以及一些...
  • subject_name = ['概率论','信号与系统','激光原理','光电物理','模电','单片机','大学英语','毛概','形势与政策'] x = range(len(subject_name))#自动生成X坐标序列 y1=[99,99,99,99,99,99,99,99,99]#我的成绩(瞎...
  • Python3.绘图基础matplotlib.pyplot

    千次阅读 2017-10-30 17:51:41
    能够方便地绘图是MATLAB一大优势,但这方面现在并不领先Python。 以环境物理学原理课一次作业为例,除去数据处理部分,使用matplotlib.pyplot结合一点pandas,绘制出不输MATLAB的常用曲线图。
  • 数据可视化: matplotlib绘制动态图及3维动画

    万次阅读 多人点赞 2019-05-12 16:23:02
    动画可以有趣地展示某种现象。相比于静态图表,人们更容易被动画和交互...上图是用Matplotlib实现的雨滴模拟,Matplotlib库被人们亲切地称为Python可视化包的祖父。Matplotlib通过设置50个散射点的比例和不透明度的...
  • 05-Matplotlib中图像的尺寸和分辨率

    千次阅读 2019-11-16 15:02:17
    05-Matplotlib中图像的尺寸和分辨率 上一篇详细讨论了显示器的尺寸、分辨率,PPI,DPI的概念,在这个基础上,我们讨论图像的尺寸和分辨率就要容易得多了,如果你还没有阅读上一篇,而对这些概念又不是非常、非常地...
  • 相干在物理学上还有更加普遍的意义,它代表两个波,或者波集,具有的相关性( correlation)。 假如自己发出一束电磁波出去,而再接受一束电磁波返回,怎么样判断是否自己发射出去再返回的电磁波,就可以采用相干性...
  • 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢! matplotlib是基于Python语言的开源项目,旨在为Python提供一
  • 实验二、数据处理之Matplotlib

    千次阅读 2020-04-30 19:42:30
    实验二、数据处理之Matplotlib 一、实验目的 1. 了解matplotlib库的基本功能 2. 掌握matplotlib库的使用方法 二、实验工具: 1. Anaconda 2. Numpy,matplotlib 三、Matplotlib简介 Matplotlib 包含了几十个不同的...
  • Matplotlib 中文用户指南 4.5 标注

    万次阅读 多人点赞 2017-01-30 11:44:52
    对于物理坐标系(点或像素),原点是图形或轴的左下角。 或者,你可以通过在可选关键字参数 arrowprops 中提供箭头属性字典来绘制从文本到注释点的箭头。 arrowprops 键 描述 width ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,063
精华内容 1,625
关键字:

matplotlib物理