Python实 *** :手把手教你用Matplotlib把数据画出来

Python实 *** :手把手教你用Matplotlib把数据画出来,第1张

作者:迈克尔·贝耶勒(Michael Beyeler)

如需转载请联系华章 科技

如果已安装Anaconda Python版本,就已经安装好了可以使用的 Matplotlib。否则,可能要访问官网并从中获取安装说明:

http://matplotlib.org

正如使用np作为 NumPy 的缩写,我们将使用一些标准的缩写来表示 Matplotlib 的引入:

在本书中,plt接口会被频繁使用。

让我们创建第一个绘图。

假设想要画出正弦函数sin(x)的线性图。得到函数在x坐标轴上0≤x<10内所有点的值。我们将使用 NumPy 中的 linspace 函数来在x坐标轴上创建一个从0到10的线性空间,以及100个采样点:

可以使用 NumPy 中的sin函数得到所有x点的值,并通过调用plt中的plot函数把结果画出来:

你亲自尝试了吗?发生了什么吗?有没有什么东西出现?

实际情况是,取决于你在哪里运行脚本,可能无法看到任何东西。有下面几种可能性:

1. 从.py脚本中绘图

如果从一个脚本中运行 Matplotlib,需要加上下面的这行调用:

在脚本末尾调用这个函数,你的绘图就会出现!

2. 从 IPython shell 中绘图

这实际上是交互式地执行Matplotlib最方便的方式。为了让绘图出现,需要在启动 IPython 后使用所谓的%matplotlib魔法命令。

接下来,无须每次调用plt.show()函数,所有的绘图将会自动出现。

3. 从 Jupyter Notebook 中绘图

如果你是从基于浏览器的 Jupyter Notebook 中看这段代码,需要使用同样的%matplotlib魔法命令。然而,也可以直接在notebook中嵌入图形,这会有两种输出选项:

在本书中,将会使用inline选项:

现在再次尝试一下:

上面的命令会得到下面的绘图输出结果:

如果想要把绘图保存下来留作以后使用,可以直接在 IPython 或者 Jupyter Notebook 使用下面的命令保存:

仅需要确保你使用了支持的文件后缀,比如.jpg、.png、.tif、.svg、.eps或者.pdf。

作为本章最后一个测试,让我们对外部数据集进行可视化,比如scikit-learn中的数字数据集。

为此,需要三个可视化工具:

那么开始引入这些包吧:

第一步是载入实际数据:

如果没记错的话,digits应该有两个不同的数据域:data域包含了真正的图像数据,target域包含了图像的标签。相对于相信我们的记忆,我们还是应该对digits稍加 探索 。输入它的名字,添加一个点号,然后按Tab键:digits.<TAB>,这个 *** 作将向我们展示digits也包含了一些其他的域,比如一个名为images的域。images和data这两个域,似乎简单从形状上就可以区分。

两种情况中,第一维对应的都是数据集中的图像数量。然而,data中所有像素都在一个大的向量中排列,而images保留了各个图像8×8的空间排列。

因此,如果想要绘制出一副单独的图像,使用images将更加合适。首先,使用NumPy的数组切片从数据集中获取一幅图像:

这里是从1797个元素的数组中获取了它的第一行数据,这行数据对应的是8×8=64个像素。下面就可以使用plt中的imshow函数来绘制这幅图像:

上面的命令得到下面的输出:

此外,这里也使用cmap参数指定了一个颜色映射。默认情况下,Matplotlib 使用MATLAB默认的颜色映射jet。然而,在灰度图像的情况下,gray颜色映射更有效。

最后,可以使用plt的subplot函数绘制全部数字的样例。subplot函数与MATLAB中的函数一样,需要指定行数、列数以及当前的子绘图索引(从1开始计算)。我们将使用for 循环在数据集中迭代出前十张图像,每张图像都分配到一个单独的子绘图中。

这会得到下面的输出结果:

关于作者:Michael Beyeler,华盛顿大学神经工程和数据科学专业的博士后,主攻仿生视觉计算模型,用以为盲人植入人工视网膜(仿生眼睛),改善盲人的视觉体验。 他的工作属于神经科学、计算机工程、计算机视觉和机器学习的交叉领域。同时他也是多个开源项目的积极贡献者。

本文摘编自《机器学习:使用OpenCV和Python进行智能图像处理》,经出版方授权发布。

# -*- coding: utf-8 -*-  

#**********************************************************  

import os  

import numpy as np  

import wlab #pip install wlab  

import matplotlib  

import matplotlib.cm as cm  

import matplotlib.pyplot as plt  

from matplotlib.ticker import MultipleLocator  

from scipy.interpolate import griddata  

matplotlib.rcParams['xtick.direction'] = 'out'  

matplotlib.rcParams['ytick.direction'] = 'out'  

#**********************************************************  

FreqPLUS=['F06925','F10650','F23800','F18700','F36500','F89000']  

#  

FindPath='/d3/MWRT/R20130805/'  

#**********************************************************  

fig = plt.figure(figsize=(8,6), dpi=72, facecolor="white")  

axes = plt.subplot(111)  

axes.cla()#清空坐标轴内的所有内容  

#指定图形的字体  

font = {'family' : 'serif',  

        'color'  : 'darkred',  

        'weight' : 'normal',  

        'size'   : 16,  

        }  

#**********************************************************  

# 查找目录总文件名中保护F06925,EMS和txt字符的文件  

for fp in FreqPLUS:  

    FlagStr=[fp,'EMS','txt']  

    FileList=wlab.GetFileList(FindPath,FlagStr)  

    #  

    LST=[]#地表温度  

    EMS=[]#地表发射率  

    TBH=[]#水平极化亮温  

    TBV=[]#垂直极化亮温  

    #  

    findex=0  

    for fn in FileList:  

        findex=findex+1  

        if (os.path.isfile(fn)):  

            print(str(findex)+'-->'+fn)  

            #fn='/d3/MWRT/R20130805/F06925_EMS60.txt'  

            data=wlab.dlmread(fn)  

            EMS=EMS+list(data[:,1])#地表发射率  

            LST=LST+list(data[:,2])#温度  

            TBH=TBH+list(data[:,8])#水平亮温  

            TBV=TBV+list(data[:,9])#垂直亮温  

    #-----------------------------------------------------------  

    #生成格点数据,利用griddata插值  

    grid_x, grid_y = np.mgrid[275:315:1, 0.60:0.95:0.01]  

    grid_z = griddata((LST,EMS), TBH, (grid_x, grid_y), method='cubic')  

    #将横纵坐标都映射到(0,1)的范围内  

    extent=(0,1,0,1)  

     #指定colormap  

    cmap = matplotlib.cm.jet  

    #设定每个图的colormap和colorbar所表示范围是一样的,即归一化  

    norm = matplotlib.colors.Normalize(vmin=160, vmax=300)  

    #显示图形,此处没有使用contourf #>>>ctf=plt.contourf(grid_x,grid_y,grid_z)  

    gci=plt.imshow(grid_z.T, extent=extent, origin='lower',cmap=cmap, norm=norm)  

    #配置一下坐标刻度等  

    ax=plt.gca()  

    ax.set_xticks(np.linspace(0,1,9))  

    ax.set_xticklabels( ('275', '280', '285', '290', '295',  '300',  '305',  '310', '315'))  

    ax.set_yticks(np.linspace(0,1,8))  

    ax.set_yticklabels( ('0.60', '0.65', '0.70', '0.75', '0.80','0.85','0.90','0.95'))  

    #显示colorbar  

    cbar = plt.colorbar(gci)  

    cbar.set_label('$T_B(K)$',fontdict=font)  

    cbar.set_ticks(np.linspace(160,300,8))  

    cbar.set_ticklabels( ('160', '180', '200', '220', '240',  '260',  '280',  '300'))  

    #设置label  

    ax.set_ylabel('Land Surface Emissivity',fontdict=font)  

    ax.set_xlabel('Land Surface Temperature(K)',fontdict=font) #陆地地表温度LST  

    #设置title  

    titleStr='$T_B$ for Freq = '+str(float(fp[1:-1])*0.01)+'GHz'  

    plt.title(titleStr)  

    figname=fp+'.png'  

    plt.savefig(figname)  

    plt.clf()#清除图形  

  

#plt.show()  

print('ALL -> Finished OK')

上面的例子中,每个保存的图,都是用同样的colormap,并且每个图的颜色映射值都是一样的,也就是说第一个图中如果200表示蓝色,那么其他图中的200也表示蓝色。

示例的图形如下:


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/11291077.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存