zoukankan      html  css  js  c++  java
  • Python3.0科学计算学习之绘图(三)

    matplotlib对象:

     使用matplotlib的pyplot模块,可以供用户直接使用最重要的绘图命令。多数情况下,我们希望创建一个图形并且立即展示出来,但是有时如果生成要通过更改其属性来修改的图形,就需要用面向对象的方式来处理图形对象。

    (1) 坐标轴对象:创建一个需要稍后修改的绘图时,需要引入一个图形和坐标轴对象。

    首先,创建一个图形,然后在该图形中定义一些坐标轴以及这些坐标轴的位置,记住要将这些对象赋值给变量

    fig=plt.figure(1)

    ax=plt.subplot(111)   #plt.subplot()生成子图,不能通过空figure绘图,必须用add_subplot()创建一个或者多个子subplot绘图区才能绘图,一个图形可以有多个坐标轴对象

    接着, 将图形与给定的坐标轴对象相关联

    import numpy as np

    import matplotlib.pyplot as plt

    fig=plt.figure(1)

    ax=plt.subplot(111)

    x=np.linspace(0,2*np.pi,100)

    amod_sin = lambda x:(1.-0.1*np.sin(25*x))*np.sin(x)

    ax.plot(x,np.sin(x),label='sin')    #设置正弦曲线

    ax.plot(x,amod_sin(x),label='modsin')

    plt.legend()

    #所得图形如下:

                         

    (2) 修改线条属性通过其标签识别了特定的线条对象,其是索引了i1的列表中的一个元素,可通过相应的setter()方法来更改线条属性,如下实例

    import numpy as np

    import matplotlib.pyplot as plt

    fig=plt.figure()

    ax=plt.subplot(111)

    x=np.linspace(0,2*np.pi,100)

    amod_sin = lambda x:(1.-0.1*np.sin(25*x))*np.sin(x)

    ax.plot(x,np.sin(x),label='sin')

    ax.plot(x,amod_sin(x),label='modsin')

    plt.legend()       #同上

    ax.lines           #这两个绘图命令使用两个Line2D对象来填充列表ax.lines

    #使用标签,使以后能够采用简单的方式来识别对象

    for i1,line in enumerate(ax.lines):

        if line.get_label()=='sin':

            break

    ax.lines[i1].set_linestyle('-.')    #通过相应的setter()方法更改属性

    ax.lines[i1].set_linewidth(2)

    #修改数据

    ydata=ax.lines[i1].get_ydata()

    ydata[-1]=-0.5      

    ax.lines[i1].set_ydata(ydata)

    #运行结果如下:最后一个数据点损坏的曲线。

                                        

    3) 注释

    使用annotate方法在给定位置和坐标点上设置注释

    语法说明annotates=str,xy=(x,y),xytext=(i1,i2),;... 

    其中:s为注释文本内容;   xy为被注释的坐标;   xytext为注释文字的坐标位置

    extcoords设置注释文字偏移量;

    arrowprops箭头参数,参数类型为字典(由字典所指定的箭头属性),其中:

      width  点箭头的宽度       headwidth在点的箭头底座的宽度

      shrink总长度为分数,“缩水”从两端    facecolor表示箭头颜色

    bbox给标题添加外框,常用参数如下:boxstyle方框外形

    facecolor背景颜色,  edgecolor边框线条颜色,  edgewidth边框线条大小

    实例如下:

    annot1=ax.annotate('已调幅的曲线',(2.1,1.0),(3.2,0.5),

                 arrowprops={'width':2,'color':'k','connectionstyle':'arc3,rad=+0.5','shrink':0.05},

                 verticalalignment='bottom',horizontalalignment='left',fontsize=15,

                 bbox={'facecolor':'gray','alpha':0.1,'pad':10})

    # ## 该注释中,箭头指向坐标为(2.11.0)的点,文本的左下坐标为(3.20.5)。

    演示了由arrowprop字典所指定的箭头属性,由shrink键来缩放箭头,设置为0.05就是表示将箭头大小减小5%,以保持与其指向的线性的距离。箭头遵循样条弧形状或者使用connectionstyle键来设置其他形状。

    annot2=ax.annotate('已损坏的数据',(6.3,-0.5),(6.1,-1.1),

                       arrowprops={'width':0.5,'color':'k','shrink':0.05},

                      horizontalalignment='center',fontsize=12)

                                          

    注释删除:可以将注释对象分配给一个变量,这样可以通过其remove方法来删除注释

    例如:annot1.remove()

    (4) 曲线间的填充面积

    plt.fill_between()函数对图像进行填充

     填充是突出曲线间差异的理想工具,fill_between(x,y1,y2) 函数用来填充y1,y2两个函数之间的区域

    实例:Python中利用matplotlib进行曲线的部分填充:

    情形一:axf=ax.fill_between(x,np.sin(x),amod_sin(x),facecolor='gray')

                                                     

    情形二:填充指定区域:

    #fill_between中使用where语句进行填充where是一个非常便捷的参数,需要一个布尔数组来指定额外的填充条件,用来选择要填充的区域的布尔数组是amod_sin(x)-np.sin(x)>0

    axf=ax.fill_between(x,np.sin(x),amod_sin(x),where=amod_sin(x)-np.sin(x)>0,facecolor='gray')

                                                                  

    (5) 刻度与刻度标签 

    实例:通过删除X轴和Y轴的刻度以及引入与问题相关的刻度标签来简化图片。

    ax.set_xticks(np.array([0,np.pi/2,np.pi,3/2*np.pi,2*np.pi]))

    ax.set_xticklabels(('$0$','$pi/2$','$pi$','$3/2 pi$','$2pi$'),fontsize=18)               

    ax.set_yticks(np.array([-1,0.,1]))

    ax.set_yticklabels(('$-1$','$0$','$1$'),fontsize=18)

    #注意:在字符串中使用LaTeX格式来表示希腊字母、正确设置公式并使用LaTeX字体。

    #已调幅的正弦函数的完整示例图:

                                                 

  • 相关阅读:
    bzoj 4361: isn
    bzoj 2560: 串珠子
    bzoj 3622: 已经没有什么好害怕的了
    UOJ #30. 【CF Round #278】Tourists
    Codeforces Round #452 E. New Year and Old Subsequence
    bzoj 2653: middle
    codeforces701C
    codeforces437C
    codeforces518B
    codeforces706C
  • 原文地址:https://www.cnblogs.com/chenzhijuan-324/p/10685085.html
Copyright © 2011-2022 走看看