数据可视化-Python之Matplotlib

数据可视化可以说是数据挖掘与结果展示很有力的工具。

程序绘图可以得到比较个性化的图像,而且易于大量生产大量的图像。但是对于绘图来书,最为重要的是之前额数据预处理。个人比较喜欢的绘图工具平台有R语言的ggplot2以及Python的matplotlib,R语言比python还要简洁,产生图像也鞥各位方便,绘图库很多,很多地图可视化也是轻而易举的实现。然而R语言针对大数据的处理效率不足,python可以很好的弥补这一点,一般大量数据我都是在python下处理然后用csv格式数据导入到R平台,然后绘图。

今天尝试了一下matplotlib,这个绘图库很想Maltab的绘图库,学习的话就是这个教程:http://reverland.org/python/2012/09/07/matplotlib-tutorial/

然后就是阅读了几篇网上的博客:

昨天帮一个同学做一个简单的分组柱状图:


#-------------------------------------------------------------
def covinience_bar_plot(plotData,title):

    n_groups = 12 
    fig, ax = plt.subplots()
    index = np.arange(n_groups)
    bar_width = 0.1

    opacity = 0.7
    error_config = {'ecolor': '0.3'}
    filterByProvince=[u'AnHui',u'HeNan',u'HuNan',u'JiangXi',u'ShanDong',u'ShanXi',u'HuBei',u'ChongQing']    
    color=['#145214','#666633','#CC3300','#CCFF66','#FF6600',
    '#CC66FF','#3366FF','#0099CC'] 
    i=0
    
    plt.xlim(-0.5, index.max()*1.1)
    for xx,yy,province in zip(range(1,9),color,filterByProvince):
        
        rects1 = plt.bar(index+bar_width*i, plotData[:,xx], bar_width,
                         alpha=opacity,
                         color=yy,
                         error_kw=error_config)
        rects1.set_label(province)

        for x,y in zip(index+bar_width*i, plotData[:,xx]):
            plt.text(x+0.06, y+3, '%.0f' % y,fontsize=3, ha='center', va= 'bottom')         
        i+=1
    
    plt.xlabel('Month')
    plt.ylabel('Num')
    
    #plt.xticks( range(1,13) )    
    plt.title(title)
    plt.xlim(-0.5, index.max()*1.1)
    mark=range(1,13)
    plt.xticks(index + 4*bar_width, mark)
    plt.legend()
    plt.tight_layout()   
    plt.savefig(title+".png",dpi=700)
    plt.show()

plotData是一个12*9的numpy数组,产生柱状图的思想是花多次bar,然后每次bar的位置向后位移一个一定的长度,


上面的图分辨率设置高一点能够放大浏览,但是在数据可视化里面这样的情况是不好的,最好进一步分组可视化,把很高的柱子在另一个图像中展示:

matplotlib里面有一个很有趣的东西就是这个xkcd的东东,它可以让你的绘制的图像像是涂鸦风格,像这样的或者这样的:


这个特性只有在版本1.3之后才被支持,由于之前一直使用spyder作为开发环境,所以matplotlib的版本比较低这个特性并不被支持,马上下载了新的版本的matplotlib然后安装,在把这个目录copy到我的spyder所使用的包目录下,然后把以前的matplotlib删除,ok

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import matplotlib.path as mpath
import matplotlib.patches as mpatches
with plt.xkcd():
    fig, ax = plt.subplots()
    Path = mpath.Path
    path_data = [
        (Path.MOVETO, (1.58, -2.57)),
        (Path.CURVE4, (0.35, -1.1)),
        (Path.CURVE4, (-1.75, 2.0)),
        (Path.CURVE4, (0.375, 2.0)),
        (Path.LINETO, (0.85, 1.15)),
        (Path.CURVE4, (2.2, 3.2)),
        (Path.CURVE4, (3, 0.05)),
        (Path.CURVE4, (2.0, -0.5)),
        (Path.CLOSEPOLY, (1.58, -2.57)),
        ]
    codes, verts = zip(*path_data)
    path = mpath.Path(verts, codes)
    patch = mpatches.PathPatch(path, facecolor='r', alpha=0.5)
    ax.add_patch(patch)
    
    # plot control points and connecting lines
    x, y = zip(*path.vertices)
    line, = ax.plot(x, y, 'go-')
    
    ax.grid()
    ax.axis('equal')
plt.show()


xkcd使用很方便,只要把原先的绘图程序放进with xkcd():语句里就好了


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页