python机器学习——Matplotlib

图片灰度处理
  • 下面代码导入的模块
    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    from mpl_toolkits.mplot3d.axes3d import  Axes3D
    
  • 图片灰度处理的三种方法
    # 图片灰度处理三种方法
    im_data = plt.imread('fj.jpg')
    print(im_data.shape)
    plt.imshow(im_data)
    plt.show()
    # 方法一 使用最大值法
    im_data_1 = im_data.max(axis=2)
    print(im_data_1.shape)
    plt.imshow(im_data_1)
    plt.show()
    # 方法二 求平均值
    im_data_2 = im_data.mean(axis=-1)
    print(im_data_2.shape)
    plt.imshow(im_data_2)
    plt.show()
    # 方法三 加权平均法
    # 红绿蓝权重
    arr = np.array([0.299,0.587,0.114])
    # 矩阵乘法
    im_data_3 = np.dot(im_data,arr)
    print(im_data_3.shape)
    plt.imshow(im_data_3)
    plt.show()
    
绘制图
  • 只含单一曲线图
    nd = np.linspace(0,10,10)
    plt.plot(nd,nd**2)
    plt.show()
    
  • 在一个图中绘制多条曲线
    nd = np.arange(0,10,1)
    plt.plot(nd,nd*2)
    plt.plot(nd,nd/2)
    plt.plot(nd,nd**3)
    # 也可以将多条曲线放到一个plot中
    # plt.plot(nd,nd*2,nd,nd/2,nd,nd**3)
    plt.show()
    
网格线
  • 绘制正弦余弦
    nd = np.arange(-np.pi,np.pi,0.05)
    plt.plot(nd,np.sin(nd),nd,np.cos(nd))
    # 为图添加网格线
    plt.grid(True)
    plt.show()
    
    设置grid参数(参数与plot函数相同),使用plt面向对象的方法,创建多个子图显示不同的网格

    lw代表linewidth,线的粗细
    alpha表示线的明暗程度
    color代表颜色

    #设置图片间隔大小
    plt.figure(figsize=(12,9))
    # 创建一行  有三列  第一个视图
    nd = np.arange(-np.pi,np.pi,0.05)
    axes = plt.subplot(1,3,1)
    axes.grid(color='red',linestyle='--',linewidth=2)
    axes.plot(nd,np.sin(nd))
    # 创建一行  有三列  第二个视图
    nd2 = np.arange(-20,20,0.05)
    axes2 = plt.subplot(1,3,2)
    axes2.grid(color='gray',linestyle='-.',linewidth=2)
    axes2.plot(nd2,np.cos(nd2))
    # 创建一行  有三列  第三个视图
    nd3 = np.arange(-10,10,0.05)
    axes3 = plt.subplot(1,3,3)
    axes3.grid(color='blue',linestyle='--',linewidth=2)
    axes3.plot(nd3,np.sin(nd3))
    plt.show()
    
  • 坐标轴界限
    axis方法:如果axis方法没有任何参数,则返回当前坐标轴的上下限axis(xmin =,ymax =)
    nd = np.random.randn(10)
    plt.plot(nd)
    # 自定义设置xy轴的上下限
    plt.axis([-5,15,-5,10])
    plt.show()
    
    xlim方法和ylim方法
    除了plt.axis方法,还可以通过xlim,ylim方法设置坐标范围
    nd = np.arange(0,10,1)
    plt.plot(nd)
    plt.xlim(-2,12)
    plt.ylim(2,10)
    plt.show()
    
  • 坐标轴标签
    xlabel方法和ylabel方法
    nd = np.arange(0,10,1)
    nd2 = nd**2+5
    plt.plot(nd,nd2)
    plt.xlabel("X",size=20)
    plt.ylabel("f(x) = nd**2+5",rotation=45)
    plt.show()
    
  • 标题
    title方法
    nd = np.linspace(-np.pi,np.pi,100)
    plt.plot(nd,np.sin(nd))
    plt.title("f(x) = sin(x)")
    plt.show()
    
图例
  • legend方法
    两种传参方法:

    • 在plot函数中增加label参数
    • 在legend方法中传入字符串列表
    nd = np.arange(0,10,1)
    plt.plot(nd,nd,nd,nd*2,nd,nd/2)
    # 参数传递需要加中括号
    # loc = (0.5,1) 相对值,相对图片的宽高,一个图片的宽度单位
    plt.legend(['normal','fast','slow'],loc=0)
    plt.show()
    
    nd = np.arange(0,10,1)
    plt.plot(nd,nd,label='normal')
    # 如果不想label参数再图例中进行显示,则将参数设为'_xxx'
    plt.plot(nd,nd*2,label='_fast')
    plt.plot(nd,nd/2,label='slow')
    plt.legend()
    plt.show()
    
  • loc参数

    字符串 数值 字符串 数值
    best 0 center left 6
    upper right 1 center right 7
    upper left 2 lower center 8
    lower left 3 upper center 9
    lower right 4 center 10
    right 5
  • ncol参数
    ncol控制图例中有几列

    nd = np.arange(0,10,1)
    plt.plot(nd,nd,nd,nd*2,nd,nd/2)
    # loc = (0.5,1) 相对值,相对图片的宽高,一个图片的宽度单位
    plt.legend(['normal','fast','slow'],loc=(0.5,1),ncol=2)
    plt.show()
    
  • linestyle,color,marker 修改线条样式

    nd = np.random.randn(100)
    nd2 = np.random.randn(100)
    nd3 = np.random.randn(100)
    plt.plot(nd.cumsum(),color='red',linestyle='--',marker='o')
    plt.plot(nd2.cumsum(),color='yellow',linestyle='-.',marker='>')
    plt.plot(nd3.cumsum(),color='blue',linestyle=':',marker='*')
    plt.legend(['X','Y','Z'])
    plt.show()
    
保存图片

figure.savefig的选项

  • filename:含有文件路径的字符串或者python的文件型对象,图像格式由文件扩展名推断得出,例如,pdf推断出PDF,png推断出PNG(“png”,“pdf”,“svg”,…)
  • dpi:图像分辨率(每英寸点数),默认为100
  • facecolor:图像的背景色,默认为"w"(白色)
    nd = np.random.randn(100)
    nd2 = np.random.randn(100)
    nd3 = np.random.randn(100)
    plt.plot(nd.cumsum(),color='red',linestyle='--',marker='o')
    plt.plot(nd2.cumsum(),color='yellow',linestyle='-.',marker='>')
    plt.plot(nd3.cumsum(),color='blue',linestyle=':',marker='*')
    plt.legend(['X','Y','Z'])
    plt.savefig(fname='pic.jpg',dpi=500,facecolor='w')
    plt.show()
    
设置plot的风格和样式(三种设置方式)
  • 方式一:向方法中传入关键字参数

plot语句中支持除X,Y以外的参数,以字符串形式存在,来控制颜色,线型,点型等要素,语法形式为:plt.plot(X,Y,‘format’,…)

  • 点和线的样式
    颜色:参数color或者c

  • 颜色值的方式
    别名:color = ‘r’
    合法的HTML颜色名:color=‘red’

    颜色 别名 HTML颜色名 颜色 别名 HTML颜色名
    蓝色 b blue 绿色 g green
    红色 r red 黄色 y yellow
    青色 c cyan 黑色 b black
    洋红色 m magenta 白色 w write
  • jpg,png的区别
    格式不同,导致存储数据的时候
    png:归一化的红绿蓝数据
    jpg:0-255

  • HTML 十六进制字符串
    color=“ffffff”

  • 归一化到(0,1]的RGB元组
    color = (0.3,0.4,0.5)

  • 透明度
    alpha参数

    nd = np.arange(0,10,0.1)
    plt.plot(nd,np.sin(nd),'r',alpha=0.5)
    plt.show()
    
  • 背景色
    设置背景色,通过plt.subplot()方法传入facecolor参数,来设置坐标轴的背景色

    nd = np.arange(0,10,0.1)
    axes = plt.subplot(facecolor='green')
    axes.plot(nd,np.sin(nd),'r')
    plt.show()
    
  • 线型
    参数linestyle或者ls

    线条风格 描述 线条风格 描述
    ‘-’ 实线 ‘.’ 虚线
    ‘–’ 破折线 ‘steps’ 阶梯线
    ‘-.’ 点划线 ‘None’/’,’ 什么都不画
  • 线宽
    linewidth或者lw参数

    nd = np.arange(0,10,0.1)
    plt.plot(nd,np.sin(nd),ls='steps',lw=2)
    plt.show()
    
  • 不同宽度的破折线
    dashes参数:设置破折号序列各段的宽度

    nd = np.arange(0,10,0.1)
    # dashes = [] 参数线段长度,间隔,线段的长度
    plt.plot(nd,np.sin(nd),ls='-.',dashes=[2,5,5,2,15,6])
    plt.show()
    
  • 点型
    marker参数

    标记 描述 标记 描述
    ‘1’ 一脚朝下的三脚架 ‘3’ 一脚朝左的三脚架
    ‘2’ 一脚朝上的三脚架 ‘4’ 一脚朝右的三脚架
    ‘s’ 正方形 ‘p’ 五边形
    ‘h’ 六边形1 ‘H’ 六边形2
    ‘8’ 八边形 ‘.’
    ‘x’ X ‘*’ 星号
    ‘+’ 加号 ‘,’ 像素
    ‘o’ 圈圈 ‘D’ 菱形
    ‘d’ 小菱形 ‘None’ 什么都没有
    ‘_’ 水平线 “/” 水平线
    ‘v’ 一脚朝下的三角形 ‘<’ 一脚朝左的三角形
    ‘^’ 一脚朝上的三角形 ‘>’ 一脚朝右的三角形
    nd = np.arange(0,10,0.1)
    plt.plot(nd,np.sin(nd),'r',ls='--',marker='3',markersize=10)
    plt.show()
    
  • 多参数连用
    颜色,点型,线型

    nd = np.arange(0,10,0.1)
    plt.plot(nd,np.sin(nd),'r--o')
    plt.show()
    
  • 更多点和线的设置

    参数 描述 参数 描述
    color或者c 线的颜色 linestyle或者ls 线型
    linewidth或者lw 线宽 marker 点型
    markeredgecolor 点边沿的颜色 markeredgewidth 点边缘的宽度
    markerfacecolor 点内部的颜色 markersize 点的大小
    nd = np.arange(0,10,1)
    plt.plot(nd,'r--',marker='o',markersize=10,markeredgecolor='green',markeredgewidth=5,markerfacecolor='purple')
    plt.show()
    
  • 多个曲线同一设置
    属性名声明
    plt.plot(x1,y1,x2,y2,fmt,…)

    nd = np.arange(0,10,1)
    # 如果设置属性的时候,不声明属性名称,那么这个属性就会给距离最近的曲线设置属性
    plt.plot(nd,nd*2,nd,np.sin(nd)*5,ls ='--',lw=3,c='r')
    plt.show()
    
  • 多个曲线不同设置
    多个都进行设置时,无需声明属性 plt.plot(x1,y1,fmt1,x2,y2,fmt2,…)

    nd = np.arange(0,10,1)
    plt.plot(nd,nd*2,'r--<',nd,np.sin(nd)*5,'g-.>')
    plt.show()
    
  • 方式二 :对实例使用一序列的set方法

    nd = np.arange(0,10,0.1)
    line, = plt.plot(nd,np.sin(nd))
    line2, = plt.plot(nd,np.cos(nd))
    line3, = plt.plot(nd,nd*2)
    line.set_color('r')
    line2.set_color('y')
    line3.set_color('g')
    line.set_linestyle('--')
    line2.set_linestyle('-.')
    line3.set_linestyle('steps')
    plt.show()
    
  • 方式三:使用setp()方法

    nd = np.arange(0,10,0.1)
    line, = plt.plot(nd,np.sin(nd))
    plt.setp(line,linestyle='--')
    plt.show()
    
  • X,Y轴坐标刻度

    nd = np.random.randn(100)
    plt.plot(nd.cumsum())
    plt.xticks(np.linspace(0,100,5),list('ABCDE'),rotation=60)
    plt.yticks(np.linspace(-10,20,3),['min',0,'max'],fontsize=20)
    plt.show()
    
2D图形绘制
  • 直方图

    nd = np.random.randint(0,10,10)
    plt.hist(nd)
    plt.show()
    
  • 条形图

    ndx = np.linspace(0,5,5)
    ndy = np.random.randint(0,20,size=5)
    plt.bar(ndx,ndy)
    # plt.barh(ndx,ndy)
    plt.show()
    
  • 饼图
    pie()饼图适合展示各部分占总体的比例,条形图适合比较各部分的大小

    参数 说明 参数 说明
    labels 设置每一块的标签 labeldistance 设置标签距离圆心的距离
    autopct 设置比例值的显示格式(%1.1f%%) pctdistance 设置比例值文字距离圆心的距离
    explode 设置每一块顶点距圆形的长度 colors 设置每一块的颜色
    shadow 为布尔值 startangle 旋转角度

    普通占满饼图

    nd = np.array([0.7,0.1,0.2])
    # plt.figure(figsize=(4,4))
    plt.pie(nd,labels=['dog','cat','dark'],autopct='%1.2f%%',labeldistance=0.8,pctdistance=0.5,explode=(0,0.2,0),colors=('purple','green','blue'),shadow=True,startangle=60)
    plt.axis("equal")
    plt.show()
    
  • 散点图
    散点图需要两个参数x,y,但此时x不是表示x轴的刻度,而是每个点的横坐标

    x = np.random.randn(1000)
    y = np.random.randn(1000)
    r_color = np.random.random(3000).reshape(1000,3)
    r_size = np.random.randint(0,20,1000)
    plt.scatter(x,y,color=r_color,s = r_size,marker='d')
    plt.show()
    
  • 图形内的文字,注释,箭头
    控制文字属性的方法

    python函数 API方法 描述
    text() mpl.axes.Axes.text() 在axes对象的任意位置添加文字
    xlabel() mpl.axes.Axes.set_xlabel() 为x轴添加标签
    ylabel() mpl.axes.Axes.set_ylabel() 为y轴添加标签
    title() mpl.axes.Axes.set_title() 为axes对象添加标题
    legend() mpl.axes.Axes.legend() 为axes对象添加图例
    figtext() mpl.figure.Figure.figtext() 在figure对象的任意位置添加文字
    suptitle() mpl.figure.Figure.suptitle() 在figure对象的任意位置添加标题
    annotate() mpl.axes.Axes.annotate() 为axes对象添加注释(箭头可选)

    所有的方法会返回一个matplotlib.text.Text对象

  • 图形内的文字

    x = np.arange(0,2*np.pi,0.01)
    plt.plot(np.sin(x))
    # x轴坐标,y轴坐标,文字
    plt.text(0,0,'sin(0) = 0')
    # 使用figtext的时候,x,y代表相对值,图片的宽高
    # plt.figtext(1,200,'sin(0) = 0')
    plt.show()
    
  • 注释

    参数 说明
    annotate() xy参数设置箭头指示的位置,xytext参数设置注释文字的位置
    arrowprops 参数以字典的形式设置箭头的样式
    width 参数设置箭头长方形部分的宽度,headlength擦书设置箭头端的长度
    headwidth 参数设置箭头尖端底部的宽度,shrink参数设置箭头顶点,尾部与指示点,注释文字的距离
    x = np.random.randint(0,10,size=10)
    x[5] = 30
    plt.plot(x)
    plt.ylim([-2,35])
    plt.annotate('the text of zhe annotation',xy=(5,30),xytext=(7,31),arrowprops={'width':10,'headwidth':20,'headlength':10,'shrink':0.1})
    #plt.annotate('the text of zhe annotation',xy=(5,30),xytext=(7,31),arrowprops={'arrowstyle':'->'})
    plt.show()
    
3D图形绘制
  • 曲面图
    x = np.arange(0,8,0.1)
    y = np.arange(0,8,0.1)
    # 生成网格点
    X,Y = np.meshgrid(x,y)
    def mk_Z(X,Y):
        return 3+0.5*np.sin(X)*np.cos(Y)-np.cos(2-X)
    Z = mk_Z(X,Y)
    axes = plt.subplot(121,projection='3d')
    axes.plot_surface(X,Y,Z,rstride=10,cstride=10)
    axes2 = plt.subplot(122,projection='3d')
    s_axes = axes2.plot_surface(X,Y,Z,rstride=10,cstride=10,cmap='rainbow')
    plt.colorbar(s_axes,shrink=0.5)
    axes2.set_xlabel('X')
    axes2.set_ylabel('Y')
    axes2.set_zlabel('Z')
    plt.show()
    
  • 玫瑰图/极坐标图
    def show_rose(values,title):
        # 玫瑰图的花瓣个数8,45度
        n = 8
        angle = np.arange(0,np.pi*2,2*np.pi/n)
        # 绘制的数据values
        radius = np.array(values)
        # axis 轴(x,y)
        # axes 整个画面
        # polar 为true时为玫瑰图,为false时为条形图
        plt.axes([0,0,1,1],polar= True)
        color = np.random.random(size=24).reshape((8,3))
        plt.bar(values,radius,color=color)
        plt.title(title)
        plt.show()
    v = [1,2,3,4,5,6,7,8]
    show_rose(v,'test')
    

你可能感兴趣的:(Python,matplotlib,图片绘制,图片处理)