【Python数据分析】Matplotlib数据可视化,看这一篇就够了!
对数据的分析,离不开数据的可视化。
我们都知道数形结合的概念,图形往往可以帮助我们更好地分析数据之间的差异以及它们的趋势,同时数据的可视化基本就是通过图形来实现的。
数据可视化可以按照数据类型进行分类,大致分为以下几种:
1.时空数据可视化
时间和空间是描述事物的必要元素,将时空的信息进行可视化显得格外重要。
对于时间,我们使用线性和周期性来表示时间的可视化;
对于空间,我们合理选择和布局地图上的可视化元素,尽可能呈现更多的信息。
2.层次与网络结构数据可视化
网络数据作为现实世界中最常见的数据类型,可视化显得尤为重要。像层次结构、拓扑结构,都是属于这样的结构。
3.文本和跨媒体数据可视化
对于非结构化的数据,我们想要进行可视化,可以使用引入时间轴、标签云方法等等。
4.多变量数据可视化
对于多变量的高维数据,通常是更贴近现实世界的,那么我们要怎么把高维数据映射到笔记本电脑界面这么一个二维平面上呢?这也是数据可视化的一个重要作用。我们通常用好几个相关联的多视图来表示不同维度之间的关联。
Matplotlib作为Python数据分析中最经典的图形包,对可视化起到了很重要的作用。
首次发表于2007年的Matplotlib,是Python的一个基于NumPy(由此可见Python数据分析真的离不开NumPy)的绘图工具包。它所提供的绘图,实际上是类似于MATLAB(工程级绘图工具)的纯Python第三方库。
Matplotlib的结构主要由以下三个核心部分组成:
由于我们是数据分析,所以我们这里主要介绍它的最常用模块,pyplot
导入惯例:
import matplotlib.pyplot as plt
我们可以把Matplotlib也理解成为一种**“面向对象绘图方式”**,因为它也是基于图片对象(Figure)来进行绘制的。常见绘图方法如下:
函数 | 函数作用 |
---|---|
plt.figure | 创建空白画布,指定画大小 |
figure.add_subplot | 创建并选中子图,可以指定子图行数,列数与选中图片编号,这里的子图行数和列数会直接格式化画布的布局,使得适应行列。 |
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
fig = plt.figure()
# 直接运行是没结果的,我们可以理解这个为初始化,之后我们要创建子图
ax1 = fig.add_subplot(2,2,1)
plt.show()
如图:
也可以这样来无需分步骤创建画布与子图,直接一起创建:
fig,axes = plt.subplots(2,3)
# 无需分步骤创建画布与子图,直接一起创建
我们发现每个子图之间的间距显得格外近,会影响显示,我们使用以下方法来调整间距。
plt.subplots_adjust(wspace = 1,hspace = 1)
这样就好多了。
同时,如果我想要设置它们拥有相同的x轴和y轴,我们就使用sharex和sharey。
fig,axes = plt.subplots(2,3,sharex = True,sharey = True)
可以看出区别。
同样,如果我们把子图之间的间距设为0,两种情形也是不一样的。
plt.subplots_adjust(wspace = 0,hspace = 0)
对比一下:
我们完成了图形的初步绘制之后,就要在里面加东西了。比如属性。
通过以下几个函数进行属性的添加
函数 | 说明 |
---|---|
title | 添加标题,可以指定名称、颜色、位置、字体等等 |
xlabel | X轴名称 |
ylabel | Y轴名称 |
xlim | X轴范围,只能确定一个取值区间 |
ylim | Y轴范围,同上 |
xticks | 指定X轴刻度的数目与取值 |
yticks | 指定Y轴刻度的数目与取值 |
legend | 指定当前图形的图例,可以指定大小标签等等 |
注意,图例的添加必须要在绘制图形之后,也就是设置完属性之后。
data = np.arange(0,5,0.01)
# print(data)
plt.title('joolin`s data')
plt.xlabel('x')
plt.ylabel('y')
plt.xlim(0,1)
plt.ylim(0,1)
plt.xticks([0,0.1,0.5,1.0])
plt.yticks([0,0.1,0.5,1.0])
plt.plot(data,data**2)
plt.plot(data,data**3)
plt.legend(['y=x^2','y=x^3'])
plt.show()
当我们把lim或者ticks更改的时候会出现什么呢?我们来看一下。
data = np.arange(0,5,0.01)
# print(data)
plt.title('joolin`s data')
plt.xlabel('x')
plt.ylabel('y')
# plt.xlim(0,1)
# plt.ylim(0,1)
# plt.xticks([0,0.1,0.5,1.0])
# plt.yticks([0,0.1,0.5,1.0])
plt.plot(data,data**2)
plt.plot(data,data**3)
plt.legend(['y=x^2','y=x^3'])
plt.show()
从这里其实看出,数据与图形还是有所分离的。你在图形中显示出的数据不一定就是数据的整体,说不定有一部分仅仅只是因为图形的限制而没有显现出来。
函数 | 作用 |
---|---|
plt.savefig | 保存绘制的图片,可指定分辨率、背景颜色、文件格式、保存的图片大小范围、 |
plt.show | 显示绘制的图片 |
rc
参数 是 Matplotlib 用于控制全局绘图样式和默认设置的配置选项,rc
是 “runtime configuration” 的缩写。通过设置 rc
参数,可以统一控制图形的颜色、线条样式、字体大小、背景颜色、坐标轴样式等属性,确保绘图风格的一致性。
我们可以通过以下代码查看rc参数,找到当前用户的配置文件目录
print(plt.rcParams) # 注意这里plt是matplotlib软件包
print(plt.matplotlib_fname())
rc的参数有这些:
linewidth、linestyle、marker、markersize等。通过Python编程对其进行配置。
x = np.linspace(0,1,500)
y = np.sin(3*np.pi*x)*np.exp(-4*x)
fig,ax = plt.subplots()
plt.plot(x,y)
plt.fill_between(x,0,y,facecolor = 'green',alpha = 0.3)
同时你也可以指定区域进行填充,不过感觉没啥用
x = np.linspace(0,1,500)
y = np.sin(3*np.pi*x)*np.exp(-4*x)
fig,ax = plt.subplots()
plt.plot(x,y)
plt.fill_between(x[15:300],0,0.4,facecolor = 'green',alpha = 0.3)
或者两条曲线之间填充
x = np.linspace(0,1,500)
y1 = np.sin(3*np.pi*x)*np.exp(-4*x)
y2 = y1 + 0.2
fig,ax = plt.subplots()
plt.plot(x,y1)
plt.plot(x,y2)
plt.fill_between(x,y1,y2,facecolor = 'green',alpha = 0.3)
plt.show()
或者直接用fill填充
x = np.linspace(0,1,500)
y = np.sin(3*np.pi*x)*np.exp(-4*x)
fig,ax = plt.subplots()
ax.fill(x,y)
plt.show()
使用plt.text,在字符串前面加一个’r’即可。
使用plt.text 以及annotate()进行文本注解以及指向型的文本注解。
折线图一种将数据点按照顺序连接起来的图形,也可以看作是将散点图按照X轴坐标顺序连接起来的图形。
主要功能是查看因变量y随着自变量x改变的趋势,最适合用于显示随时间而变化的连续数据。
绘制格式:
plt.plot(* args,** kwargs)
虽然官方文档只包含这两个参数,但是实际可以填入的还有:x和y表示两轴对应的数据、color表示线条的颜色、marker表示点的类型、linestyle表示线条的类型、alpha表示点的透明度。
示例:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
y = sin(x)
z = cos(x)
plt.plot(x,y,color = 'g',marker = '*',linestyle = '--')
plt.plot(x,z)
plt.title(plotex)
plt.legend(['Y','Z'])
plt.show()
散点图又称为散点分布图,是以一个特征为横坐标,另一个特征为纵坐标,用散点坐标来表示两个特征之间关系的图。
绘制格式:
plt.scatter(x,y,s = None,c = None,marker = None,alpha = None)
这里的s指的是 接受数值或者一维数组,指定点的大小,如果是一维数组,则代表每个点的大小
这里的c指的是 接受颜色或者一维数组,指定点的颜色,如果是一维数组,则代表每个点的颜色。
这里的marker和alpha都和上面一样。
示例
x1 = np.arange(1,30)
y1 = np.sin(x1)
plt.scatter(x1,y1,c = 'g')
plt.title('scatterex')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend('x1')
plt.show()
柱状图通常用于较小数据集的分析。
绘制格式:
plt.bar(left,height,width = 0.8,bottom = None,hold = None,data = None)
left表示X轴数据,height表示X轴所代表数据的数量
width指定直方图宽度,bottom指定柱状距离X轴的高度
示例:
x = np.arange(0,10)
y = pd.Series(np.random.randn(10))
plt.bar(x,y)
plt.show()
一般用于表示数据的占比情况
绘制格式:
ply.pie(x,explode = None,labels = None,colors = None,colors = None,autopct = None,...)
参数过多,大家可以去官网参考,这里只介绍主要的几个。
x表示数据
explode表示指定项离圆心为n个半径
labels表示每一项的名称
autopct表示数值显示方式
radius表示饼图的半径,默认为1
示例:
labels= ['apples','pears','banana']
x = [15,30,15]
plt.pie(x,labels = labels,autopct='%1.1f%%')
plt.legend()
plt.show()
也成为盒须图,使用数据中五个统计量(最小值、下四分位数、中位数、上四分位数和最大值)来描述数据,它可以粗略看出数据是否有对成型、分布的分散程度等信息。
绘制格式:
plt.boxplot(x,notch = None,sym = None,vert = None,whis = None,...)
概率图:用来表示变量间概率依赖关系的理论
雷达图:用来显示多变量数据
流向图:多用于地理交通等
Matplotlib提供了table方法用于绘图中的表格制作。
在数据可视化中,表格(Table)是一种重要的辅助元素,能够清晰展示数据细节或补充图表信息。
基本参数
cellText
接受二维列表/数组,rowLabels
和colLabels
设置行列标题。
cellLoc
:文本对齐方式(左/中/右)。 - colWidths
:自定义列宽(如[0.3, 0.1]
)。 - bbox
:通过[x, y, width, height]
调整表格位置和大小。
cellColours
设置单元格颜色,支持二维颜色列表。
rowColours
和colColours
分别设置行列标题颜色。
edges
参数控制边框显示(如'closed'
显示全部边框)。
plt.table(cellText=[weight], colLabels=kinds, rowLabels=['重量(g)'],
loc='right', bbox=[1.2, 0.3, 0.8, 0.2])
Labels`设置行列标题。
cellLoc
:文本对齐方式(左/中/右)。 - colWidths
:自定义列宽(如[0.3, 0.1]
)。 - bbox
:通过[x, y, width, height]
调整表格位置和大小。cellColours
设置单元格颜色,支持二维颜色列表。rowColours
和colColours
分别设置行列标题颜色。edges
参数控制边框显示(如'closed'
显示全部边框)。plt.table(cellText=[weight], colLabels=kinds, rowLabels=['重量(g)'],
loc='right', bbox=[1.2, 0.3, 0.8, 0.2])