写点什么

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

作者:迷彩
  • 2022 年 7 月 10 日
  • 本文字数:4377 字

    阅读完需:约 14 分钟

前言

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


在 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

其他系统可使用:

pip3 list | grep matplotlib

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

Matplotlib 官网:https://matplotlib.org


使用体验

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

初体验

导入库,按需导入

import matplotlib.pyplot as plt

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

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


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

下面我们具体介绍一下:


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

import numpy as npimport pandas as pdimport 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 长这样,就类似一维数组

绘制的图表如下

常用图表绘制

折线图
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()
复制代码



条形图

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

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()为绘制条形图函数


直方图

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

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 是指定直方图显示的类型

散点图
import matplotlib.pyplot as pltx = [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'] = Falseplt.title('散点图')
plt.legend()plt.show()
复制代码

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

"o":表示散点

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

"v":表示三角形

"x":表示符号 x

"d":表示菱形

"*":表示五角星

饼图

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

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

import matplotlib.pyplot as pltScore = [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%%')#将百分比放到各部分
复制代码


图像注释
import numpy as npimport pandas as pdimport 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')) #添加红色箭头指定标注点

子图

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

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()
复制代码

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


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

3D 图表

3D 散点图

from mpl_toolkits.mplot3d import axes3dimport 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()
复制代码



还有很多 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 调用相关函数生成图表,继续深入学习,你就是数据分析小能手...


发布于: 20 小时前阅读数: 22
用户头像

迷彩

关注

我的工作是常年写bug|公众号:编程架构之美 2020.06.18 加入

修bug的菜鸟~公众号:“互联网有啥事”已改名为“编程架构之美”

评论

发布
暂无评论
Python绘制精美可视化数据分析图表(一)-Matplotlib_Python_迷彩_InfoQ写作社区