前言
本文要求阅读者拥有一定的Python编程基础,基于Numpy的ndarray数组配合Matplotlib这个Python可视化软件包来完成数据可视化.编程平台使用的是jupyter,因此要求读者拥有anaconda环境,本文的代码均基于anaconda-5.3.0
图表类型
常见的图表有条形图,直方图,散点图,饼状图等等.不同的图表用于描述不同类型的数据.
例如柱状图用于描述不同类型数据之间的某一属性的关系,直方图用于描述同一类型数据在连续区间上的值的变化.
散点图则更适合反映出变量间的关系.饼状图用于描述某一数据占总和的比率.
什么是Matplotlib?
- Matplotlib 是 Python 的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。
- Matplotlib 可以用来绘制各种静态,动态,交互式的图表。
- Matplotlib 是一个非常强大的 Python 画图工具,我们可以使用该工具将很多数据通过图表的形式更直观的呈现出来。
- Matplotlib 可以绘制线图、散点图、等高线图、条形图、柱状图、3D 图形、甚至是图形动画等等。
- Matplotlib依托于Python,借助Python强大的可扩展性,使其支持各种平台,并且能够根据Numpy ndarray数组进行图像绘制,且使用简单,代码清晰易懂。
- Matplotlib基于Matlab并且基于面向对象这一思想。
- Matplotlib实现了几乎完全是自主控制的图形定义功能。
折线图
首先再jupyter里导入matplotlib和numpy的包(下文统称plt和np)
from matplotlib import pyplot as plt #导入模块 import numpy as np
如果版本不一样,没关系,你可以使用你的版本,当然你也可以在cmd中输入conda update metplotlib进行版本升级
下文有些部分可能会使用这种语法,可能有部分人用的少,我讲解一下
这种语法其实就是:
在for循环中,遍历的索引的值其实是可以作为另一语句的参数的,例如这里 %i 就代表把遍历的i的值作为 '日期%s’的参数传递进去,因此最终循环十次就可以得到下面这种情况
之后就是首先了解一些简单的函数
plot
plot函数用于绘制折线图
plt.plot(x, y, color='red', alpha=0.3,linestyle='-', linewidth=5, marker='o' , markeredgecolor='r', markersize='20’,
markeredgewidth=10)
比较特殊的是,plot这个函数并不是必要的一定要传入x,y,也可以之传入一个参数,那么这个参数将会作为y被解析,而x则代表的是y的长度-1,即 x可以省略,默认[0,…,N-1]递增,N为y轴的元素个数例如:
plt.xticks(np.arange(12),np.arange(12)) plt.title('y=x^2,x∈[0,11]') plt.plot(np.arange(12)**2) # 只传入y
可以发现我并没有传入x,y而可以发现x轴的刻度其实就是y轴上数据个数-1(这里我是用xticks显式标注了一下,你也可以去掉看效果).如果只传入一个参数,那么这个参数被解析为y轴上的值,而不是x轴的,因此这个图他的x轴和y轴表示的分别是:x轴—>len(y轴)-1, y轴—>x^2,x∈[0,11]
rcParams,xlabel,title
rcParams,这是一个参数字典,我们可以对对应的参数进行设置,例如设置字体等
这里重点介绍rcParams
- plt.rcParams[‘figure.figsize’]=(8.0,4.0) #设置figure_size英寸
- plt.rcParams['figure.dpi] = 300 #分辨率默认的像素:[6.0,4.0],分辨率为72,图片尺寸为432x288·
- 指定dpi=100,图片尺寸为600*400
- 指定dpi=300,图片尺寸为1800*1200
xlabel和ylabel则用来设置x和y轴的轴名称
title则用来设置当前画布的名称
plot用于描绘一个简单的2D关系图
x = np.arange(-50,51) y=x**2 z=x plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体为中文黑体 plt.rcParams['axes.unicode_minus'] = False # 关闭unicode的负号配置 去掉这句话要报错 plt.rcParams['figure.dpi'] = 100 # 分辨率设置 plt.rcParams['figure.figsize'] = (3,2) # 英寸设置 plt.title('y关于x的二次方') # 设置图表名 plt.xlabel('x 轴') plt.ylabel('y 轴') plt.plot(x,y) # 第一个matplotlib程序 plt.plot(x,z) # 一个画布中可以描绘多条线
xticks
仅仅使用以上参数,我们将很难表述一些其他关系模型
可以发现x轴完全模糊,不知其意,因此我们需要对轴刻度进行设置
设置x轴和y轴的刻度
matplotlib. pyplot.xticks(ticks=None,labels=None,**kwargs)
matplotlib. pyplot.yticks(ticks=None,labels=None,**kwargs)
参数:
ticks:此参数是xticx位置的列表。和一个可选参数。如果将一个空列表作为参数传递,则它将删除所有xticks,其显示的刻度数随传递的数组范围进行变化,列表中的元素的数据将被作为索引来设置x轴刻度,例如传递一个range(0,10,2)
表示的是显示10个刻度,但是每隔1个刻度才会显示一次刻度的名称
label:此参数包含放置在给定刻度线位置的标签。它是一个可选参数。
**kwargs:此参数是文本属性,用于控制标签的外观
rotation:旋转角度如:rotation=45
color:颜色如:color=“red”
#每个时间点的销量绘图 times =['2015/6/26','2015/8/1','2015/9/6','2015/10/12','2015/11/17',' 2015/12/23','2016/1/28','2016/3/4', '2016/5/15','2016/6/20', '2016/7/26', '2016/8/31', '2016/10/6', '2016/11/11','2016/12/17'] #随机出销量 sales =np. random. randint(500,2000, size=len(times)) # 支出 expend = np.random.randint(700,3000,size=len(times)) plt.xticks(range(0,len(times)),labels=['%s-'%s for s in times],rotation='45') # 显示全部刻度,并且翻转45度 #绘制图形 plt.plot(times, sales,label='收入') # label用于设置图例说明 plt.plot(times,expend,label='支出') plt.legend(loc='upper left')# 默认会使用每个图形的label值作为图例中的说明 for x,y in zip(times,sales): # zip表示 plt.text(x,y,'%s元'%y) for x,y in zip(times,expend): plt.text(x,y,'%s元'%y)
例如这里,第一个参数传递一个数组,这个数组的长度对应的就是刻度数,labels表示的是要显示的刻度的名称,如果不传递,就使用默认的刻度名称,rotation这个代表的是旋转角度
也可以单独传递一个要显示的刻度名称的数组
show
该方法用于显示所有打开的图形,而在jupyter模式下,默认就会给我们显现图形,因此我们不需要手动的调用,但是如果在cmd的环境下,那么我们就需要手动调用这个方法了,可以发现使用show方法调用出来的图像,有许多操作可以执行,放大缩小保存等,那么如何让我们在jupyter这个环境中也拥有这种效果呢?
Jupyter Notebook %matplotlib notebook魔法命令
%matplotlib notebook
legend
plt.legend(loc)
- loc表示图例显示的位置
什么是图例?
图例是集中于地图一角或者一侧的地图上各种符号和颜色所代表内容与指标的说明,有助于更好的认识地图.
#每个时间点的销量绘图 times =['2015/6/26','2015/8/1','2015/9/6','2015/10/12','2015/11/17',' 2015/12/23','2016/1/28','2016/3/4', '2016/5/15','2016/6/20', '2016/7/26', '2016/8/31', '2016/10/6', '2016/11/11','2016/12/17'] #随机出销量 sales =np. random. randint(500,2000, size=len(times)) # 支出 expend = np.random.randint(700,3000,size=len(times)) plt.xticks(range(0,len(times)),rotation='45') # 显示全部刻度,并且翻转45度 #绘制图形 plt.plot(times, sales,label='收入') # label用于设置图例说明 plt.plot(times,expend,label='支出') plt.legend()# 默认会使用每个图形的label值作为图例中的说明
我们还能对图例所存在的位置进行设置
plt.legend(loc='upper left')# 设置图例位置为左上角
loc代表了图例在整个坐标轴平面中的位置(一般选取’best’这个参数值)
- 第一种:默认是"best",图例自动安家’在一个坐标面内的数据图表最少的位置
- 第二种: loc = 'XXX’分别有0: ‘best’(自动寻找最好的位置)
text
plt. text(x,y,string, fontsize=15, verticalalignment="top", horizontalalignment="right")
- x,y:表示坐标值上的值
- string:表示说明文字
- fontsize:表示字体大小
- verticalalignment: (va)垂直对齐方式,参数:[ ‘center’ i ‘top’ | ‘bottom’ / ‘baseline’]
- horizontalalignment: (ha)水平对齐方式,参数:[ ‘center’ | ‘right’ | ‘left’ ]
当前函数用于设置每个点上显示的数据,首先前两个参数用于指定到某一个具体的点上,然后string参数表示这个点要显示的值
#每个时间点的销量绘图 times =['2015/6/26','2015/8/1','2015/9/6','2015/10/12','2015/11/17',' 2015/12/23','2016/1/28','2016/3/4', '2016/5/15','2016/6/20', '2016/7/26', '2016/8/31', '2016/10/6', '2016/11/11','2016/12/17'] #随机出销量 sales =np. random. randint(500,2000, size=len(times)) # 支出 expend = np.random.randint(700,3000,size=len(times)) plt.xticks(range(0,len(times)),rotation='45') # 显示全部刻度,并且翻转45度 #绘制图形 plt.plot(times, sales,label='收入') # label用于设置图例说明 plt.plot(times,expend,label='支出') plt.legend(loc='upper left')# 默认会使用每个图形的label值作为图例中的说明 for x,y in zip(times,sales): # zip表示 plt.text(x,y,'%s元'%y) # %进行格式化取值 for x,y in zip(times,expend): plt.text(x,y,'%s元'%y)
grid
plt. grid(True,linestyle = " --" ,color = "gray", linewidth = "0.5", axis = 'x')
显示网格
- linestyle:线型
- color:颜色
- linewidth:宽度
- axis: x,y, both,显示x/y两者的格网
x = np.linspace(-np.pi,np.pi,256,endpoint=True) c,s = np.cos(x),np.sin(x) plt.plot(c) plt.plot(s) plt.grid(True,linestyle="-",color='gray',linewidth='0.5',axis='both') # 显示网格 # linestyle:线性 # color:颜色 # linewidth:宽度 # axis:x,y,both,显示x/y两者的网格
gca(get current axes)
当前方法用于获取matplotlib中的坐标轴,也就是上图中对应的四条把cosx和sinx框起来的线.
使用gca可以对这四根线进行各种操作
x = np.linspace(-np.pi,np.pi,256,endpoint=True) c,s = np.cos(x),np.sin(x) # 获取坐标轴对象 axes = plt.gca() #通过坐标轴spines,确定top,bottom,left,right(分别表示上下左右) axes.spines['right'].set_color('none') axes.spines['top'].set_color('none') # axes:0.0-1.0之间的值,整个轴上的比例 axes.spines['left'].set_position(('axes',0.5)) #移动下轴到指定位置 # 'data'表示按数值挪动,其后数字代表挪动到Y轴的刻度值 axes.spines['bottom'].set_position(('data',0.0)) plt.plot(c) plt.plot(s)
图形对象的创建
plt.figure(num=None,figsize=None,dpi=None,facecolor=None,edgecolor=None,frameon=True,**kwargs)
参数说明:
num:图像编号或名称,数字为编号,字符串为名称
figsize:指定figure的宽和高,单位为英寸;
dpi:定绘图对象的分辨率,即每英寸多少个像素,缺省值为72
facecolor:背景颜色
edgecolor:边框颜色
frameon:是否显示边框
在Matplotlib中,面向对象编程的核心思想是创建图形对象(figure object)。通过图形对象来调用其它的方法和属性,这样有助于我们更好地处理多个画布。在这个过程中,pyplot 负责生成图形对象,并通过该对象来添加一个或多个axes对象(即绘图区域)。
Matplotlib-提供了matplotlib.figure图形类模块,它包含了创建图形对象的方法。通过调用pyplot模块中 figure()函数来实例化figure 对象。
x=np.arange(10) y=x plt.figure('f1',figsize=(2,2),dpi=100,facecolor='gray') plt.plot(x,y)