博客年龄:18年0个月
访问:?
文章:433篇

个人描述

型号:男;产地:河北保定府;规格:178*73合格品 请勿倒置;活动地域:上海;爱好:外圆内方(画出来您就明白是什么了);气质:耍酷并随和着;志向:做一个幸福的傻博士,有房、有车、有人爱,有空做做兼职维护一下世界和平,百年以后,我传奇的一生能养活若干学者,这些学者每人再带几个傻博士……

用python的matplotlib包绘制热度图

2011-08-22 17:15 阅读(?)评论(0)

    python里的matplotlib是一个很强大的绘图软件包。可以绘制类似matlab和R软件效果的图样。这几天尝试着从原始数据得到一个热度图。就用了这个软件包。效果还好。虽然软件很庞大很复杂,但是遇到的各种问题都还能比较好地解决。最后得到了我想要的结果。

代码如下:

#!/usr/bin/python
import numpy as NP
A = NP.array([
[6.55,6.76,7.32,5.6,5.94,],
[0.01,0.01,0.04,0.02,0.11,],
[6.45,6.29,4.34,4.57,7.15,],
[8.73,10.67,6.9,8.25,8.53,],
[0.03,0.01,0.05,0.01,0.07,],
[1.36,1.41,0.8,0.98,1.36,],
[0,0,0,0,0.01,],
[2.09,2.93,1.94,1.96,3.56,],
[3.61,3.37,2.62,6.99,4.6,],
[6.08,7.04,4.72,4.78,7.2,],
[1.67,0.92,0.62,3.87,0.75,],
[0.01,0,0,0.11,0.18,],
[0.03,0,0.13,0.03,0.24,],
[1.66,1.8,1.81,1.81,2.12,],
[3.37,3.48,4.39,3.02,3.2,],
[4.77,4.91,8.62,5.35,4.68,],
[7.58,7.9,3.02,7.57,8.15,],
[7.59,7.79,9.92,8.17,7.61,],
[3.59,3.46,2.54,2.99,2.68,],
[2.51,3.82,4.57,2.56,3.19,],
[1.74,2.38,5.4,2.05,2.24,],
[4.71,3.05,5.12,2.73,4.18,],
[0.85,0.93,2.47,0.83,1.12,],
[11.62,12.01,10.43,12.49,12.42,],
[13.4,9.06,12.24,13.26,8.71,],
])

from matplotlib import pyplot as PLT
from matplotlib import cm as CM
from matplotlib import axes

# 设定一个图像,背景为白色。
fig = PLT.figure(facecolor='w')

#注意位置坐标,数字表示的是坐标的比例

ax1 = fig.add_subplot(2,1,1,position=[0.1,0.15,0.9,0.8])

#注意标记旋转的角度
ax1.set_xticklabels(['','A','B','C','D','E'], range(6), rotation=-45 )

# select the color map

#可以有多种选择,这里我最终选择的是spectral,那个1000是热度标尺被分隔成多少块,数字越多,颜色区分越细致。

#cmap = CM.get_cmap('RdYlBu_r', 1000)
#cmap = CM.get_cmap('rainbow', 1000)
cmap = CM.get_cmap('spectral', 1000)

# map the colors/shades to your data

#那个vmin和vmax是数据矩阵中的最大和最小值。这个范围要与数据的范围相协调。

#那个aspect参数,对确定图形在整个图中的位置和大小有关系。上面的add_subplot中的position参数的数值要想有作用,这里的这个参数一定要选auto。
map = ax1.imshow(A, interpolation="nearest", cmap=cmap,aspect='auto', vmin=0,vmax=15)

#shrink是标尺缩小的比例
cb = PLT.colorbar(mappable=map, cax=None, ax=None,shrink=0.5)
cb.set_label('(%)')

# plot it
PLT.show()


得到的结果是这个样子的:

剩下一些比较简单的图形调整问题,就用gimp来搞定了。这些尚不能解决的问题包括:

1)纵坐标是每隔5行才出现一个数字。我想调成每行都显示,但是yticklabel里找了半天不知道怎么弄。

2)纵坐标在左边,不知道如何改到右边去。

3)不知道如何修改热度区间的位置,比如想把他挪到整个图形的最右上角去。

4)坐标的标签是一个数组,但是很奇怪第一个一定要是空的来占一个位置。不知道是为什么。

5)热度图的label(那个带括号的百分号符)不知道怎样改变方向。


 
表  情:
加载中...
 

请各位遵纪守法并注意语言文明