06-Matplotlib

作者: 郑元吉 | 来源:发表于2018-12-20 17:16 被阅读11次

    一.图片灰度处理

    导包
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    # 读取图片
    jin = plt.imread('jinzhengen.png')
    plt.imshow(jin)
    
    jin.shape
    输出:
    (273, 411, 3)
    
    jinzhengen.png
    3种方法
    # 1, 最大值法
    jin_max = jin.max(axis=-1)
    jin_max.shape
    输出:
    (273, 411)
    
    plt.imshow(jin_max, cmap='gray')
    plt.axis('off')
    
    最大值法灰度.png
    # 作为对比,使用最小值
    jin_min = jin.min(axis=-1)
    plt.imshow(jin_min, cmap='gray')
    
    最小值法灰度.png
    # 2,平均值
    jin_mean = jin.mean(axis=-1)
    plt.imshow(jin_mean,cmap='gray')
    
    平均值法灰度.png
    # 3,加权平均, 根据人眼对颜色敏感程度.
    # [0.299,0.587,0.114]
    jin_weight = np.dot(jin, np.array([0.299,0.587,0.114])) / 3
    plt.imshow(jin_weight, cmap='gray')
    
    加权平均法灰度.png

    二.Matplotlib基础知识

    导包
    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    2.1 Matplotlib中的基本图表包括的元素

    x轴和y轴
    水平和垂直的轴线
    x轴和y轴刻度
    刻度标示坐标轴的分隔,包括最小刻度和最大刻度
    x轴和y轴刻度标签
    表示特定坐标轴的值
    绘图区域
    实际绘图的区域

    2.2 画曲线
    • 一条曲线
    n = np.random.randint(0,10, size=10)
    plt.plot(n)
    
    一条曲线.png
    • 多条曲线
      1、可以使用多个plot函数(推荐),在一个图中绘制多个曲线
    x = np.linspace(-np.pi, np.pi, 100)
    y = np.sin(x)
    z = np.cos(x)
    plt.plot(x, y)
    
    单条曲线.png

    2、也可以在一个plot函数中传入多对X,Y值,在一个图中绘制多个曲线

    plt.plot(x,y, x,z)
    
    双条曲线.png
    2.3 网格线

    使用plt.grid(True)方法为图添加网格线

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

    方法一

    plt.figure(figsize=(3*5, 5))
    
    axes1 = plt.subplot(131) # plt.subplot(1,3,1) 返回一个轴面
    # 要在这个创造出来的轴面中画图
    
    x = np.linspace(-20,20, 1000)
    axes1.plot(x, np.sin(x))
    axes1.grid(True, linewidth=2, axis='both')
    
    axes2 = plt.subplot(1,3,2)
    axes2.plot(x, np.cos(x))
    # alpha是线的透明度.
    axes2.grid(True, color='r', alpha=0.6)
    
    axes3 = plt.subplot(1,3,3)
    axes3.plot(x, x**2)
    # linestyple是线的风格
    axes3.grid(True, color='g', linestyle='--', alpha=0.7)
    
    网格图片.png

    方法二

    # 通过figure对象来创建子图
    figure = plt.figure(figsize=(3*5, 5))
    axes1 = figure.add_subplot(1,3,1)
    x = np.linspace(-20,20, 1000)
    axes1.plot(x, np.sin(x))
    axes1.grid(True, linewidth=2, axis='both')
    
    axes2 = plt.subplot(1,3,2)
    axes2.plot(x, np.cos(x))
    # alpha是线的透明度.
    axes2.grid(True, color='r', alpha=0.6)
    
    
    axes3 = plt.subplot(1,3,3)
    axes3.plot(x, x**2)
    # linestyple是线的风格
    axes3.grid(True, color='g', linestyle='--', alpha=0.7)
    
    网格图2.png
    2.4 坐标轴界限axis方法设置

    如果axis方法没有任何参数,则返回当前坐标轴的上下限axis(xmin =,ymax = )

    plt.axis('xxx') 'tight'、'off'、'equal'……

    x = np.linspace(-np.pi, np.pi, 100)
    y = np.sin(x)
    plt.plot(x,y)
    # axis什么也不传,返回的是当前图形的坐标轴的界限.
    plt.axis()
    
    axis未传参数图.png
    plt.plot(x,y)
    # 通过axis方法来设置坐标轴的界限
    plt.axis([-np.pi, np.pi, -1,1])
    
    axis设置坐标图.png
    plt.plot(x,y)
    # tight是axis默认的样式,紧致的样式
    # plt.axis('tight')
    # off关闭坐标轴, 经常用在显示图片上.
    # plt.axis('off')
    # 设置equal, 把画布的长宽设置成一样大
    plt.axis('equal') 
    
    axis设置equal图.png

    除了plt.axis方法,还可以通过xlim,ylim方法设置坐标轴范围

    plt.plot(x,y)
    # 单独设置y轴的界限
    # plt.ylim(ymin=-1, ymax=1)
    plt.ylim((-1,1))
    
    # xlim设置x轴界限
    plt.xlim(-np.pi, np.pi)
    
    xlim和ylim设置图.png
    2.5 坐标轴标签

    xlabel方法和ylabel方法

    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    axes = plt.subplot(1,1,1)
    line, = axes.plot(x,y)
    # 设置x轴标签
    # plt.xlabel('这是x轴', fontdict=dict(fontsize=20))
    
    # 使用对象的set_xlabel方法,查看全部参数
    axes.set_xlabel('这是X轴', fontdict=dict(fontsize=20))
    
    X轴标签.png
    axes = plt.subplot(1,1,1)
    line, = axes.plot(x,y)
    # 设置x轴标签
    # plt.xlabel('这是x轴', fontdict=dict(fontsize=20))
    
    # 使用对象的set_xlabel方法,查看全部参数
    ylabel = axes.set_ylabel('这是Y轴', fontdict=dict(fontsize=20), rotation=0, position=(0,1))
    ylabel.set_alpha(0.5)
    ylabel.set_bbox(dict(facecolor='red', alpha=0.5))
    
    Y轴标签.png
    2.6 坐标轴标题

    title方法

    plt.plot(x,y)
    title = plt.title('这是一个正弦', fontdict=dict(fontsize=20), loc='right')
    
    坐标轴标题.png
    2.7 图例legend

    legend方法

    两种传参方法:
    1.【推荐使用】在plot函数中增加label参数
    2.在legend方法中传入字符串列表

    x = np.linspace(0,10, 100)
    y1 = 2*x
    
    # label中的字符串不能用下划线开头, 加了下划线开头的图裂将不会显示.
    plt.plot(x,y1, label='_fast')
    plt.plot(x,x, label='normal')
    plt.plot(x, 0.5*x, label='slow')
    
    # 两种方法设置图例
    # 第一种, 在画图的时候,指定label, 再调用legend方法
    plt.legend()
    
    图例1.png
    # 第二种方法
    # 不需要在创建图形的时候写label
    x = np.linspace(0,10, 100)
    y1 = 2*x
    
    plt.plot(x,y1)
    plt.plot(x,x)
    plt.plot(x, 0.5*x)
    # 通过legend方法传入一个列表,分别表示对不同的图形的说明
    plt.legend(['fast', 'normal', 'slow'])
    
    图例2.png
    • loc参数


      loc.png
    x = np.linspace(0,10, 100)
    y1 = 2*x
    
    plt.plot(x,y1)
    plt.plot(x,x)
    plt.plot(x, 0.5*x)
    # 通过legend方法传入一个列表,分别表示对不同的图形的说明
    plt.legend(['fast', 'normal', 'slow'], loc=5)
    
    loc图.png
    2.8 ncol参数

    ncol控制图例中有几列

    x = np.linspace(0,10, 100)
    y1 = 2*x
    
    plt.plot(x,y1)
    plt.plot(x,x)
    plt.plot(x, 0.5*x)
    # 通过legend方法传入一个列表,分别表示对不同的图形的说明
    plt.legend(['fast', 'normal', 'slow'], loc=(0,1), ncol=3)
    
    nloc图.png
    2.9 linestyle、color、marker

    修改线条样式

    2.10 保存图片

    figure.savefig的选项:
    filename:含有文件路径的字符串或Python的文件型对象。图像格式由文件扩展名推断得出,例如,.pdf推断出PDF,.png推断出PNG (“png”、“pdf”、“svg”、“ps”、“eps”……)
    dpi:图像分辨率(每英寸点数),默认为100
    facecolor:图像的背景色,默认为“w”(白色)

    n1 = np.random.normal(loc=0, scale=2 ,size=100)
    n2 = np.random.normal(loc=10, scale=3, size=100)
    n3 = np.random.normal(loc=20,scale=5, size=100)
    # 点的形状叫做点型, marker
    
    figure = plt.figure(figsize=(12,9))
    plt.plot(n1, label='one', linestyle='-.', marker='d', markersize=10)
    plt.plot(n2, label='two', linestyle='--', marker='o')
    plt.plot(n3, label='three', linestyle=':', marker='*', markersize=20)
    plt.legend()
    figure.savefig('art.jpg', dpi=500, facecolor='r', transparent=True)
    
    保存图片.png

    三.设置plot的风格和样式

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


      颜色.png
    x = np.linspace(-10, 10, 1000)
    plt.plot(x, np.sin(x), c='r')
    
    颜色r.png
    • 透明度
      alpha参数
    x = np.linspace(-10, 10, 1000)
    # 透明度一般0到1就够了.
    plt.plot(x, np.sin(x), c='r', alpha=0.8)
    
    透明度.png
    • 背景色
      设置背景色,通过plt.subplot()方法传入facecolor参数,来设置坐标轴的背景色
    axes = plt.subplot(1,1,1, facecolor='g')
    x = np.linspace(-10, 10, 1000)
    # 透明度一般0到1就够了.
    plt.plot(x, np.sin(x), c='r', alpha=0.8)
    
    背景色.png
    • 线型
      参数linestyle或ls


      线型.png
    x = np.linspace(-1, 1 ,1000)
    y = (1-x**2)**0.5
    plt.plot(x,y, linestyle='steps')
    
    线型设置.png
    • 线宽
      inewidth或lw参数
    x = np.linspace(-1, 1 ,1000)
    y = (1-x**2)**0.5
    plt.plot(x,y, linewidth=2)
    
    线宽.png
    • 点型
      marker参数
    x = np.linspace(-1, 1 ,20)
    y = (1-x**2)**0.5
    plt.figure(figsize=(12,9))
    plt.plot(x,y, linewidth=2, marker='2', markersize=20)
    
    点型.png
    • 多参数连用
    x = np.linspace(0, 5, 10)
    plt.plot(x,3*x,'r-.')
    plt.plot(x, x**2, 'b^:') # blue line with dots
    plt.plot(x, x**3, 'go-.') # green dashed line
    plt.show()
    
    多参数连用.png
    • 更多点和线的设置


    y = np.arange(1, 3, 0.3)
    plt.plot(y, color='blue', 
             linestyle='dashdot', 
             linewidth=4, marker='o',
             markerfacecolor='red', 
             markeredgecolor='black', 
             markeredgewidth=3, 
             markersize=12);
    plt.show()
    
    点线设置图.png
    3.2 X、Y轴坐标刻度
    • xticks()和yticks()方法
    x = [5, 3, 7, 2, 4, 1]
    plt.plot(x);
    plt.xticks(range(len(x)), ['a', 'b', 'c', 'd', 'e', 'f']); # 传入位置和标签参数,以修改坐标轴刻度
    plt.yticks(range(1, 8, 2));
    plt.show()
    
    xticks.png
    • 面向对象方法
    set_xticks、set_yticks、set_xticklabels、set_yticklabels方法
    
    
    fig = plt.figure(figsize=(10, 4))
    ax = fig.add_subplot(111)
    
    x = np.linspace(0, 5, 100)
    
    ax.plot(x, x**2, x, x**3, lw=2)
    
    ax.set_xticks([1, 2, 3, 4, 5])
    ax.set_xticklabels(['a','b','c','d','e'], fontsize=18)
    
    yticks = [0, 50, 100, 150]
    ax.set_yticks(yticks)
    ax.set_yticklabels([y for y in yticks], fontsize=18); # use LaTeX formatted labels
    
    面向对象.png
    • 正弦余弦:LaTex语法,用\pi等表达式在图表上写上希腊字母
    x = np.arange(-np.pi,np.pi,0.01)
    plt.figure(figsize=(12,9))
    plt.plot(x,np.sin(x),x,np.cos(x))
    
    plt.axis([x.min()-1,x.max()+1,-1.2,1.2])
    
    #xticks:参数一刻度,参数二,对应刻度上的值
    plt.xticks(np.arange(-np.pi,np.pi+1,np.pi/2),
               ['$-\delta$','$-\pi$/2','0','$\pi$/2','$\pi$'],size = 20)
    
    plt.yticks([-1,0,1],['min','0','max'],size = 20)
    
    plt.show() 
    
    正弦余弦.png

    四.2D图形

    4.1 直方图
    【直方图的参数只有一个x!!!不像条形图需要传入x,y】
    hist()的参数
    bins
    可以是一个bin数量的整数值,也可以是表示bin的一个序列。默认值为10
    normed
    如果值为True,直方图的值将进行归一化处理,形成概率密度,默认值为False
    color
    指定直方图的颜色。可以是单一颜色值或颜色的序列。如果指定了多个数据集合,颜色序列将会设置为相同的顺序。如果未指定,将会使用一个默认的线条颜色
    orientation
    通过设置orientation为horizontal创建水平直方图。默认值为vertical
    
    
    x = np.random.randint(5,size = 5)
    display(x)
    plt.hist(x,histtype = 'bar'); # 默认绘制10个bin
    plt.show()
    
    • 普通直方图/累计直方图
    n = np.random.randn(10000)
    
    fig,axes = plt.subplots(1,2,figsize = (12,4))
    axes[0].hist(n,bins = 50)#普通直方图
    axes[0].set_title('Default histogram')
    axes[0].set_xlim(min(n),max(n))
    
    axes[1].hist(n,bins = 50,cumulative = True)# 累计直方图
    axes[1].set_title('Cumulative detailed histogram')
    axes[1].set_xlim(min(n),max(n))
    
    直方图.png
    • 正太分布
    u = 100 #数学期望
    s = 15 #方差
    x = np.random.normal(u,s,1000) # 生成正太分布数据
    
    ax = plt.gca() #获取当前图表
    ax.set_xlabel('Value')
    ax.set_ylabel('Frequency') #设置x,y轴标题
    
    ax.set_title("Histogram normal u = 100 s = 15") #设置图表标题
    
    ax.hist(x,bins = 100,color = 'r',orientation='horizontal')
    plt.show()
    
    正态分布.png
    4.2 条形图
    • bar
    # 第一个参数为条形左下角的x轴坐标,第二个参数为条形的高度;
    # width参数设置条形宽度;color参数设置条形颜色;bottom参数设置条形底部的垂直坐标
    plt.bar([1, 2, 3], [3, 2, 5], width=0.5, color='r', bottom=1);
    plt.ylim([0, 7])
    plt.show()
    
    bar图.png
    # 例子:绘制并列条形图
    
    data1 = 10*np.random.rand(5)
    data2 = 10*np.random.rand(5)
    data3 = 10*np.random.rand(5)
    
    locs = np.arange(1, len(data1)+1)
    width = 0.27
    
    plt.bar(locs, data1, width=width);
    plt.bar(locs+width, data2, width=width, color='red');
    plt.bar(locs+2*width, data3, width=width, color='green') ;
    plt.xticks(locs + width*1, locs);
    plt.show()
    
    bar1.png
    • barh
    plt.barh([1, 2, 3], [3, 2, 5],height = 0.27,color = 'cyan');
    plt.show()
    
    barh.png
    4.3 饼图

    pie()
    饼图适合展示各部分占总体的比例,条形图适合比较各部分的大小

    plt.figure(figsize = (4,4)) # 饼图绘制正方形
    x = [45,35,20] #百分比
    labels = ['Cats','Dogs','Fishes'] #每个区域名称
    plt.pie(x,labels = labels)
    plt.show()
    
    饼图1.png
    plt.figure(figsize=(4, 4));
    x = [0.1, 0.2, 0.3] # 当各部分之和小于1时,则不计算各部分占总体的比例,饼的大小是数值和1之比
    labels = ['Cats', 'Dogs', 'Fishes']
    plt.pie(x, labels=labels); # labels参数可以设置各区域标签
    plt.show()
    
    饼图2.png
    # labels参数设置每一块的标签;labeldistance参数设置标签距离圆心的距离(比例值)
    # autopct参数设置比例值的显示格式(%1.1f%%);pctdistance参数设置比例值文字距离圆心的距离
    # explode参数设置每一块顶点距圆形的长度(比例值);colors参数设置每一块的颜色;
    # shadow参数为布尔值,设置是否绘制阴影
    
    plt.figure(figsize=(4, 4));
    x = [4, 9, 21, 55, 30, 18]
    labels = ['Swiss', 'Austria', 'Spain', 'Italy', 'France', 'Benelux']
    explode = [0.2, 0.1, 0, 0, 0.1, 0]
    colors = ['r', 'k', 'b', 'm', 'c', 'g']
    plt.pie(x, 
            labels=labels, 
            labeldistance=1.2,
            explode=explode, 
            colors=colors, 
            autopct='%1.1f%%', 
            pctdistance=0.5, 
            shadow=True);
    plt.show()
    
    饼图3.png
    # 绘制一个正方形的figure and axes
    plt.figure(1, figsize=(4, 4))
    
    # 圆弧按照逆时针绘制
    labels = 'Spring', 'Summer', 'Autumn', 'Winter'
    values = [15, 16, 16, 28]
    explode =[0.1, 0.1, 0.1, 0.1] # 指定分裂序列,每一个元素表示每个圆弧间的偏移量,为半径的百分比
    
    # 绘制饼图
    plt.pie(values,
            explode=explode,
            labels=labels,
            autopct='%1.1f%%', # 格式化绘制圆弧中的标签,标签可以是一个格式化字符串或者一个可调用的对象(函数)
            startangle=90) # 指定圆弧开始绘制的角度,默认从角度0(x轴)开始绘制
    
    plt.title('Rainy days by season');
    
    饼图4.png
    4.4 散点图

    【散点图需要两个参数x,y,但此时x不是表示x轴的刻度,而是每个点的横坐标!】
    scatter()

    # s参数设置散点的大小;c参数设置散点的颜色;marker参数设置散点的形状
    x = np.random.randn(1000)
    y = np.random.randn(1000)
    size = 50*abs(np.random.randn(1000))
    colors = np.random.randint(16777215,size = 1000)
    
    
    li = []
    for color in colors:
        a = hex(color)
        str1 = a[2:]
        l = len(str1)
        for i in range(1,7-l):
            str1 = '0'+str1
        str1 = "#" + str1
        li.append(str1)
    
    plt.scatter(x, y,s = size, c=li, marker='d');
    plt.show()
    
    散点图.png

    五.图形内的文字、注释、箭头

    5.1 文字
    x = np.arange(0, 7, .01)
    y = np.sin(x)
    plt.plot(x, y);
    plt.text(0.1, -0.04, 'sin(0)=0'); # 位置参数是坐标
    plt.show()
    
    文字.png
    5.2 注释
    # 生成3个正态分布数据数据集
    x1 = np.random.normal(30, 3, 100)
    x2 = np.random.normal(20, 2, 100)
    x3 = np.random.normal(10, 3, 100)
    
    # 绘制3个数据集,并为每个plot指定一个字符串标签
    plt.plot(x1, label='plot') # 如果不想在图例中显示标签,可以将标签设置为_nolegend_
    plt.plot(x2, label='2nd plot')
    plt.plot(x3, label='last plot')
    
    # 绘制图例
    plt.legend(bbox_to_anchor=(0, 1.02, 1, 0.102), # 指定边界框起始位置为(0, 1.02),并设置宽度为1,高度为0.102
               ncol=3, # 设置列数为3,默认值为1
               mode="expand", # mode为None或者expand,当为expand时,图例框会扩展至整个坐标轴区域
               borderaxespad=0.) # 指定坐标轴和图例边界之间的间距
    
    # 绘制注解
    plt.annotate("Important value", # 注解文本的内容
                 xy=(55,20), # 箭头终点所在位置
                 xytext=(5, 38), # 注解文本的起始位置,箭头由xytext指向xy坐标位置
                 arrowprops=dict(arrowstyle='->')); # arrowprops字典定义箭头属性,此处用arrowstyle定义箭头风格
    
    注释.png
    5.3 箭头
    箭头.png

    六.3D图

    6.1 导包
    import numpy as np
    import matplotlib.pyplot as plt
    #3d图形必须的
    from mpl_toolkits.mplot3d.axes3d import Axes3D
    %matplotlib inline
    
    6.2 生成数据
    #系数,由X,Y生成Z
    a = 0.7
    b =  np.pi 
    
    #计算Z轴的值
    def mk_Z(X, Y):
        return 2 + a - 2 * np.cos(X) * np.cos(Y) - a * np.cos(b - 2*X)
    
    #生成X,Y,Z
    x = np.linspace(0, 2*np.pi, 100)
    y = np.linspace(0, 2*np.pi, 100)
    X,Y = np.meshgrid(x, y)
    Z = mk_Z(X, Y)
    
    6.3 绘制图形
    fig = plt.figure(figsize=(14,6))
    
    #创建3d的视图,使用属性projection
    ax = fig.add_subplot(1, 2, 1, projection='3d')
    
    ax.plot_surface(X,Y,Z,rstride = 5,cstride = 5)
    
    #创建3d视图,使用colorbar,添加颜色柱
    ax = fig.add_subplot(1, 2, 2, projection='3d')
    p = ax.plot_surface(X, Y, Z,  cmap='rainbow', antialiased=True)
    cb = fig.colorbar(p, shrink=0.5)
    
    3D图.png

    相关文章

      网友评论

        本文标题:06-Matplotlib

        本文链接:https://www.haomeiwen.com/subject/hzackqtx.html