zoukankan      html  css  js  c++  java
  • 利用matplotlib的plot函数实现图像绘制

      模式识别的一个实验,要求画出贝叶斯决策的图。这里我是利用python中的matplotlib库实现的图线的拟合。主要对于matplotlib的使用可以参照博客:webary

      如果要绘制三维图像可以参考博客:python绘制三维图

    具体实现:

    接下来,就是对具体数据进行绘图了。比如我们要绘制一条y=x^2的曲线,可这样写代码:

    x = range(10)  # 横轴的数据
    y = [i*i for i in x]  # 纵轴的数据
    pl.plot(x, y)  # 调用pylab的plot函数绘制曲线
    pl.show()  # 显示绘制出的图

    可以看到,要显示一个图非常简单,只要有了两个list作为输入数据,先后调用plot和show函数就可以了。一定要记得只有调用了show之后才会显示出来!只有plot是不行的!在实际运用中,可能这样一条简单粗暴的线可能并不是我们想要的最好的结果,比如,想要在图形上显示原始数据点,很简单,只要在plot函数中加上一个参数即可: pl.plot(x, y,'ob-') # 显示数据点,并用蓝色(blue)实现绘制该图形 

    这个参数用法比较灵活,可以从下面的值中组合选择:

    颜色(color 简写为 c):
    蓝色: 'b' (blue)
    绿色: 'g' (green)
    红色: 'r' (red)
    蓝绿色(墨绿色): 'c' (cyan)
    红紫色(洋红): 'm' (magenta)
    黄色: 'y' (yellow)
    黑色: 'k' (black)
    白色: 'w' (white)
    
    线型(linestyle 简写为 ls):
    实线: '-'
    虚线: '--'
    虚点线: '-.'
    点线: ':'
    点: '.' 
    
    点型(标记marker):
    像素: ','
    圆形: 'o'
    上三角: '^'
    下三角: 'v'
    左三角: '<'
    右三角: '>'
    方形: 's'
    加号: '+' 
    叉形: 'x'
    棱形: 'D'
    细棱形: 'd'
    三脚架朝下: '1'(像'')
    三脚架朝上: '2'
    三脚架朝左: '3'
    三脚架朝右: '4'
    六角形: 'h'
    旋转六角形: 'H'
    五角形: 'p'
    垂直线: '|'
    水平线: '_'

    线是调好了,可是还想加上横纵坐标的说明呢?也很简单,在调用show函数之前添加如下代码:

    pl.xlabel(u"我是横轴")
    pl.ylabel(u"我是纵轴")

    这里一定要记住,传递的字符串一定要是Unicode编码,如果是直接传入字符串,形式如 u'这里是要写的字符串' 即可。

    现在就直观多了吧,终于像一个正常的图了,不过,还想再在图里加个图例该咋办?也不难,继续给plot传参数:

    pl.plot(x, y, 'ob-', label=u'y=x^2曲线图')  # 加上label参数添加图例
    pl.legend()  # 让图例生效

    oh,看到图像上面光秃秃的,就好想给它加个标题: pl.title(u'图像标题') # 字符串也需要是unicode编码 有时候,我们的数据可能分布并没有这么集中,比如我们想要对项目中的某些数据进行绘图观察时发现,大量数据聚集在0附近,而少量很大的数据会导致图像显示效果很不好,比如:  

    x = range(10)+[100]
    y = [i*i for i in x]
    pl.plot(x, y, 'ob-', label=u'y=x^2曲线图')

    这时,我们想要限制需要显示的坐标范围:

    pl.xlim(-1, 11)  # 限定横轴的范围
    pl.ylim(-1, 110)  # 限定纵轴的范围

    这里是我实验的实现部分:

    # -*- 环境:python 3 -*-
    # -*- 代码于https://www.cnblogs.com/doggod/p/9917638.html -*-
    import cmath
    lis = [-3.9847,-3.5549,-1.2401,-0.9780,-0.7932,-2.8531,-2.7605,-3.7287,-3.5414,-2.2692,-3.4549,-3.0752,-3.9934,2.8792,-0.9780,0.7932,1.1882,3.0682,-1.5799,-1.4885,-0.7431,-0.4221,-1.1186,4.2532]
    pw1=0.9;pw2=0.1;e1=-2.0;a1=0.5;e2=2.0;a2=2.0    #定义所给的常数
    def func(x,a,b):    #求正态分布的函数
        return ( 1.0/(cmath.sqrt(2.0*(cmath.pi.real)).real)*b*(cmath.exp(-1.0*(x-a)*(x-a)/2.0/b/b).real));
    point1 = [];pot1 = []   #为后面作图所画点集的list/正常点
    point2 = [];pot2 = []   #为后面作图所画点集的list/异常点
    for t in lis:   #遍历所给细胞,判断所给的细胞是否是异常细胞
        p1 = (pw1 * func(t, e1, a1)) / (pw1 * func(t, e1, a1) + pw2 * func(t, e2, a2))
        p2 = (pw2 * func(t, e2, a2)) / (pw1 * func(t, e1, a1) + pw2 * func(t, e2, a2))
        if(p1>=p2):
            print(0,' ',end='')
            point1.append(t)
            pot1.append(0);
        else:
            print(1,' ',end='')
            point2.append(t)
            pot2.append(0);
    
    import matplotlib.pyplot as plt     #引入matplotlib与numpy - python画图工具
    import numpy as np
    plt.figure('拟合图像')  #定义名字
    x1=[];y1=[]     #存储后面linspace函数所产生点的list为拟合图像做准备
    x2=[];y2=[]
    a=np.linspace(-5,8,100)     #产生均匀点
    for i in a:
        x1.append(i)
        y1.append((pw1 * func(i, e1, a1)) / (pw1 * func(i, e1, a1) + pw2 * func(i, e2, a2)))    #计算所给i的后验概率
        x2.append(i)
        y2.append((pw2 * func(i, e2, a2)) / (pw1 * func(i, e1, a1) + pw2 * func(i, e2, a2)))
    
    plt.plot(x1,y1,label= u'normal cell' )  #画出正常点的线
    plt.plot(x2,y2,label= u'abnormal cell' )    #画出异常点的线
    plt.xlabel(u"Cell attribute value")     #为x轴取名
    plt.ylabel(u"Post continuation probability")    #为y轴取名
    
    plt.plot(point1,pot1,'gp')  #画出点集
    plt.plot(point2,pot2,'mx')
    plt.legend()    #显示图例
    plt.show()

    实现结果如图所示:

  • 相关阅读:
    oc中 中文到拼音的转换
    ios 添加全屏返回手势
    自我总结- CGAffineTransform
    解决pod search出来的库不是最新
    四舍五入的函数,保留小数点后几位数不四舍五入
    iOS 键盘变中文
    LanguageImage尺寸
    打包上传64位支持的解决办法
    第1年11月2日 ssh分发秘钥时出现错误“Permission denied (publickey,gssapi-keyex,gssapi-with-mic)” yarn
    第1年11月1日 uniapp原生
  • 原文地址:https://www.cnblogs.com/doggod/p/9917638.html
Copyright © 2011-2022 走看看