zoukankan      html  css  js  c++  java
  • Matplotlib随记1

    Matplotlib概况

           在我们进行机器学习分析的时候,通常需要将我们所需要的结果进行图像化表示出来,以方便我们可以更加形象的看到数据变化大趋势。在我进行寻找相应的工具时,我发现了Matplotlib是一个相当好的工具,主要是因为Matplotlib有很强大的功能,它可以为我们汇出各种美丽的图形,比如线图,散点图,等高线图,条形图,柱状图,3D图形,甚至是动画图像等等,我们可以根据自己的需求绘出自己所需要的图形。比如说,以下几个图形就是我们通过Matplotlib进行绘制的

         

    Matplotlib安装

    俗话说,“工欲善其事必先利其器”,在学习matplotlib之前,必先安装好matplotlib相关环境,我用的是ubuntu16.04系统,安装相对比较简单。打开控制台窗口,在窗口中输入:

    #python 3+ 请使用以下代码
    $ sudo apt-get install python3-matplotlib
    #python 2+ 请使用以下代码
    $ sudo apt-get install  python-matplotlib

    在安装好matplotlib之后,我们就可以尽兴的翱翔在matplotlib的海洋里面了

    matplotlib基本用法

    首先我们要使用import 导入matplotlib,在使用matplotlib时,我们通常不需要导入matplotlib整个模块,而是只需导入matplotlib中的pyplot这一个模块即可,并简写成plt;使用import 导入模块numpy,并简写成np

    import matplotlib.pyplot as plt
    import numpy as np

    使用np.linspace定义x:范围是(-1,1);个数是50,仿真一位数据组(x,y)表示曲线1

    x=np.linspace(-1,1,50)
    y=2*x + 1

    使用plt.figure定义一个图像窗口,使用plt.plot画(x,y)曲线。使用plt.show显示图像

    plt.figure()
    plt.plot(x,y)
    plt.show()

    完整代码如下:

    import matplotlib.pyplot as plt
    import numpy as np
    x=np.linspace(-1,1,50)
    y=2*x + 1
    plt.figure()
    plt.plot(x,y)
    plt.show()

    绘成的图像如下:

     

    figure线条

    在上面的基础上,使用plt.figure()定义一个图像窗口:编号为3;大小为(8,5)。使用plt.plot画(x,y2)曲线。使用plt.plot画(x,y1)曲线,曲线的颜色属性(color)为红色;曲线的宽度(linewidth)为1.0;曲线的类型(linestyle)为虚线。使用plt.show显示图像

    plt.figure(num=3,figsize=(8,5),)
    plt.plot(x,y2)
    plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')

    完成代码为:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x=np.linspace(-3,3,50)
    y1=2*x +1
    y2=x**2
    
    plt.figure()
    plt.plot(x,y1)
    
    plt.figure(num=3,figsize=(8,5),)
    plt.plot(x,y2)
    plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
    plt.show()

    其产生的图像为:

    设置坐标轴

    下面主要是介绍如何在matplotlib中如何设置坐标轴的范围,单位长度,替代文字等等

    使用plt.figure定义一个图像窗口,使用plt.plot画(x,y2)曲线。使用plt.plot画(x,y1)曲线,曲线的颜色属性(color)为红色;曲线的宽度(linewidth)为1.0;曲线的类型(linestyle)为虚线

    plt.figure()
    plt.plot(x,y2)
    plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')

    使用plt.xlim设置x坐标轴范围:(-1,2);使用plt.ylim设置y坐标轴范围:(-2,3);使用plt.xlable设置x坐标轴名称:‘I am X';使用plt.ylabel设置y坐标轴名称:‘I am y';

    plt.xlim((-1,2))
    plt.ylim((-2,3))
    plt.xlabel('I am x')
    plt.ylabel('I am y')

    使用np.linspace定义范围及个数:范围是(-1,2);个数是5.使用print函数打印出新定义的范围。使用plt.xticks设置x轴刻度:范围是(-1,2);个数是5

    new_ticks=np.linspace(-1,2,5)
    print(new_ticks)
    plt.xticks(new_ticks)

    使用plt.yticks设置y轴刻度以及名称:刻度为[-2,-1.8,-1,1.22,3];对应刻度的名称为['really bad','bad','normal','good','really good'].使用plt,show显示图像。

    plt.yticks([-2,-1.8,-1,1.22,3],[r'$really bad$',r'$bad$',r'$normal$',r'$good$',r'$eally good$'])

    使用plt.gca获取当前坐标轴的信息。使用.spines设置边框:右侧边框;使用.set_color设置边框颜色:默认白色;使用.spines设置边框:上边框;使用.set_color设置边框颜色:默认白色;

    ax=plt.gca()
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')

    下一步我们调整坐标轴。使用.xaxis.set_ticks_position设置x坐标刻度数字或名称的位置:bottom(所有位置:top,bottom,both,default,none)

    ax.xaxis.set_ticks_position('bottom')

    使用.spines设置边框:x轴;使用.set_position设置边框位置:y=0的位置;(位置所有属性:outward,axes,data)

    ax.spines['bottom'].set_position(('data',0))

    使用.yaxis.set_ticks_position设置y坐标刻度数字或者名称的位置:left(所有位置:left,right,both,default,none)

    ax.yaxis.set_ticks_position('left')

    使用.spines设置边框:y轴;使用.set_position设置边框位置:x=0的位置;(位置所有属性:outward,axes,data)  使用plt.show显示图像

    ax.spines['left'].set_position(('data',0))
    plt.show()

    全部代码如下:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x=np.linspace(-3,3,50)
    y1=2*x + 1
    y2=x**2
    
    plt.figure()
    plt.plot(x,y2)
    plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
    
    plt.xlim((-1,2))
    plt.ylim((-2,3))
    plt.xlabel('I am x')
    plt.ylabel('I am y')
    
    new_ticks=np.linspace(-1,2,5)
    print(new_ticks)
    plt.xticks(new_ticks)
    
    plt.yticks([-2,-1.8,-1,1.22,3],[r'$really bad$',r'$bad$',r'$normal$',r'$good$',r'$eally good$'])
    
    
    ax=plt.gca()
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    
    ax.xaxis.set_ticks_position('bottom')
    
    ax.spines['bottom'].set_position(('data',0))
    
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data',0))
    
    
    plt.show()

    结果如下:

    legend 图例

    在matplotlib中,我们通常使用其中的legend图例来帮助我们展示每个数据对应的图像名称,从而更好的让读者认识你的数据结构

    在这里,我们对图中的两条线进行绘制,首先我们设置两条线的类型信息(蓝色实线和红色虚线)

    l1,=plt.plot(x,y2,label='linear line')
    l2,=plt.plot(x,y1,color='red',lineWidth=1.0,linestyle='--',label='square line')

    legend将要显示的信息来自于上面代码中的label,所以我们只需要简单写一下代码,plt就能自动的为我们添加图例

    plt.legend(loc='upper right')

    其中,参数 loc='upper right' 表示图例将添加在图中的右上角

    但是,有时候我们想调整图例的位置和名称,比如如果我们想单独修改之前的label信息,给不同类型的线条设置图例信息,我们可以在plt.legend中输入更多的参数。如果以以下这种形式添加legend,我们需要确保,在上面的代码plt.plot(x,y2,label='linear line')和plt.plot('x,y1,label=''square line')中有用变量l1,l2分别存储起来。而且我们需要注意的是l1,l2要以逗号结尾,因为我们需要确保plt.plot()返回的是一个列表。

    plt.legend(handles=[l1,l2],labels=['up','down'],loc='best')

    这样我们就能分别重新设置线条对应的label了

    其中,'loc'参数有很多,‘best'表示自动分配最佳位置,其余的如下:

    ‘best’:0,
    'upper right' : 1,
    'upper left' : 2,
    'lower left' : 3,
    'lower right' : 4,
    'right' : 5,
    'center left' : 6,
    'center right' : 7,
    'lower center' : 8,
    'upper center' : 9,
    'center' : 10,

    这部分的完整代码如下:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x=np.linspace(-3,3,50)
    y1=2*x + 1
    y2=x**2
    
    plt.figure()
    
    plt.xlim((-1,2))
    plt.ylim((-2,3))
    
    new_ticks=np.linspace(-1,2,5)
    print(new_ticks)
    plt.xticks(new_ticks)
    
    plt.yticks([-2,-1.8,-1,1.22,3],[r'$really bad$',r'$bad$',r'$normal$',r'$good$',r'$eally good$'])
    
    l1,=plt.plot(x,y2,label='linear line')
    l2,=plt.plot(x,y1,color='red',lineWidth=1.0,linestyle='--',label='square line')
    #plt.legend(loc='upper right')
    plt.legend(handles=[l1,l2],labels=['up','down'],loc='best')
    plt.show()

    所产生的图像如下:

    Annotation标注

    在我们画图形需要对某些特殊地方进行标注时,我们可以使用annotation.matplotlib中的annotation中的两种方法,一种是plt里面的annotate,另外一种直接用plt里面的text来写标注

    首先,我们绘制一条直线

    import matplotlib.pyplot as plt
    import numpy as np
    
    x=np.linspace(-3,3,50)
    y=2*x + 1
    
    plt.figure(num=1,figsize=(8,5),)
    plt.plot(x,y,)

    之后,我们再移动坐标轴的位置

    ax=plt.gca()
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data',0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data',0))

    之后,我们再标注出(x0,y0)的位置信息,用plt.plot([x0,x0,],[0,y0,],'k--',linewidth=2.5)画出一条垂直于x轴的虚线

    x0=1
    y0=2*x0 + 1;
    plt.plot([x0,x0,],[0,y0,],'k--',linewidth=2.5)
    plt.scatter([x0, ],[y0, ],s=50,color='b')

    再之后,我们对图像添加一些注释,比如我们可以对(x0,y0)这个点添加注释

    plt.annotate(r'$2x+1=%s$' % y0 , xy = (x0,y0) , xycoords='data' , xytext=(+30,-30) ,
        textcoords='offset points' , fontsize=16 ,
        arrowprops=dict(arrowstyle='->',connectionstyle="arc3,rad=.2"))

    我们也可以对文本中添加一些需要的注释

    plt.text(-3.7,3,r'$This is the some text. mu sigma_i alpha_t$',
        fontdict={'size':16,'color':'r'})

    其中,-3.7和3是选取在文本中添加注释的位置,空格需要用到转字符,fontdict设置字体。

    其中,本部分的全部源码是:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x=np.linspace(-3,3,50)
    y=2*x + 1
    
    plt.figure(num=1,figsize=(8,5),)
    plt.plot(x,y,)
    
    ax=plt.gca()
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data',0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data',0))
    
    
    x0=1
    y0=2*x0 + 1;
    plt.plot([x0,x0,],[0,y0,],'k--',linewidth=2.5)
    plt.scatter([x0, ],[y0, ],s=50,color='b')
    
    plt.annotate(r'$2x+1=%s$' % y0 , xy = (x0,y0) , xycoords='data' , xytext=(+30,-30) ,
        textcoords='offset points' , fontsize=16 ,
        arrowprops=dict(arrowstyle='->',connectionstyle="arc3,rad=.2"))
    
    plt.text(-3.7,3,r'$This is the some text. mu sigma_i alpha_t$',
        fontdict={'size':16,'color':'r'})
    
    plt.show()

    所产生的图片是:

    tick能见度

    当我们生成图片太多的时候,往往会出现图片的内容较多,相互掩盖的情况。我们可以通过设置相关内容的透明度来使图片更加容易观察,也即是通过本节中的bbox参数设置来调节图像信息。

    参考之前的例子,我们可以绘制出图片的基本信息:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x=np.linspace(-3,3,50)
    y=0.1*x
    
    plt.figure()
    plt.plot(x,y,linewidth=10)
    plt.ylim(-2,2)
    
    ax=plt.gca()
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data',0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data',0))

    然后我们对遮挡的图像调节相关透明度,在本例中设置x轴和y轴的刻度数字来进行透明度设置

    for label in ax.get_xticklabels() + ax.get_yticklabels():
        label.set_fontsize(12)
        label.set_bbox(dict(facecolor='white',edgecolor='None',alpha=0.7))

    其中,label.set_fontsize(12)用来重新调整字体大小,set_bbox设置目的内容中关于透明度参数,facecolor调节box前景色,edgecolor设置边框,在本处我们将边框设置成无,alpha用来设置透明度。

    在这一阶段,其全部源码为:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x=np.linspace(-3,3,50)
    y=0.1*x
    
    plt.figure()
    plt.plot(x,y,linewidth=10)
    plt.ylim(-2,2)
    
    ax=plt.gca()
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data',0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data',0))
    
    
    for label in ax.get_xticklabels() + ax.get_yticklabels():
        label.set_fontsize(12)
        label.set_bbox(dict(facecolor='white',edgecolor='None',alpha=0.7))
    
    plt.show()

    所绘出来的图片为:

  • 相关阅读:
    原来这样就可以开发出一个百万量级的Android相机
    微信读书这样排版,看过的人都很难忘!
    AI小白快上车!这是发往高薪职位的车!
    短视频APP是如何开启你的美好生活的?
    自从我这样撸代码以后,公司网页的浏览量提高了107%!
    如果想成为一名顶尖的前端,这份书单你一定要收藏!
    老板今天问我为什么公司的数据库这么烂,我是这样回答的......
    MapReduce Notes
    HDFS Architecture Notes
    BloomFilter
  • 原文地址:https://www.cnblogs.com/huanggen/p/7530143.html
Copyright © 2011-2022 走看看