• Python3.0科学计算学习之绘图(二)


    (1) np.mashgrid()函数:-----生成网络点坐标矩阵,可以是二维网络矩阵,也可以是三维网络矩阵。其中,每个交叉点就是网络点,描述这些网络点的矩阵就是坐标矩阵(横坐标矩阵X中的每个元素与纵坐标矩阵Y中对应位置元素,共同构成一个点的完整坐标)。

    背景示例:网络点与坐标矩阵的解释如下:

    import numpy as np

    import matplotlib.pyplot as plt

    x=np.array([[0,1,2],[0,1,2]])        #最简单的方法是,可以把横纵坐标矩阵X,Y写出来,生成坐标点

    y=np.array([[0,0,0],[1,1,1]])

    plt.plot(x,y,color='red',marker='.',markersize=10,linestyle='-.')      #点的形状为原点,点设置大一些,线性为电划线。

    plt.grid(True)

    plt.show()   

    注意:按照矩阵给坐标点信息,matplotlib会把横坐标矩阵中,每一列的点当做同一条线。正如上例中把plotlinestyle=’ ‘改为linestyle=’-.’就会发现A-D,B-E,C-F是连接的。

                                      

    对于很多网络点的情况,可用如下meshgrid()函数方法:

       因注意到坐标矩阵其中有大量的重复---X的每一行都一样,Y的每一列都一样。故基于此规律性,numpy提供的np.meshgrid()函数可以快速生成坐标矩阵X,Y

    x=np.linspace(-0.5,2.,10)    

    y=np.linspace(-1.5,4.,10)

    X,Y=np.meshgrid(x,y)     #输入的x,y是网络点的横纵坐标列向量(非矩阵),输出的XY就是坐标矩阵。

    plt.plot(X,Y,color='limegreen',marker='.',linestyle='')

    plt.grid(True)

    plt.show()

                       

    (2) Python可视化库matplotlib.pyplotcontour()contourf()函数

    区别contour()counterf() 函数功能相同,都是画三维等高线图的,不同点在于contourf会根据不同的水平值用不同的颜色来填充绘图(即会对等高线间的区域进行填充)。

    contour()counterf() 都是绘制三维图,其中前两个参数xy为两个等长一维数组,第三个参数z为二维数组(表示平面点xiyi映射的函数值)。

    matplotlib等高线的绘制步骤:

    等高线是三维图像在二维空间的投影

    首先准备三维函数及待投影平面的网格坐标。

    import numpy as np

    import matplotlib.pyplot as plt

    def height(x,y):

        return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)

    x=np.linspace(-3,3,300)

    y=np.linspace(-3,3,300)

    X,Y=np.meshgrid(x,y)

    l 绘制等高线

    C=plt.contour(X,Y,height(X,Y),10,colors='black')   # 10代表等高线的密集程度。如果是0,则图像被一分为二

    plt.contourf(X,Y,height(X,Y),10,alpha=0.75,cmap=plt.cm.hot)

    #为等高线填充颜色 10表示按照高度分成10alpha表示透明度 cmap表示渐变标准

    l 添加高度与数字

    plt.clabel(C,inline=True,fontsize=10)     #inline=True表示高度写在等高线上

    plt.xticks(())     

    plt.yticks(())

    #去掉坐标轴刻度

    plt.show()

    #显示图片

    l 最后结果图为:

                                               

    实例:寻找某一函数的最小值

    import numpy as np

    import matplotlib.pyplot as plt

    import scipy.optimize as so

    rosenbrockfunction=lambda x,y: (1-x)**2+100*(y-x**2)**2  #使用lambda关键字所表示的匿名函数来使代码变得更加简洁

    x=np.linspace(-.5,2.,100)

    y=np.linspace(-1.5,4.,100)

    X,Y=np.meshgrid(x,y)

    Z=rosenbrockfunction(X,Y)

    cs=plt.contour(X,Y,Z,np.logspace(0,3.5,7,base=10),cmap='gray')   #以第四个参数给出的值为标准来绘制等高线并用gray颜色绘图   

    #plt.contourf(X,Y,Z,10,alpha=0.75,cmap='gray')

    rosen=lambda x:rosenbrockfunction(x[0],x[1])

    solution,iterates=so.fmin_powell(rosen,x0=np.array([0,-0.7]),retall=True)

    #迭代方法so.fmin_powell利用鲍威尔方法来寻找最小值(由一个给定的起始值x0开始,并且当给出选项retall=True时报告所有的迭代,经过16次迭代后得出x=0,y=0

    x,y=zip(*iterates)

    plt.plot(x,y,'ko')

    plt.plot(x,y,'k:',linewidth=1)

    plt.title('Steps of powells method to compute a minimum')

    plt.clabel(cs)

    #clabel使用该contour创建的一个等值线集对象来注释对应函数值的水平值

    补充:np.logspace()常用于创建等比数列,它也有常用的3个参数,第一个参数表示起始点的指数,第二个参数终止点的指数,第三个参数表示数列的个数;最后,通过base参数可以修改底数

                              

    (4) 图像

    Imshow()函数用于在指定的窗口中显示一幅图像。它负责对图像进行处理,并显示其格式,但是不显示图片,其后跟着plt.show()才能显示出来。

    imshow图像显示函数:imshowf,G) 其中,f是函数,G是显示该图像的灰度级数。

                        Imshow(f,[low,high]) 小于或者等于low的值都显示为黑色,大于或等于high的值都显示为白色

                        Imshow(f,[ ]) [ ] 自动将low设为函数最小值,将high设为函数最大值。

    Colorbar:增加颜色类标的代码是plt.colorbar()

    例如:import numpy as np

    import matplotlib.pyplot as plt

    X=np.array([[1,2],[3,4],[5,6]])

    plt.imshow(X)

    plt.colorbar()

    plt.show()   

    实例:将数组可视化为图像,

    import numpy as np

    import matplotlib.pyplot as plt

    # 下面代码演示了如何通过meshgrid生成复数参数值的矩阵:

    def mandelbrot(h,w,maxit=20):

        X,Y=np.meshgrid(np.linspace(-2,0.8,w),np.linspace(-1.4,1.4,h))

        c=X+Y*1j

        z=c

        exceeds=np.zeros(z.shape,dtype=bool)

        for iteration in range(maxit):

            z=z**2+c

            exceeded=np.abs(z) > 4

            exceeds_now=exceeded & (np.logical_not(exceeds))

            exceeds[exceeds_now] = True

            z[exceeded]=2

        return (exceeds)   

    #命令imshow将矩阵展示为图像,所选的颜色贴图显示了序列出现的白色无界的区域,而其他区域显示为黑色。

    plt.imshow(mandelbrot(400,400),cmap='gray')

    plt.axis('off')    #使用plt.axis('off') 关闭坐标轴

    plt.show()       

    # 使用imshow的无插值的图像

                                           

    注意:imshow命令默认使用插值使图像看起来更好,这在矩阵较小时可以看的很清楚。

    plt.imshow(mandelbrot(400,400),interpolation='nearest',cmap='gray')

    Interpolation代表插值运算,nearest表示最近邻近插值法,只是插值方式中的一种。

    cmap表示绘图时的样式,这里选择的是ocean主题

    #使用最近邻近插值法所得的图像

                                            

  • 相关阅读:
    Linux ln命令
    VSCodeUserSetupx641.67.2
    Where windows subsystem for linux (WSL) File/Directory Location?
    Bash 脚本实例:获取符号链接的目标位置
    叮,GitHub 到账 550 美元「GitHub 热点速览 v.22.26」
    用 40 块搞个游戏机“万能卡”「GitHub 热点速览 v.22.27」
    《HelloGitHub》第 75 期
    termux开启ssh服务
    buildroot使用介绍
    adb常用命令
  • 原文地址:https://www.cnblogs.com/chenzhijuan-324/p/10673635.html
Copyright © 2020-2023  润新知