Python绘制精美可视化数据分析图表(一)-Matplotlib

前言

数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程.这一过程也是质量管理体系的支持过程.在实用中,数据分析可帮助人们作出判断,以便采取适当行动

在DT时代,数据分析是企业做出重要决策的基础,巧妇难为无米之炊,数据就是米,是数据分析基础中的基础,但是没有经过整理的数据,或许杂乱无章,没有任何意义,通过数据分析相关手段处理之后,让数据变得有意义,特别是整理后的数据经过可视化,更加直观,更容易,快速地找到问题所在,更有利于做出正确的决策,不至于在市场经营中处于被动局面.所以数据可视化也是我们数据分析中最重要的工具,也是最重要的一环

在Python有很多绘制图表相关的库,如:matplotlib,Chaco,Cairoplot,PLPlot,Pychart,reportlab,pyecharts等等.这么多库,这也是Python生态这么好的原因之一,拥有足够丰富的库,有很多人戏称:"Python除了不能生孩子啥否能做",哈哈哈~~.目前最火的可视化大屏很多都是基于这些图表库,其中matplotlib就是我们今天的主角.他是是python最著名的绘图库,它可与NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案,它跟matlab一样简单,方便.而且也具有非凡的表现力

准备

安装

pip3 install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

Linux 系统也可以使用 Linux 包管理器来安装:

  • Debian / Ubuntu:

sudo apt-get install python-matplotlib

  • Fedora / Redhat:

sudo yum install python-matplotlib

查看安装版本

安装完后,你可以使用 python -m pip list 命令来查看是否安装了 matplotlib 模块

windows系统:

pip3 list | grep matplotlib

Python绘制精美可视化数据分析图表(一)-Matplotlib

其他系统可使用:

pip3 list | grep matplotlib

我这里是之前安装的,版本是3.2.2.目前最新版本是3.5.2

Python绘制精美可视化数据分析图表(一)-Matplotlib

Matplotlib官网:https://matplotlib.org

使用体验

我们在日常的数据统计中,最常用的就是条形图,直方图,折线图,散点图,饼图.其中在这些图表的基础又衍生更多有利分析的图表,我们今天从基础图表的绘制学习matplotlib的使用.

初体验

导入库,按需导入

import matplotlib.pyplot as plt

绘制1-5的平方图表,函数:f(x) = x^2;

import matplotlib.pyplot as plt
plt.plot([1,2,3,4,5],[1,4,9,16,25])
plt.show()

Python绘制精美可视化数据分析图表(一)-Matplotlib

在上图中我们除了图表,在图表上面还有一个导航菜单

Python绘制精美可视化数据分析图表(一)-Matplotlib

下面我们具体介绍一下:

Python绘制精美可视化数据分析图表(一)-Matplotlib

做数据分析怎么能少得了数据.pandas是我们日常分析的利器之一,它是一个功能强大的Python数据分析模块.如果说数据是米,那他就是锅或者说是盛米的容器.下面使用pandas生成随机数结合matplotlib绘制图表:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.Series(np.random.rand(2000))
data.plot()
plt.show()

这是通过np.random.rand(2000)生成2000个随机数,放到pandas的Series中,然后matplotlib绘制图表

pandas的Series长这样,就类似一维数组

Python绘制精美可视化数据分析图表(一)-Matplotlib

绘制的图表如下

Python绘制精美可视化数据分析图表(一)-Matplotlib

常用图表绘制

折线图

import matplotlib.pyplot as plt
x1 = [1,3,4]
y1 = [3,4,1]
x2 = [1,3,4]
y2 = [4,1,6]
plt.plot(x1,y1,label='Line1')
plt.plot(x2,y2,label='Line2')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.title("折线图")
plt.legend()
plt.show()

Python绘制精美可视化数据分析图表(一)-Matplotlib

条形图

排列在工作表的列或行中的数据可以绘制到条形图中,条形图分为水平和垂直条形图

import matplotlib.pyplot as plt
x1 = [1,3,5,7,9,11]
y1 = [3,4,1,5,7,10]
x2 = [2,4,6,8,10,11]
y2 = [4,1,6,9,2,8]
plt.bar(x1,y1,label='折线1')
plt.bar(x2,y2,label='折线2')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.title("条形图")
plt.legend()
plt.show()

plt.bar()为绘制条形图函数

Python绘制精美可视化数据分析图表(一)-Matplotlib

直方图

直方图和条形图差不多,只是他们表述的内容不同,直方图的目的是为了研究产品质量的分布状况,据此可以判断生产过程是否处在正常状态。

import matplotlib.pyplot as plt
x1 = [1,3,5,7,9,11,34,44,56,7,43,89,56,79,26,37,48,38,89,99,10,54,58,57,25,52,36,97,96,92,28,38,48,67,20,21,23,24,29,88,84,84,63]
y1 = [0,10,20,30,40,50,60,70,80,90,100]
plt.hist(x1,y1,histtype="bar",rwidth=0.5)
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.title("直方图")
plt.legend()
plt.show()

plt.hist(x1,y1,histtype="bar",rwidth=0.5)是绘制直方图关键函数,rwidth用来指定显示每个条的宽度,histtype是指定直方图显示的类型

Python绘制精美可视化数据分析图表(一)-Matplotlib

散点图

import matplotlib.pyplot as plt
x = [1, 3, 5, 7, 9, 11]
y = [4, 6, 5, 8, 10, 3]
plt.scatter(x, y, label="散点", s=25, marker="o")
plt.xlabel('X轴')
plt.ylabel("Y轴")
#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.title('散点图')
plt.legend()
plt.show()

plt.scatter(x, y, label="散点", s=25, marker="o")是绘制散点图的主要函数,s是用于设置显示散点大小,marker为散点在图中的表现形式:

"o":表示散点

",":表示像素(正方形)

"v":表示三角形

"x":表示符号x

"d":表示菱形

"*":表示五角星

Python绘制精美可视化数据分析图表(一)-Matplotlib

饼图

饼图是部分对于整体所占的比例情况

仅排列在工作表的一列或一行中的数据可以绘制到饼图中。饼图显示一个数据系列 (数据系列:在图表中绘制的相关数据点,这些数据源自数据表的行或列。图表中的每个数据系列具有唯一的颜色或图案并且在图表的图例中表示。可以在图表中绘制一个或多个数据系列。饼图只有一个数据系列。)中各项的大小与各项总和的比例。饼图中的数据点 (数据点:在图表中绘制的单个值,这些值由条形、柱形、折线、饼图或圆环图的扇面、圆点和其他被称为数据标记的图形表示。相同颜色的数据标记组成一个数据系列。)显示为整个饼图的百分比。

import matplotlib.pyplot as plt
Score = [93, 89, 68, 96]
Subject = ['数学', '语文', '英语', '综合']
cols = ['c', 'm', 'r', 'b']
plt.pie(
    Score,
    labels=Subject,
    colors=cols,
    startangle=90,
    shadow=False,
    explode=(0.1, 0, 0, 0),
    autopct='%1.1f%%')
#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.title("饼图")
plt.show()

plt.pie()为绘制饼图函数

plt.pie(
    Score, #数据
    labels=Subject,#标签
    colors=cols,#颜色
    startangle=90,#调整整个饼图的数据角度
    shadow=False,#是否带有阴影
    explode=(0.1, 0, 0, 0),#将制定部分拉出,本例是将数学拉出,0为不拉出
    autopct='%1.1f%%')#将百分比放到各部分

Python绘制精美可视化数据分析图表(一)-Matplotlib

图像注释

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.DataFrame(np.random.randn(1000, 2), columns=list("AB"))
print(data.head())
data.plot.scatter(x='A', y='B')
#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.text(2, 2, 'A点')
plt.annotate('标注', xy=(-3,-2), xytext=(-2.5,-2.5), arrowprops=dict(facecolor='red')) #添加红色箭头指定标注点
plt.grid(True)
plt.show()

plt.annotate('标注', xy=(-3,-2), xytext=(-2.5,-2.5), arrowprops=dict(facecolor='red')) #添加红色箭头指定标注点

Python绘制精美可视化数据分析图表(一)-Matplotlib

子图

子图就是输出多种图表,可以理解为分域,每个区域都有自己独立执行的代码用于创建对应区域的图表,离我们平常所见的可视化大屏更近一步了

import matplotlib.pyplot as plt
#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
x = [1, 3, 5, 7, 9, 11, 15, 17]
y = [4, 1, 5, 7, 10, 6, 0, 18]
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 1, 2)
ax1.scatter(x, y)
ax1.set_title('散点图')
ax2.plot(x, y)
ax2.set_title('折线图')
ax3.bar(x, y)
ax3.set_title('条形图')
ax3.set_xlabel('X')
ax3.set_ylabel('Y')
ax3.annotate('first one', xy=(1,1), xytext=(2,2), arrowprops=dict(facecolor='r'))
plt.show()

就是多个图表的组合,在同一个面板展示

Python绘制精美可视化数据分析图表(一)-Matplotlib

上面讲述的是2D图表,matplotlib还可以绘制3D图表如3D散点图:

3D图表

3D散点图

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
fig = plt.figure()
ax1 = fig.add_subplot(1, 1, 1, projection='3d')
x1 = [1,2,3,4,5,6,7,8,9,10]
y1 = [5,6,7,8,2,5,6,3,7,2]
z1= [-1,-2,-6,-3,-2,-7,-3,-3,-7,-2]
x2 = [-1,-3,-5,-7,-9,-11,-12,-15,-16,-17]
y2 = [4,1,5,7,10,5,12,8,9,13]
z2 = [1,2,6,3,2,7,3,3,7,4]
ax1.scatter(x1, y1, z1, color='b', marker='o')
ax1.scatter(x2, y2, z2, color='r', marker='x')
ax1.set_xlabel('x轴')
ax1.set_ylabel('y轴')
ax1.set_zlabel('z轴')
plt.show()

Python绘制精美可视化数据分析图表(一)-Matplotlib

还有很多3D图表绘制功能等你发现~~后面也可能会续写一篇详细讲解matplotlib的3D绘制相关知识!敬请关注!

解决中文显示问题:指定字体

#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
# 用来正常显示负号,解决负号乱码问题
plt.rcParams['axes.unicode_minus'] = False

Mac系统遇到中文乱码解决的方法:

第一步
进入python,找到matplotlib所在路径
>>> import matplotlib
>>> matplotlib.matplotlib_fname()
第二步
编辑 matplotlibrc 文件
(1)找到 #font.family:sans-serif ,将前面的'#'删除
(2)找到 #font.sana-serif: DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
在 "DejaVu Sans" 前面添加 "Arial Unicode MS,"
(3)找到axes.unicode_minus 将其后面的"True" 改为"False"
第三步
将~/.matplotlib目录下的两个文件删除
在命令终端输入:
rm -rf ~/.matplotlib/*
重启python,即可解决中文及"-"(负号)无法正常显示的问题。

总结

绘制数据图表作为数据直观的展示方式,是我们数据分析中不可或缺的工具,也是我们迅速做出决策的基础,学会使用它或许对于我们的工作能起到事半功倍的效果

matplotlib作为封装好的第三图表库,使用简单,方便,基本步骤大致就是:准备数据,整合处理数据,把数据放到matplotlib调用相关函数生成图表,继续深入学习,你就是数据分析小能手...