《Python数据科学指南》——2.3 使用matplotlib进行绘画

2.3 使用matplotlib进行绘画

Matplotlib是Python提供的一个二维绘图库,所有类型的平面图,包括直方图、散点图、折线图、点图、热图以及其他各种类型,都能由Python制作出来。在本书中,我们将采用matplotlib的pyplot接口实现所有的可视化需求。

2.3.1 准备工作

本节中,我们会介绍使用pyplot的基础绘图框架,并且用它来完成本书中的所有可视化需求。

本书采用的是matplotlib1.3.1,你可以在命令行下调用_version_属性来检查版本,如图2-10所示。

2.3.2 操作方法

我们通过示例来学习如何用matplotlib绘制一些简单的图形。

#Recipe_2a.py
import numpy as np
import matplotlib.pyplot as plt
def simple_line_plot(x,y,figure_no):
     plt.figure(figure_no)
     plt.plot(x,y)
     plt.xlabel('x values')
     plt.ylabel('y values')
     plt.title('Simple Line')

def simple_dots(x,y,figure_no):
     plt.figure(figure_no)
     plt.plot(x,y,'or')
     plt.xlabel('x values')
     plt.ylabel('y values')
     plt.title('Simple Dots')

def simple_scatter(x,y,figure_no):
     plt.figure(figure_no)
     plt.scatter(x,y)
     plt.xlabel('x values')
     plt.ylabel('y values')
     plt.title('Simple scatter')

def scatter_with_color(x,y,labels,figure_no):
     plt.figure(figure_no)
     plt.scatter(x,y,c=labels)
     plt.xlabel('x values')
     plt.ylabel('y values')
     plt.title('Scatter with color')

if name == "__main__":
     plt.close('all')
     # x、y样例数据生成折线图和简单的点图
     x = np.arange(1,100,dtype=float)
     y = np.array([np.power(xx,2) for xx in x])

     figure_no=1
     simple_line_plot(x,y,figure_no)
     figure_no+=1
     simple_dots(x,y,figure_no)

     # x、y样例数据生成散点图
     x = np.random.uniform(size=100)
     y = np.random.uniform(size=100)

     figure_no+=1
     simple_scatter(x,y,figure_no)
     figure_no+=1
     label = np.random.randint(2,size=100)
     scatter_with_color(x,y,label,figure_no)
     plt.show()

接下来我们要探讨一些进阶的主题,包括生成热图以及给x和y轴添加标签。

# Recipe_2b.py
import numpy as np
import matplotlib.pyplot as plt
def x_y_axis_labeling(x,y,x_labels,y_labels,figure_no):
     plt.figure(figure_no)
     plt.plot(x,y,'+r')
     plt.margins(0.2)
     plt.xticks(x,x_labels,rotation='vertical')
     plt.yticks(y,y_labels,)

def plot_heat_map(x,figure_no):
     plt.figure(figure_no)
     plt.pcolor(x)
     plt.colorbar()
if name == "__main__":
     plt.close('all')
     x = np.array(range(1,6))
     y = np.array(range(100,600,100))
     x_label = ['element 1','element 2','element 3','element
4','element 5']
     y_label = ['weight1','weight2','weight3','weight4','weight5']

     x_y_axis_labeling(x,y,x_label,y_label,1)

     x = np.random.normal(loc=0.5,scale=0.2,size=(10,10))
     plot_heat_map(x,2)

     plt.show()

2.3.3 工作原理

我们先从导入需要的模块开始,使用pyplot前,必须先导入NumPy库。

import numpy as np
import matplotlib.pyplot as plt

我们从下面代码的main函数开始,之前运行的程序可能已经绘制了一些图形,先把它们全部关闭是一个好习惯。同时,我们的程序可能也需要更多的绘图资源。

plt.close('all')

接着,为了演示如何使用pyplot,我们得先用NumPy生成一些数据。

# x、y样例数据生成折线图和简单的点图
x = np.arange(1,100,dtype=float)
y = np.array([np.power(xx,2) for xx in x])

我们在x和y变量中生成了100个元素,y是x变量的平方数,然后绘制一条简单的折线图。

figure_no=1
simple_line_plot(x,y,figure_no)

当程序中有多个图形的时候,最好用figure_no变量给每个图形设置一个编号。我们接着再看simple_line_plot函数。

def simple_line_plot(x,y,figure_no):
     plt.figure(figure_no)
     plt.plot(x,y)
     plt.xlabel('x values')
     plt.ylabel('y values')
     plt.title('Simple Line')

如你所见,我们开始用pyplot的figure函数编号标示图形,我们在main函数中把figure_no变量进行传递。然后,给定x和y的值就可以轻松地调用plot函数。分别通过xlable和ylabel函数给x轴和y轴命名,可以让图形更直观易懂。最后,我们还可以给图形命名,这意味着我们的第1个折线图快要绘制完成了。但是图形不会自动显示,必须通过调用show()函数才能显示。在本例中,我们调用show()函数来将所有的图形一起显示,得到的图看起来应该是图2-11这样。

这里绘出的图形里,x轴是x的值,y轴是x的平方值。

我们绘制了一张简单的折线图,我们可以看到优美的弧线,因为y的值是x值的平方。

再看下一个图形。

figure_no+=1
simple_dots(x,y,figure_no)

我们增加了图形的编号并调用了simple_dots函数,希望将x和y的值用点而不是线的形式绘制出来,来看看simple_dots函数。

def simple_dots(x,y,figure_no):
     plt.figure(figure_no)
     plt.plot(x,y,'or')
     plt.xlabel('x values')
     plt.ylabel('y values')
     plt.title('Simple Dots')

除了下面这行,每行的代码和之前的函数都是相同的。

plt.plot(x,y,'or')

这个“or”参数说明我们需要的是点(o),这个点的颜色是红色(r)。上面的命令绘制的图形如图2-12所示。

再看下一个图形。

我们这次要绘制的是散点图,我们用NumPy生成一些数据。

# x、y样例数据生成散点图
x = np.random.uniform(size=100)
y = np.random.uniform(size=100)

我们采用均匀分布生成了100个样例数据点,现在我们调用simple_scatter函数来生成散点图。

figure_no+=1
simple_scatter(x,y,figure_no)

simple_scatter函数里的每一行都和前面的绘图方法里一样,除了以下这行。

plt.scatter(x,y)

我们调用了scatter函数而不是pyplot中的plot函数,绘制出来的图形如图2-13所示。

我们来看最终想要的散点图:每个点根据它所属的类标签被标上了颜色。

figure_no+=1
label = np.random.randint(2,size=100)
scatter_with_color(x,y,label,figure_no)

为了保持图表的可读性,我们继续增加图形的数量,接下来,我们要随机地给点加入一些标签,内容是0或者1。最后再用这些x、y和标签的变量作为参数来调用scatter_with_color函数。

这个函数和之前的scatter函数的区别如下所示。

plt.scatter(x,y,c=labels)

我们将标签的值传给c参数,就是颜色参数。每个标签对应着一个唯一的颜色。本例中,标签为0的点和标签为1的点颜色是不一样的,如图2-14所示。

接下来我们再看热图以及轴标签。

我们仍然从main函数开始。

     plt.close('all')
     x = np.array(range(1,6))
     y = np.array(range(100,600,100))
     x_label = ['element 1','element 2','element 3','element\
4','element 5']
     y_label = ['weight1','weight2','weight3','weight4','weight5']
     x_y_axis_labeling(x,y,x_label,y_label,1)

记得保持良好的习惯,调用close函数把之前的那些图先全部关闭。然后我们生成一些数据:x是一个有5个元素的数组,元素值从1到5;y也是一个5个元素的数组,元素值从100到500。我们定义两个列表x_label和y_label作为图的标签。最后,我们调用x_y_axis_labeling函数来演示如何给x和y轴添上标签。

请看下面的函数。

def x_y_axis_labeling(x,y,x_labels,y_labels,figure_no):
     plt.figure(figure_no)
     plt.plot(x,y,'+r')
     plt.margins(0.2)
     plt.xticks(x,x_labels,rotation='vertical')
     plt.yticks(y,y_labels,)

我们将采用pyplot的dot函数来绘制一张简单的点图。这次的示例中,我们不再采用“o”,而是使用“+”来表示点。因此,我们指定的参数是“+r”,“r”代表红色。

在后面的两行里,我们还要指定x和y轴的标签类型。我们使用xticks函数传递x的值和它们的标签。此外,我们还要将文本进行垂直翻转以避免相互遮挡。y轴的处理过程也是完全类型的。请看图2-15。

我们来看如何用pyplot生成热图。

x = np.random.normal(loc=0.5,scale=0.2,size=(10,10))
plot_heat_map(x,2)

绘制热图需要准备一些数据。本例中,我们用正态分布产生一个10×10矩阵的数据,设定loc变量为0.5作为均值,设定scale变量为0.2作为标准差,然后将矩阵传给plot_heat_map。第2个参数是图形的编号。

def plot_heat_map(x,figure_no):
     plt.figure(figure_no)
     plt.pcolor(x)
     plt.colorbar()

我们调用pcolor函数来创建热图,第2行里调用的colorbar函数用来控制渐变色的颜色范围,输出如图2-16所示。

2.3.4 更多内容

要了解更多关于matplotlib的信息,以下地址提供了大量相关文档,请参见:

http://matplotlib.org/faq/usage_faq.html。

以下地址是一个pyplot的优秀教程,请参见:

http://matplotlib.org/users/pyplot_tutorial.html。

Matplotlib也提供了优秀的3D绘图能力,详情请参见:

http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html。

matplotlib里的pylab模块联合使用了pyplot和NumPy命名空间,我们也可以使用pylab来绘制本节中的各种图形。

时间: 2024-08-03 10:08:35

《Python数据科学指南》——2.3 使用matplotlib进行绘画的相关文章

《Python数据科学指南》——导读

前 言 如今,我们生活在一个万物互联的世界,每天都在产生海量数据,不可能依靠人力去分析产生的所有数据并做出决策.人类的决策越来越多地被计算机辅助决策所取代,这也得益于数据科学的发展.数据科学已经深入到我们互联世界中的每个角落,市场对那些十分了解数据科学算法并且有能力用这些算法进行编程的人才需求是不断增长的.数据科学是多领域交叉的,简单列举几个:数据挖掘.机器学习.统计学等.这对那些渴望成为数据科学家以及已经从事这一领域的人们在各方面都倍感压力.把算法当成黑盒子应用到决策系统里,可能会适得其反.面

《Python数据科学指南》——1.2 使用字典对象

1.2 使用字典对象 在Python语言中,容器是一种对象,它能够容纳任意数量.任意类型的对象.它可以对子对象进行操作,还可以迭代操作.字典.元组.列表还有集合都是容器对象.在collections模块中,Python提供了更多的容器类型.在这一节中,我们先来仔细了解字典. 1.2.1 准备工作 我们先通过一个Python的脚本示例来理解字典是如何操作的,这段脚本用来统计词频,也就是每个词在给定的文本中出现的次数. 1.2.2 操作方法 下面的示例演示了在Python中对字典对象如何操作.通过对

《Python数据科学指南》——2.2 使用NumPy库

2.2 使用NumPy库 Python中,NumPy提供了一条高效处理超大数组的途径.大多数Python科学计算库中都在内部使用NumPy处理数组和矩阵操作.在本书中,NumPy被广泛应用,我们在本节介绍它. 2.2.1 准备工作 我们先写一系列语句来操作数组和矩阵,学习如何使用NumPy.目的是让您习惯使用NumPy数组,它也是本书大多数内容的基础. 2.2.2 操作方法 我们先创建一些简单的矩阵和数组. # Recipe_1a.py # 导入NumPy库,命名为np import numpy

《Python数据科学指南》——1.3 使用字典的字典

1.3 使用字典的字典 我们之前提到,为了完成目标,你得创造性地应用各类数据结构,这样才能发挥它们的威力.接下来,我们通过一个实例来帮助理解"字典的字典". 1.3.1 准备工作 请看表1-1. 第1列中列出了3个用户,其他列都是电影,单元格里是每个用户给电影的评分.我们要把这些数据放到内存中,这样大型程序的其他部分也能方便地访问,此时我们将使用"字典的字典". 1.3.2 操作方法 我们通过匿名函数来创建一个user_movie_rating的字典对象,以此展示&

《Python数据科学指南》——第1章 Python在数据科学中的应用 1.1 简介

第1章 Python在数据科学中的应用 在这一章里,我们将探讨以下主题. 使用字典对象 使用字典的字典 使用元组 使用集合 写一个列表 从另一个列表创建列表--列表推导 使用迭代器 生成一个迭代器和生成器 使用可迭代对象 将函数作为变量传递 在函数中嵌入函数 将函数作为参数传递 返回一个函数 使用装饰器改变函数行为 使用lambda创造匿名函数 使用映射函数 使用过滤器 使用zip和izip函数 从表格数据使用数组 对列进行预处理 列表排序 采用键排序 使用itertools 1.1 简介 Py

《Python数据科学指南》——1.20 从表格数据使用数组

1.20 从表格数据使用数组 数据科学的应用程序要成功解决一个问题,必须先找到适当的处理数据的方法.例如在机器学习中对数据进行预测或分类,要么采用有监督的方法,要么采用无监督的方法.而在此之前,传输数据,把数据清洗到匹配算法,可能已经花费了很长的时间. 通常,有很多种方法对数据进行整理使之适合数据科学程序进行处理,数据科学程序开发者首先面对的挑战是如何访问数据,并用Python的数据结构让这些数据持续可用.掌握使用Python访问数据的诀窍是非常有用的,能让你避过纷扰,直接面对问题的核心内容.

《Python数据科学指南》——1.4 使用元组

1.4 使用元组 在Python中,元组是一种顺序型的容器对象.元组是不可变的,元组中的元素由逗号分隔开,可以对不同类别构成的对象进行排序,不允许插入操作,支持以下操作. in和not in. 比较.串联.切片和索引.min ()和max (). 1.4.1 准备工作 我们讲解字典的时候,描述了完整的功能,对于元组,我们通过一些小段的代码来聚焦于元组的创建与维护操作. 1.4.2 操作方法 先让我们看看一些元组创建和维护的示例代码. # 1.创建一个元组 a_tuple = (1,2,'a')

《Python数据科学指南》——1.8 使用迭代器

1.8 使用迭代器 毫无疑问,对于数据科学的程序而言,数据是极其重要的输入.数据的大小是可变的,有些能装载到内存中,有些则不能.而记录访问架构也是随一种数据格式到另一种而变化.有趣的是,不同的算法处理数据时,需要的是可变长度的组块.例如,假如你在写一个随机梯度下降的算法,你希望在每个时间片传送5000条记录的数据块,如果你对如何访问数据.理解数据格式.依次传送数据.给调用者需要的数据等流程有着清晰的概念,那你才能成功.这样能让你写出清晰的代码.大多数时候,最有趣的部分是我们如何处理数据,而不是我

《Python数据科学指南》——1.10 使用可迭代对象

1.10 使用可迭代对象 可迭代对象和生成器十分相似,但是有一个重要的区别:我们可以重复地访问一个可迭代对象,即使我们已经访问完了序列中的所有元素,我们还可以从头重新访问它,这和生成器是完全不同的. 如果不保持任何状态,它们就是基于对象的生成器.所有带有iter方法的类,在用来产生数据时,都可以被作为无状态对象生成器来使用. 1.10.1 准备工作 我们通过一个简单的示例来理解可迭代对象.如果理解了之前介绍的生成器和迭代器,你也能很容易地理解这个概念. 1.10.2 操作方法 我们来创建一个简单