plt.imshow()

转载于:https://blog.csdn.net/Eastmount/article/details/73392106?locationNum=3&fps=1

版权声明:本文为博主原创文章,转载请注明CSDN博客源地址!共同学习,一起进步~ https://blog.csdn.net/Eastmount/article/details/73392106

前面系列文章讲过数据挖掘的各种知识,最近在研究人类时空动力学分析和幂率定律,发现在人类兴趣转移模型中,可以通过热图(斑图)来进行描述的兴趣转移,如下图所示。下一篇文章将简单普及人类动力学相关知识研究。


这篇文章结合Matplotlib的imshow()函数,讲述热图(斑图)绘制及相关参数基础知识。希望文章对你有所帮助,如果文章中存在错误或不足之处,还请海涵。

前文推荐:
【Python数据挖掘课程】一.安装Python及爬虫入门介绍
【Python数据挖掘课程】二.Kmeans聚类数据分析及Anaconda介绍
【Python数据挖掘课程】三.Kmeans聚类代码实现、作业及优化
【Python数据挖掘课程】四.决策树DTC数据分析及鸢尾数据集分析
【Python数据挖掘课程】五.线性回归知识及预测糖尿病实例
【Python数据挖掘课程】六.Numpy、Pandas和Matplotlib包基础知识
【Python数据挖掘课程】七.PCA降维操作及subplot子图绘制
【Python数据挖掘课程】八.关联规则挖掘及Apriori实现购物推荐
【Python数据挖掘课程】九.回归模型LinearRegression简单分析氧化物数据
【python数据挖掘课程】十.Pandas、Matplotlib、PCA绘图实用代码补充
【python数据挖掘课程】十一.Pandas、Matplotlib结合SQL语句可视化分析
【python数据挖掘课程】十二.Pandas、Matplotlib结合SQL语句对比图分析
【python数据挖掘课程】十三.WordCloud词云配置过程及词频分析
【python数据挖掘课程】十四.Scipy调用curve_fit实现曲线拟合



一. Matplotlib简单回顾

Matplotlib是Python最著名的2D绘图库,该库仿造Matlab提供了一整套相似的绘图函数,用于绘图和绘表,强大的数据可视化工具和做图库,适合交互式绘图,图形美观。
首先,通过一段代码给大家回顾下Matplotlib绘图知识。绘制2*3共6个子图,且图为空的代码如下:


   
   
  1. # coding=utf-8
  2. from matplotlib import pyplot as plt
  3. fig = plt.figure()
  4. ax1 = fig.add_subplot( 231)
  5. ax2 = fig.add_subplot( 232)
  6. ax3 = fig.add_subplot( 233)
  7. ax4 = fig.add_subplot( 234)
  8. ax5 = fig.add_subplot( 235)
  9. ax6 = fig.add_subplot( 236)
  10. plt.grid( True)
  11. plt.show()
运行结果如下图所示:



然后需要调用函数绘图,下面提几个重点知识:
    1.plot(x, y, marker='D')表示绘制折线图,marker设置样式菱形。
    2.scatter(x, y, marker='s', color='r')绘制散点图,红色正方形。
    3.bar(x, y, 0.5, color='c')绘制柱状图,间距为0.5,原色。
    4.hist(data,40,normed=1,histtype='bar',
                   facecolor='yellowgreen',alpha=0.75)直方图。
    5.设置x轴和y轴的坐标值:
      xlim(-2.5, 2.5) #设置x轴范围 ylim(-1, 1) #设置y轴范围
    6.显示中文和负号代码如下:
      plt.rcParams['font.sas-serig']=['SimHei'] #用来正常显示中文标签
      plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

完整代码如下:

   
   
  1. # coding=utf-8
  2. import numpy as np
  3. from pylab import *
  4. from matplotlib import pyplot as plt
  5. x = [ 1, 2, 3, 4]
  6. y = [ 3, 5, 10, 25]
  7. #创建Figure
  8. fig = plt.figure()
  9. #创建一个或多个子图(subplot绘图区才能绘图)
  10. ax1 = fig.add_subplot( 231)
  11. plt.plot(x, y, marker= 'D') #绘图及选择子图
  12. plt.sca(ax1)
  13. ax2 = fig.add_subplot( 232)
  14. plt.scatter(x, y, marker= 's', color= 'r')
  15. plt.sca(ax2)
  16. plt.grid( True)
  17. ax3 = fig.add_subplot( 233)
  18. plt.bar(x, y, 0.5, color= 'c') #柱状图 width=0.5间距
  19. plt.sca(ax3)
  20. ax4 = fig.add_subplot( 234)
  21. #高斯分布
  22. mean = 0 #均值为0
  23. sigma = 1 #标准差为1 (反应数据集中还是分散的值)
  24. data = mean+sigma*np.random.randn( 10000)
  25. plt.hist(data, 40,normed= 1,histtype= 'bar',facecolor= 'yellowgreen',alpha= 0.75)
  26. plt.sca(ax4)
  27. m = np.arange( -5.0, 5.0, 0.02)
  28. n = np.sin(m)
  29. ax5 = fig.add_subplot( 235)
  30. plt.plot(m, n)
  31. plt.sca(ax5)
  32. ax6 = fig.add_subplot( 236)
  33. xlim( -2.5, 2.5) #设置x轴范围
  34. ylim( -1, 1) #设置y轴范围
  35. plt.plot(m, n)
  36. plt.sca(ax6)
  37. plt.grid( True)
  38. plt.show()
输出结果如下图所示:


Matplotlib强推博客:
http://www.cnblogs.com/zhizhan/p/5615947.html
http://blog.csdn.net/jinlong_xu/article/details/70183377
【Python数据挖掘课程】六.Numpy、Pandas和Matplotlib包基础知识



二. imshow详解热图知识

热图(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类型)

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


   
   
  1. # coding=utf-8
  2. from matplotlib import pyplot as plt
  3. X = [[ 1, 2],[ 3, 4],[ 5, 6]]
  4. plt.imshow(X)
  5. plt.show()
输出如下图所示:



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

   
   
  1. #coding=utf-8
  2. from matplotlib import pyplot as plt
  3. X = [[ 1, 2],[ 3, 4],[ 5, 6]]
  4. plt.imshow(X)
  5. plt.colorbar()
  6. 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)、和春夏秋冬的示例。

   
   
  1. #coding=utf-8
  2. from matplotlib import pyplot as plt
  3. X = [[ 1, 2],[ 3, 4]]
  4. fig = plt.figure()
  5. ax = fig.add_subplot( 231)
  6. ax.imshow(X)
  7. ax = fig.add_subplot( 232)
  8. ax.imshow(X, cmap=plt.cm.gray) #灰度
  9. ax = fig.add_subplot( 233)
  10. im = ax.imshow(X, cmap=plt.cm.spring) #春
  11. plt.colorbar(im)
  12. ax = fig.add_subplot( 234)
  13. im = ax.imshow(X, cmap=plt.cm.summer)
  14. plt.colorbar(im, cax= None, ax= None, shrink= 0.5) #长度为半
  15. ax = fig.add_subplot( 235)
  16. im = ax.imshow(X, cmap=plt.cm.autumn)
  17. plt.colorbar(im, shrink= 0.5, ticks=[ -1, 0, 1])
  18. ax = fig.add_subplot( 236)
  19. im = ax.imshow(X, cmap=plt.cm.winter)
  20. plt.colorbar(im, shrink= 0.5)
  21. plt.show()

运行结果如下图所示:



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


   
   
  1. #coding=utf-8
  2. from matplotlib import pyplot as plt
  3. X = [[ 0, 0.25], [ 0.5, 0.75]]
  4. fig = plt.figure()
  5. ax = fig.add_subplot( 121)
  6. im = ax.imshow(X, cmap=plt.get_cmap( 'hot'))
  7. plt.colorbar(im, shrink= 0.5)
  8. ax = fig.add_subplot( 122)
  9. im = ax.imshow(X, cmap=plt.get_cmap( 'hot'), interpolation= 'nearest',
  10. vmin= 0, vmax= 1)
  11. plt.colorbar(im, shrink= 0.2)
  12. plt.show()
运行结果如下图所示:


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

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

   
   
  1. # coding=utf-8
  2. import numpy as np
  3. from matplotlib import pyplot as plt
  4. from matplotlib import cm
  5. from matplotlib import axes
  6. def draw_heatmap(data,xlabels,ylabels):
  7. #cmap=cm.Blues
  8. cmap=cm.get_cmap( 'rainbow', 1000)
  9. figure=plt.figure(facecolor= 'w')
  10. ax=figure.add_subplot( 1, 1, 1,position=[ 0.1, 0.15, 0.8, 0.8])
  11. ax.set_yticks(range(len(ylabels)))
  12. ax.set_yticklabels(ylabels)
  13. ax.set_xticks(range(len(xlabels)))
  14. ax.set_xticklabels(xlabels)
  15. vmax=data[ 0][ 0]
  16. vmin=data[ 0][ 0]
  17. for i in data:
  18. for j in i:
  19. if j>vmax:
  20. vmax=j
  21. if j<vmin:
  22. vmin=j
  23. map=ax.imshow(data,interpolation= 'nearest',cmap=cmap,aspect= 'auto',vmin=vmin,vmax=vmax)
  24. cb=plt.colorbar(mappable=map,cax= None,ax= None,shrink= 0.5)
  25. plt.show()
  26. a=np.random.rand( 10, 10)
  27. print a
  28. xlabels=[ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
  29. ylabels=[ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
  30. draw_heatmap(a,xlabels,ylabels)
运行结果如下图所示:



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

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


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值