使用Matplotlib绘制散点图

由于要做算法结果的可视化输出,需要绘制大量的散点图,所以打算使用 matplotlib,以下给出一个绘制散点图例子。

效果图

scatter

源代码

import matplotlib.pyplot as plt
import numpy as np

n = 100

for color in ['red','blue','green']:
    x,y=np.random.rand(2,n)
    scale=100*np.random.rand(n)
    plt.scatter(x,y,c=color,s=scale,label=color,alpha=0.6,edgecolors='white')

plt.title('Scatter')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True)
plt.show()

函数说明

numpy.random.rand(d0,d1,d2…)

返回维度为 (d0,d1,d2…) 的位于区间 [0,1) 满足均匀分布的随机数,返回值结果类型为 ndarray。

matplotlib.pyplot.scatter(x,y,c=color,s=scale,label=color,alpha=0.6,edgecolors=’white’)

scatter() 函数用来绘制散点图, x 和 y 为输入数据,形如 shape (n, )。c 表示散点的颜色,指定一个颜色或者色序。s 表示散点的大小,形如 shape (n, )。label 表示显示在图例中的标注。alpha 是 RGBA 颜色的透明分量。edgecolors 指定三点圆周的颜色。

其他函数

函数名 作用
title 图标的标题
xlabel x轴的名称
ylabel y轴的名称
legend 显示右上角的图例
grid 显示网格
show 显示图像

Numpy和matplotlib的安装和使用

最近要写几个数据挖掘的算法,可是由于Java和C#没有比较成熟和知名的可视化类库,所以想到了用Python的Numpy计算,用matplotlib来做结果的可视化。

Numpy与matplotlib

Numpy
NumPy系统是Python的一种开源的数字扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵matrix)。我用它来进行矩阵的计算,非常便捷。
matplotlib
Matplotlib 可能是 Python 2D- 绘图领域使用最广泛的套件。它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。

在Windows上安装软件包

在Windows上安装Numpy和matplotlib是一个和痛苦的过程。总体来说,安装这两个包的官方安装程序是远远不够的。总会提示你缺这个缺那个。我的解决办法接单粗暴,提示缺少什么了我就谷歌然后安装这个包。所有的包都可以在UCI的网站上找到。

最后为了安装Nump和matplotlib,我一共安装了6个包:

  • matplotlib-1.4.2.win-amd64-py2.7
  • numpy-MKL-1.9.1.win-amd64-py2.7
  • pyparsing-2.0.3.win-amd64-py2.7
  • python-dateutil-2.2.win-amd64-py2.7
  • scipy-0.15.0b1.win-amd64-py2.7
  • six-1.8.0.win-amd64-py2.7

在Ubuntu Linux上安装

在Ubuntu上安装可就简单多了,软件源里就包括这两个包,一句话搞定:

sudo apt-get install python-numpy python-matplotlib

所有依赖的包都自动安装上了,给个赞!
真心说一句,Ubuntu除了网络问题更新软件不给力之外,装软件真心是很方便、很赞的!

通用方法

其实只要用Python都可以用Python包管理工具pip,两句命令即可搞定:

pip install numpy
pip install matplotlib

而安装pip依赖于setuptools,可以点击setuptoolspip来进行下载安装。

测试代码

安装完成后,可以使用引自此页面的代码进行测试。

import numpy as np
import matplotlib.pyplot as plt

N = 5
menMeans = (20, 35, 30, 35, 27)
menStd =   (2, 3, 4, 1, 2)

ind = np.arange(N)  # the x locations for the groups
width = 0.35       # the width of the bars

fig, ax = plt.subplots()
rects1 = ax.bar(ind, menMeans, width, color='r', yerr=menStd)

womenMeans = (25, 32, 34, 20, 25)
womenStd =   (3, 5, 2, 3, 3)
rects2 = ax.bar(ind+width, womenMeans, width, color='y', yerr=womenStd)

# add some
ax.set_ylabel('Scores')
ax.set_title('Scores by group and gender')
ax.set_xticks(ind+width)
ax.set_xticklabels( ('G1', 'G2', 'G3', 'G4', 'G5') )

ax.legend( (rects1[0], rects2[0]), ('Men', 'Women') )

def autolabel(rects):
    # attach some text labels
    for rect in rects:
        height = rect.get_height()
        ax.text(rect.get_x()+rect.get_width()/2., 1.05*height, '%d'%int(height),
                ha='center', va='bottom')

autolabel(rects1)
autolabel(rects2)

plt.show()

参考文献

查阅到了几篇不错的博客和网站可以用大家参考一下: