Python数据可视化——生成数据(一)
数据可视化时通过可视化表示来探索数据,它与数据挖掘紧密相关,数据挖掘是指使用代码来探索数据集的规律和关联。
Matplotlib时一个数学绘图库,可以使用它制作简单的图表,如折线图和散点图。
1、安装matplotlib
首先,需要安装matplotlib。
1.1 Linux系统中安装matplotlib
如果使用系统自带的Python版本,可以使用系统的包管理器来安装,只需执行命令:
$ sudo apt-get install python3-matplotlib
如果安装了较新版本的Python,则要先安装matplotlib依赖的一些库,例如:
$ sudo apt-get install pythoon3.5-dev python3.5-tk tk-dev
$ sudo apt-get install libfreetype6-dev g++
再使用pip安装matplotlib:
$ pip install --user matplotlib
1.2 OS X系统中安装matplotlib
Apple的标准Python安装自带了matplotlib。要检查是否安装了matplotlib,可以打开一个终端并尝试导入matplotlib。如果没有自带,可以使用pip安装:
$ pip install --user matplotlib
注意:安装包时可能要使用pip3,而不是pip。如果命令不能顺利安装,可能需要删除标志--user。
1.3 Windows系统中安装matplotlib
在Windows系统中,同样可以使用pip命令安装:
pip install package_name
在 Anaconda虚拟环境下,还可以使用conda命令来安装:
conda activate env_name
具体教程可以参考博客:深度学习中项目的环境配置与依赖下载
1.4 验证matplotlib
安装完必要的包之后,对安装进行验证。启用终端,在Python环境下,尝试导入matplotlib:
>>> import matplotlib
>>>
如果没有出现任何错误信息,就说明安装成功。
1.5 matplotlib画廊
要查看使用matplotlib可制作的各种图表,可以访问:Matplotlib — Visualization with Python的示例,点击图表即可查看用于生成图表的代码。
2、绘制简单的折线图
只需调用matplotlib,就能实现数据可视化:
import matplotlib.pyplot as plt
squares = [1,4,9,16,25]
plt.plot(squares)
plt.show()
先导入matplotlib中的一个模块pyplot并为其指定别名plt,以免反复输入pyplot。大多程序都是这样做的。模块pyplot中包含很多用于生成图表的函数。
接着创建了一个列表存储数据,再将该列表传递给函数plot()。plt.show()打开matplotlib查看器,并显示绘制的图形。
如图所示,显示器能缩放和导航图形,以及保存图形。

2.1 修改标签文字和线条粗细
import matplotlib.pyplot as plt
from matplotlib.pyplot import tick_params
from sympy.printing.pretty.pretty_symbology import line_width
squares = [1,4,9,16,25]
plt.plot(squares,linewidth=5)
#设置图表标题,并为坐标加上标签
plt.title("square numbers",fontsize=24)
plt.xlabel("value",fontsize=14)
plt.ylabel("square of value",fontsize=14)
#设置刻度标记的大小
plt.tick_params(axis='both',labelsize=14)
plt.show()
代码中,参数linewidth指定了绘制的线条粗细。函数title()指定图表标题。参数fontsize指定了图表中文字的大小。函数xlabel()和ylabel()为每个轴设置轴标题。函数tick_params()设置刻度的格式,参数axis='both'表明实参同时影响x轴和y轴,并将刻度的字号设为14(labelsize=14)。

2.2 校正图形
上图中,y轴平方数结果并没有对应x轴的数,这是因为,当只向plot()函数提供一个参数(即[1,4,9,16,25])时,默认第一个数据点对应x=0的位置。
为改变这种默认,可以向函数提供两个参数:
import matplotlib.pyplot as plt
from matplotlib.pyplot import tick_params
from sympy.printing.pretty.pretty_symbology import line_width
input_value =[1,2,3,4,5]
squares = [1,4,9,16,25]
plt.plot(input_value,squares,linewidth=5)
#设置图表标题,并为坐标加上标签
plt.title("square numbers",fontsize=24)
plt.xlabel("value",fontsize=14)
plt.ylabel("square of value",fontsize=14)
#设置刻度标记的大小
plt.tick_params(axis='both',labelsize=14)
plt.show()

同时提供输入和输出数据,现在可以正确绘制图形。
使用plot()函数可以指定各种实参,还可以使用众多函数对图形进行定制。
2.3 scatter()绘制散点图
有时候需要绘制散点图并设置各个数据点的样式。例如,使用不同的颜色显示不同的数据。绘制大型数据集时,可以对每个点使用相同的样式,然后使用不同的样式选项重新绘制某些点,以突出显示。
要绘制单个点,可以使用函数scatter(),并传递一对x和y坐标,将在指定位置绘制一个点:
import matplotlib.pyplot as plt
plt.scatter(2,4)
plt.show()

接着为其设置样式:添加标题,加上标签,放大文本。
import matplotlib.pyplot as plt
plt.scatter(2,4,s=200)
#设置标题并加上标签
plt.title("square numbers",fontsize=24)
plt.xlabel("value",fontsize=14)
plt.ylabel("square of value",fontsize=14)
#设置刻度的大小
plt.tick_params(axis='both',which='major',labelsize=14)
plt.show()
调用scatter(),并设置参数s设置点的大小.

2.4 scatter()绘制一系列点
要绘制一系列点,可以向scatter()传递两个分别包含x值和y值的列表:
import matplotlib.pyplot as plt
x_value = [1,2,3,4,5]
y_value = [1,4,9,16,25]
plt.scatter(x_value,y_value,s=200)
#设置标题并加上标签
plt.title("square numbers",fontsize=24)
plt.xlabel("value",fontsize=14)
plt.ylabel("square of value",fontsize=14)
#设置刻度的大小
plt.tick_params(axis='both',which='major',labelsize=14)
plt.show()

2.5 自动计算数据
手动计算列表的值效率低下,尤其是点的数量多时。可以使用Python循环来完成这种重复计算:
import matplotlib.pyplot as plt
x_values = list(range(1,1001))
y_values = [x**2 for x in x_values]
plt.scatter(x_values,y_values,s=40)
#设置标题并加上标签
plt.title("square numbers",fontsize=24)
plt.xlabel("value",fontsize=14)
plt.ylabel("square of value",fontsize=14)
#设置刻度的取值范围
plt.axis([0,1100,0,1100000])
plt.show()
首先创建一个列表作为x轴的值,接着用列表表达式生成y轴的值,然后将两个列表传递给scatter()。
由于数据集很大,因此将点设置得较小,并使用函数axis()指定每个坐标轴的取值范围。函数axis()要求提供四个值:x坐标的最小值和最大值,y坐标的最小值和最大值。

2.6 删除数据点的轮廓
matplotlib允许给每个点指定颜色,默认为蓝色点和黑色轮廓,如果点数过多黑色轮廓可能粘在一起。要删除点的轮廓,可以给scatter()函数传递实参edgecolor='none':
plt.scatter(x_values,y_values,edgecolor='none',s=40)
2.7 自定义颜色
要修改数据点的颜色,可以向scatter()传递参数c,并设置要使用的颜色:
plt.scatter(x_values,y_values,c='red',edgecolor='none',s=40)
还可以自定义颜色。传递参数c并将其设置为一个元组,元组包含三个0-1之间的小数值,分别代表红,绿,蓝色分量。例如:
plt.scatter(x_values,y_values,c=(0,0,0.8),edgecolor='none',s=40)
值越接近0,指定的颜色越深;值越接近1,指定的颜色越浅。
2.8 使用颜色映射
颜色映射(colormap)是一系列颜色,从起始颜色渐变到结束颜色。在可视化中,颜色映射主要用于突出数据的规律,例如使用较浅的颜色来显示较小的值,使用较深的颜色来显示较大的值。
模块pyplot内置了一组颜色映射。要使用颜色颜色,只需告诉pyplot如何设置数据集中的每个点的颜色。
import matplotlib.pyplot as plt
x_values = list(range(1,1001))
y_values = [x**2 for x in x_values]
plt.scatter(x_values,y_values,c=y_values,cmap=plt.cm.Blues,edgecolors='none',s=40)
#设置标题并加上标签
plt.title("square numbers",fontsize=24)
plt.xlabel("value",fontsize=14)
plt.ylabel("square of value",fontsize=14)
#设置刻度的取值范围
plt.axis([0,1100,0,1100000])
plt.show()
将参数c设置为y值列表,并使用参数cmp告诉pyplot使用哪个颜色映射。结果是将较小的y值显示为浅蓝色,将较大的y值显示为深蓝色。

要了解pyplot中的所有的颜色映射,可以访问Matplotlib — Visualization with Python,单击Examples,向下找到Color Examples,点击colormaps_reference。
2.9 自动保存图表
要让程序自动将图表保存到文件中,可以将plt.show()替换为plt.savefig():
plt.savefig('squares_plot.png',bbox_inches='tight')
第一个参数指定文件名,这个png文件将保存到程序所在文件目录中;第二个参数指定将图表多余的空白区域裁剪掉。如果要保留多余的空白区域,可以省略这个参数。
删除多余空白:

不删除空白:

3、随机漫步
随机漫步是指一种路径:每次行走都是完全随机的,没有明确的方向,结果是由一系列随机决策决定的。
3.1 创建RandomWalk()类
为模拟随机漫步,创建一个名为RandomWalk的类,随机选择前进方向。这个类有三个属性,其中一个是存储随机漫步次数的变量,另外两个是列表,分别存储随机漫步经过的每个点的x坐标和y坐标。
该类有两个方法:__init__()和fill_walk(),后者计算随机漫步经过的所有点。
__init__()方法:
from random import choice
class RandomWalk():
"""一个随机漫步类"""
def __init__(self,num_points=5000):
self.num_points = num_points
#起始于(0,0)
self.x = [0]
self.y = [0]
将所有可能存储在一个列表中,使用choice()来决策每次选择。
3.2 选择方向
使用fill_walk()生成漫步包含的所有点,并决定每次选择的方向。
random_walk.py
from random import choice
class RandomWalk():
"""一个随机漫步类"""
def __init__(self,num_points=5000):
self.num_points = num_points
#起始于(0,0)
self.x = [0]
self.y = [0]
def fill_walk(self):
"""计算随机漫步所有的点"""
#漫步直到指定长度
while len(self.x) < self.num_points:
#决定每次前进方向和前进距离
x_direction = choice([1,-1])
x_distance = choice([0,1,2,3,4])
x_step = x_direction * x_distance
y_direction = choice([1, -1])
y_distance = choice([0, 1, 2, 3, 4])
y_step = y_direction * y_distance
if x_step == 0 and y_step == 0:
continue
#更新新的坐标
next_x = self.x[-1] + x_step
next_y = self.y[-1] + y_step
self.x.append(next_x)
self.y.append(next_y)
使用循环进行每次的漫步直到指定数量的点。
3.3 绘制随机漫步图
将漫步中所有的点画出来:
import matplotlib.pyplot as plt
from random_walk import RandomWalk
#创建一个RandomWalk实例
rw = RandomWalk()
rw.fill_walk()
plt.scatter(rw.x,rw.y,s=15)
plt.show()
创建实例,并将其存储在rw中,调用fill_walk()。将随机变量的坐标x和y传递给scatter()。
一个可能的结果如下:

3.4 模拟多次随机漫步
每次随机漫步得到的结果都不同,要多次随机漫步,可以多次运行程序,还可以使用循环:
import matplotlib.pyplot as plt
from random_walk import RandomWalk
while True:
#创建一个RandomWalk实例
rw = RandomWalk()
rw.fill_walk()
plt.scatter(rw.x,rw.y,s=15)
plt.show()
cmd = input("Go on?(y/n): ")
if cmd == 'n':
break
3.5 设置随机漫步图的样式
为了突出显示某些特征,弱化某些元素,可以设置图表样式。要突出的元素如漫步的起点、终点和经过的路径。
3.5.1 给点着色
使用颜色映射表示每个点的顺序,并删除黑色轮廓。彻底参数c,将其设置为包含各点先后顺序的列表。
import matplotlib.pyplot as plt
from random_walk import RandomWalk
while True:
# 创建一个RandomWalk实例
rw = RandomWalk()
rw.fill_walk()
points_num = list(range(rw.num_points))
plt.scatter(rw.x, rw.y, c=points_num,cmap=plt.cm.Blues,edgecolor='none',s=15)
plt.show()
cmd = input("Go on?(y/n): ")
if cmd == 'n':
break

3.5.2 重新绘制起点和终点
可以在图表中让起点和终点变得更大以突出显示:
import matplotlib.pyplot as plt
from random_walk import RandomWalk
while True:
# 创建一个RandomWalk实例
rw = RandomWalk()
rw.fill_walk()
points_num = list(range(rw.num_points))
plt.scatter(rw.x, rw.y, c=points_num,cmap=plt.cm.Blues,edgecolor='none',s=15)
plt.scatter(0,0,c='green',edgecolors='none',s=100)
plt.scatter(rw.x[-1],rw.y[-1],c='red',edgecolors='none',s=100)
plt.show()
cmd = input("Go on?(y/n): ")
if cmd == 'n':
break

3.5.3 隐藏坐标轴
import matplotlib.pyplot as plt
from random_walk import RandomWalk
while True:
# 创建一个RandomWalk实例
rw = RandomWalk()
rw.fill_walk()
points_num = list(range(rw.num_points))
plt.scatter(rw.x, rw.y, c=points_num,cmap=plt.cm.Blues,edgecolor='none',s=15)
plt.scatter(0,0,c='green',edgecolors='none',s=100)
plt.scatter(rw.x[-1],rw.y[-1],c='red',edgecolors='none',s=100)
#隐藏坐标轴
ax = plt.gca() # 获取当前坐标轴
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
plt.show()
cmd = input("Go on?(y/n): ")
if cmd == 'n':
break

3.5.4 增加点数
import matplotlib.pyplot as plt
from random_walk import RandomWalk
while True:
# 创建一个RandomWalk实例
rw = RandomWalk(50000)
rw.fill_walk()
points_num = list(range(rw.num_points))
plt.scatter(rw.x, rw.y, c=points_num,cmap=plt.cm.Blues,edgecolor='none',s=1)
plt.scatter(0,0,c='green',edgecolors='none',s=100)
plt.scatter(rw.x[-1],rw.y[-1],c='red',edgecolors='none',s=100)
#隐藏坐标轴
ax = plt.gca() # 获取当前坐标轴
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
plt.show()
cmd = input("Go on?(y/n): ")
if cmd == 'n':
break

3.5.5 调整尺寸以适合屏幕
函数figure()用于指定图表的宽度、高度、分辨率和背景色。需要传递给figsize一个元组,指明图表的尺寸,单位为英寸:
import matplotlib.pyplot as plt
from random_walk import RandomWalk
while True:
# 创建一个RandomWalk实例
rw = RandomWalk(50000)
rw.fill_walk()
#设置绘图窗口尺寸大小
plt.figure(figsize=(10,6))
points_num = list(range(rw.num_points))
plt.scatter(rw.x, rw.y, c=points_num,cmap=plt.cm.Blues,edgecolor='none',s=1)
plt.scatter(0,0,c='green',edgecolors='none',s=100)
plt.scatter(rw.x[-1],rw.y[-1],c='red',edgecolors='none',s=100)
#隐藏坐标轴
ax = plt.gca() # 获取当前坐标轴
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
plt.show()
cmd = input("Go on?(y/n): ")
if cmd == 'n':
break

默认屏幕分辨率是80像素/英寸,如果知道自己的分辨率,可以使用指定形参dpi向figure()传递该分辨率,以有效利用可用的屏幕空间:
plt.figure(dpi=128, figsize=(10,6))
更多推荐
所有评论(0)