俗话说:“文不如表,表不如图”,如果我们将海量的数据绘制成图,就可以让我们的数据更加直观的呈现,更具说服力。
在“互联网+时代”,90%的信息传到大脑,其实都是通过视觉形式来传过来的,而且可视化信息被人脑接受的速度比文字信息要快6万倍,所以,将海量的数据转换成可视化的图形是我们数据分析师必备技能。
一、Matplotlib是什么
Matplotlib是一个Python 2D绘图库,它可以在各种平台上以各种硬拷贝格式和交互式环境生成出具有出版品质的图形。
Matplotlib试图让简单的事情变得更简单,让无法实现的事情变得可能实现。也是Python中最常用的可视化工具之一,它的功能非常强大,可以通过调用函数轻松方便地绘制数据分析中常见的各种图像,比如折线图、条形图、柱状图、散点图、饼图等。
二、常见的图形种类和意义
折线图:以折线的上升或下降来表示统计数量的增减变化的统计图
特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)
散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)。
柱状图:排列在工作表的列或行中的数据可以绘制到柱状图中。
特点:绘制离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)
直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据范围,纵轴表示分布情况。
特点:绘制连续性的数据展示一组或者多组数据的分布状况(统计)。
饼图:用于表示不同分类的占比情况,通过弧度大小来对比各种分类。
特点:分类数据的占比情况(占比)。
当然,除了这些常用图之外,matplotlib还可以绘制一些其它的图像,那么,这些图究竟是如何绘制的呢?
三、认识Matplotlib图像结构
通常情况下,我们可以将一张Matplotlib图像分成三层结构:
- 第一层是底层的容器层,主要包括Canvas、Figure、Axes;
- 第二层是辅助显示层,主要包括axis、spines、grid、legend、title等;
- 第三层为图像层,即通过plot、scatter等方法绘制的图像。
1. 容器层
容器层主要由Canvas、Figure、Axes组成。
-
Canvas是位于最底层的系统层,在绘图的过程中充当画板的角色,即放置画布(Figure)的工具,用户一般接触不到。
-
Figure是Canvas上方的第一层,也是需要用户来操作的应用层的第一层,在绘图的过程中充当画布的角色,我们可以设置画布的大小和分辨率等。
-
Axes是应用层的第二层,在绘图的过程中相当于画布上的绘图区的角色。一个Figure对象可以包含多个Axes对象,每个Axes都是一个独立的坐标系,绘图过程中的所有图像都是基于坐标系绘制的。
2. 辅助显示层
辅助显示层为Axes(绘图区)内的除了根据数据绘制出的图像以外的内容,主要包括Axes外观(facecolor)、边框线(spines)、坐标轴(axis)、坐标轴名称(axis label)、坐标轴刻度(tick)、坐标轴刻度标签(tick label)、网格线(grid)、图例(legend)、标题(title)等内容。
该层的设置可使图像显示更加直观,更加容易被用户理解,但又不会对图像产生实质的影响。
3. 图像层
图像层指Axes内通过plot、scatter、bar、histogram、pie等函数根据数据绘制出的图像。
4. 小结
根据上面对Matplotlib的结构的拆分了解后,我们可以做出以下总结:
- Canvas(画板)位于最底层,用户一般接触不到
- Figure(画布)建立在Canvas之上
- Axes(绘图区)建立在Figure之上
- 坐标轴(axis)、图例(legend)等辅助显示层以及图像层都是建立在Axes之上
四、折线图初体验
跟Pandas的使用一样,使用matplotlib之前,我们需要将它的模块,因为我们是使用Matplotlib的pyplot模块进行图形绘制,所以我们要导入pyplot模块。
#在使用jupyter notebook时调用matplotlib.pyplot的绘图函数plot()进行绘图的时候,或者生成一个figure画布的时候,需要加上%matplotlib
%matplotlib inline
from matplotlib import pyplot as plt
x = range(1,8)
y = [17, 17, 18, 15, 11, 11, 13]
plt.plot(x,y)
plt.show()
代码含义
- 绘制二维图形需要确定x、y值:图形中点的值(x, y值的个数要相同)
- plt.plot(x,y):根据传过来的x,y值进行绘制折线图
- plt.show():显示绘制的图形
那么,折线的颜色、折点以及宽度该怎么设置呢?
from matplotlib import pyplot as plt
x = range(1,8)
y = [17, 17, 18, 15, 11, 11, 13]
plt.plot(x,y,color='green',alpha=0.5,linestyle='-',linewidth=3,marker='o')
plt.show()
代码含义
- color=‘green’:设置线的颜色
- alpha=0.5:设置线的透明度,让其拥有似漏非漏的感觉
- linestyle=’—’:设置线的样式,- 实线(solid)、-- 短线(dashed)、-. 短点相间线(dashdot)、:虚点线(dotted)
- linewidth=3:设置线的宽度
- marker=‘o’:设置折点的样式,默认是什么都没有,折点有没有其他的样式呢?当然,向下看
设置标题
对一个图形最重要的是内容的绘制,其次就是标题,我们需要让其他人清楚这张图的含义是什么,图中x轴表示什么,y轴表示什么,这个时候我们就需要为图像添加一些标题。
这些标题信息就需要我们在绘制的时候,将标题信息绘制在图片上
from matplotlib import pyplot as plt
x = range(1,8)
y = [14,13,17,15,16,10,20]
plt.plot(x,y,color='green',alpha=0.5,linestyle='-',linewidth=3,marker='o')
plt.xlabel('Time')
plt.ylabel('Temp')
plt.title('Team Changing')
plt.show()
通过以下方法添加标记:
- plt.xlabel(‘Time’),X轴标题
- plt.ylabel(“Temp”),Y轴标题
- plt.title(‘Title’),图片标题
这样就可以清晰明了地看出图片及每个轴的含义。
四、中文显示
相信大家在练习的时候也遇到过这样的问题,使用Matplotlib画的图居然不显示中文。
实际上,matplotlib是支持unicode编码的,中文乱码的主要问题是没有找到合适的中文字体。
如果想要Matplotlib显示中文我们可以使用三种方法:
- 直接修改Matplotlib配置文件matplotlibrc
- 动态修改配置
- 设置自定义字体
我们将讲解第三种方法,因为自定义的字体自由度比较高,同时也方便我们在一个图中使用不同风格的字体。
首先,我们下载了一个字体文件,文件的存储路径为C:\Users\lin-a\Desktop\Python数据分析\经典黑体简.TTF
在给图片设置中文显示之前我们应该先添加下面的代码:
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname=r'C:\Users\lin-a\Desktop\Python数据分析\经典黑体简.TTF')
- from matplotlib import font_manager导入字体管理模块,font_manager.FontProperties()使用这个方法根据我提供的字体文件创建字体对象。
当需要有中文显示的地方,添加字体属性就可以了。
接下来我们通过一个代码来看一下,如何添加中文字体,运行下方代码:
%matplotlib inline
from matplotlib import pyplot as plt
from matplotlib import font_manager
import random
# 创建字体对象
my_font = font_manager.FontProperties(fname=r'C:\Users\lin-a\Desktop\Python数据分析\经典黑体简.TTF',size=18)
# 创建X轴与Y轴数据
x = range(0,120)
y = [random.randint(10,30) for i in range(120)]
# 添加字体属性
plt.ylabel