zoukankan      html  css  js  c++  java
  • imshow详解热图知识

    原文:https://blog.csdn.net/du_shuang/article/details/84111250

    热图(heatmap)是数据分析的常用方法,通过色差、亮度来展示数据的差异、易于理解。Python在Matplotlib库中,调用imshow()函数实现热图绘制。
    参考资料:http://matplotlib.org/users/image_tutorial.html
    源码介绍如下图所示:


    imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, hold=None, data=None, **kwargs)

    其中,X变量存储图像,可以是浮点型数组、unit8数组以及PIL图像,如果其为数组,则需满足一下形状:
        (1) M*N      此时数组必须为浮点型,其中值为该坐标的灰度;
        (2) M*N*3  RGB(浮点型或者unit8类型)
        (3) M*N*4  RGBA(浮点型或者unit8类型)

    下面这段代码是一个简单的实例:

    # coding=utf-8
     
    from matplotlib import pyplot as plt
    
    X = [[1,2],[3,4],[5,6]]
     
    plt.imshow(X)
     
    plt.show()

    输出如下图所示:


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

    #coding=utf-8
     
    from matplotlib import pyplot as plt
     
    X = [[1,2],[3,4],[5,6]]
     
    plt.imshow(X)
     
    plt.colorbar()
     
    plt.show()

    运行结果如下图所示,其中左上角颜色为蓝色,对应值为1;右下角颜色为深红色,对应值为6。它是按照矩阵X进行颜色分布的。
    [1, 2]    [深蓝, 浅蓝]
    [3, 4]    [淡绿, 黄色]
    [5, 6]    [橙红, 深红]
    plt.colorbar(cax=None,ax=None,shrink=0.5)可设置Bar为一半长度。


    Colormap:参数cmap用于设置热图的Colormap。(参考百度百科)
    Colormap是MATLAB里面用来设定和获取当前色图的函数,可以设置如下色图:
        hot 从黑平滑过度到红、橙色和黄色的背景色,然后到白色。
        cool 包含青绿色和品红色的阴影色。从青绿色平滑变化到品红色。
        gray 返回线性灰度色图。
        bone 具有较高的蓝色成分的灰度色图。该色图用于对灰度图添加电子的视图。
        white 全白的单色色图。 
        spring 包含品红和黄的阴影颜色。
        summer 包含绿和黄的阴影颜色。
        autumn 从红色平滑变化到橙色,然后到黄色。 
        winter 包含蓝和绿的阴影色。

    下面这段代码是显示原图、灰度(gray)、和春夏秋冬的示例。

    #coding=utf-8
     
    from matplotlib import pyplot as plt
    X = [[1,2],[3,4]]
    fig = plt.figure()
    ax = fig.add_subplot(231)
    ax.imshow(X)
    ax = fig.add_subplot(232)
    ax.imshow(X, cmap=plt.cm.gray) #灰度
    ax = fig.add_subplot(233)
    im = ax.imshow(X, cmap=plt.cm.spring) #
    plt.colorbar(im)
    ax = fig.add_subplot(234)
    im = ax.imshow(X, cmap=plt.cm.summer)
    plt.colorbar(im, cax=None, ax=None, shrink=0.5) #长度为半
    ax = fig.add_subplot(235)
    im = ax.imshow(X, cmap=plt.cm.autumn)
    plt.colorbar(im, shrink=0.5, ticks=[-1,0,1])
    ax = fig.add_subplot(236) 
    im = ax.imshow(X, cmap=plt.cm.winter)
    plt.colorbar(im, shrink=0.5)
     
    plt.show()

    运行结果如下图所示:


    通常图片都是由RGB组成,一块一块的,详见我的数字图像处理系列博客,这里想把某块显示成一种颜色,则需要调用interpolation='nearest'参数即可,代码如下:

    #coding=utf-8
     
    from matplotlib import pyplot as plt
     
    X = [[0, 0.25], [0.5, 0.75]]
     
    fig = plt.figure()
     
    ax = fig.add_subplot(121)
     
    im = ax.imshow(X, cmap=plt.get_cmap('hot'))
     
    plt.colorbar(im, shrink=0.5)
    ax = fig.add_subplot(122)
     
    im = ax.imshow(X, cmap=plt.get_cmap('hot'), interpolation='nearest',
     
    vmin=0, vmax=1)
     
    plt.colorbar(im, shrink=0.2)
    plt.show()
     

    运行结果如下图所示:



    推荐文章:matplotlib imshow - default colour normalisation
    默认情况下,imshow将数据标准化为最小和最大值。 您可以使用vmin和vmax参数或norm参数来控制(如果您想要非线性缩放)。

    百度经验提供一段代码,也不错,推荐大家学习。
    注意:相当于在A~J和a~j的图像矩阵中,产生10*10的随机数,对矩阵进行颜色填充;只是在填充过程中,选择随机数的最大值和最小值进行标准化处理。

    # coding=utf-8
     
    import numpy as np
     
    from matplotlib import pyplot as plt
     
    from matplotlib import cm
     
    from matplotlib import axes
     
    def draw_heatmap(data,xlabels,ylabels):
     
    #cmap=cm.Blues
     
    cmap=cm.get_cmap('rainbow',1000)
     
    figure=plt.figure(facecolor='w')
     
    ax=figure.add_subplot(1,1,1,position=[0.1,0.15,0.8,0.8])
     
    ax.set_yticks(range(len(ylabels)))
     
    ax.set_yticklabels(ylabels)
     
    ax.set_xticks(range(len(xlabels)))
     
    ax.set_xticklabels(xlabels)
     
    vmax=data[0][0]
     
    vmin=data[0][0]
     
    for i in data:
     
    for j in i:
     
    if j>vmax:
     
    vmax=j
     
    if j<vmin:
    vmin=j
    map=ax.imshow(data,interpolation='nearest',cmap=cmap,aspect='auto',vmin=vmin,vmax=vmax)
    cb=plt.colorbar(mappable=map,cax=None,ax=None,shrink=0.5)
    plt.show()
    
    a=np.random.rand(10,10)
     
    print a
     
    xlabels=['A','B','C','D','E','F','G','H','I','J']
     
    ylabels=['a','b','c','d','e','f','g','h','i','j']
     
    draw_heatmap(a,xlabels,ylabels)

    运行结果如下图所示:



    最后希望这篇文章对你有所帮助,该篇文章的重点知识不是画图,而是后续的研究:
        1.如何通过热图来描绘人类动力学兴趣转换点;
        2.图像处理感兴趣的同学,会通过imshow()处理相关知识;
        3.用热图颜色表示差异,体现矩阵数据的关注点。

    同时推荐大家阅读电子科技大学,赵志丹老师的博士论文《人类行为时空特性的分析建模及动力学研究》,下一篇文章我将简单讲述人类时空分析及结合Python绘图简单介绍。因为最近研究这方面知识,希望对你有所帮助,如果文章存在错误或不足之处,还请海涵。
    真的好忙啊,都没时间做很多自己喜欢的事情,写文也是,但每当想起你,我这张丑脸上总会泛起微笑。加油,秀璋。娜娜,晚安!

  • 相关阅读:
    如何选择机器学习算法 转
    机器学习经典算法详解及Python实现--基于SMO的SVM分类器
    机器学习(Machine Learning)&深度学习(Deep Learning)资料
    计算智能在设备状态维护中的应用
    LaTeX 在编译时出现 File ended while scanning use of @writefile错误
    LaTeX 中插入图片使其紧跟插入的文字之后
    LaTeX 制作表格
    LaTeX 中换段落
    LaTeX 中使用三级标题
    使用 WinEdt 来写中文文章or 建模论文
  • 原文地址:https://www.cnblogs.com/Ph-one/p/12089984.html
Copyright © 2011-2022 走看看