1.Matplotlib
Matplotlib是绘图库,可以绘制函数图、统计图等。专门用于开发2D/3D图表。在数据挖掘中,其可以将难以理解的大量数据进行可视化,使得结果更加直观。
安装
升级 pip:
python3 -m pip install -U pip
安装 matplotlib 库:(Ubuntu一样)
pip install -U matplotlib
下载完成后可以在Python文件中
import matplotlib print(matplotlib.__version__)
来测试是否安装成功
安装成功时记得仔细看一下结果,有时也会将numpy也安装下来,同样也可以使用import导入numpy进行测试是否安装
2.Matplotlib绘图
(1)流程
①导入matplotlib.pyplot包
import matplotlib.pyplot as plt
②创建画布 – plt.figure(figsize=(20,8))
plt.figure(figsize=(), dpi=)
# figsize:指定图的长宽
# dpi:图像的清晰度
# 返回图像对象
# eg:plt.figure(figsize=(50,50), dpi=100)
③绘制图像(以折线为例) – plt.plot(x, y,ls=,lw=,c=,marker=,markersize=,markeredgecolor=,markerfacecolor=,label=)
-
x:x轴数值
-
y:y轴数值
-
ls=折线风格
linestyle 意义 - 实线 - - 虚线 -. 点划线 : 点虚线 ’ ’ 留空、空格 -
lw=:线条宽度
-
c=:颜色
-
marker=:线条上点的形状
-
markersize=:线条上点的形状
-
markeredgecolor=:折点的边框色
-
markerfacecolor=:点的填充色
-
label=:文本标签
x=range(1,13)
y=[random.uniform(10,20) for i in x]
plt.plot(x, y,ls='-',lw=5,c='red',marker='o',markersize=10,markeredgecolor='white',markerfacecolor='blue')
④显示图像 – plt.show()
plt.show()
(2)基础绘图
①添加自定义x,y刻度
即在绘制图像.plot()
后添加自定义的x,y显示,让其在坐标轴上的显示更加直观
# 构造x轴刻度标签
x_ticks_label=["%d月"%i for i in x]
# 构造y轴刻度
y_ticks = range(10,30)
plt.xticks(x[::2], x_ticks_label[::2])
# 即先用x数字写成对应内容,然后使用第二个参数字符串进行替换;[::2]即对数据从开头到结尾,以2为步长进行分割,则显示出来x轴为:1月、3月、5月、7月、9月、11月
# 若不切片则不用使用[::],直接plt.xticks(x, x_ticks_label)
plt.yticks(y_ticks[::5])
②中文显示
若没有解决中文问题,则输出中文时会显示□
在Python中动态设置matplotlibrc:
# 设置显示中文字体
plt.rcParams["font.sans-serif"] = ["SimHei"]
有时字体更改后会导致坐标轴中的部分字符无法正常显示,此时需要更改axes.unicode_minus参数:
# 设置正常显示符号
plt.rcParams["axes.unicode_minus"] = False
③添加网格
为了更加清晰观察图像对应的值,则可以添加网格为了更加清楚地观察图形对应的值
plt.grid(True, linestyle='--', alpha=0.5)
④添加描述信息
添加x轴、y轴描述信息及标题
plt.xlabel(x轴描述)
plt.ylabel(y轴描述)
plt.title(标题名, fontsize=20)
# fontsize为字体大小
⑤保存图像
将输出的表格图像进行保存到指定位置
# 保存图片到指定路径
plt.savefig("./images/想要保存成的文件名字.png")
注意保存图像不能放在plt.show()后面,因为plt.show()会释放figure资源,使得图像为空
(3)在一个坐标系中绘制多个图像
①多次plot
想要在一个坐标系中绘制多个图像,只用使用多次plot即可。但要注意,每次所作的线需要设置不同的类型进行分开
# 绘制折线图
plt.plot(x, y,label='香蕉')
# 使用多次plot可以画多个折线
plt.plot(x, y, color='red', linestyle='--',label='苹果')
需要注意的是y的取值数量需要相同
比如y1=range(1,5),即有4个数,那么其他的y也必须是4个数
label参数是对该图像设置标签,结合legend使用
②显示图例
如果显示多个图像,还需要通过plt.legend()
将图例显示出来,即显示每个图像所代表的意义。
plt.legend(loc=1,labels=['苹果', '香蕉','梨'])
- loc为图例在整个坐标轴平面中的位置(一般选取’best’这个参数值)
- labels是对每个图像进行说明,其顺序按照plt.plot()执行顺序
- 也可以在legend中不设置labels,而是在绘制图像plu.plot(x,y,label=标签名)中进行设置
图例位置 | Location Code |
---|---|
‘best’ | 0 |
‘upper right’ | 1 |
‘upper left’ | 2 |
‘lower left’ | 3 |
‘lower right’ | 4 |
‘right’ | 5 |
‘center left’ | 6 |
‘center right’ | 7 |
‘lower center’ | 8 |
‘upper center’ | 9 |
‘center’ | 10 |
(4)多个坐标系显示
如果想要在一个图片中显示多个坐标系,则可以使用subplots函数实现
fig,axes=plot.subplots(nrows=1, ncols=1, figsize=(20, 20), dpi=100)
nrows 与 ncols 表示要划分几行几列的子区域(nrows*nclos表示子图数量)
# 添加数据
x=range(1,13)
y=[random.randint(10,20) for i in x]
# 1.在创建画布时不再使用plt.figure(figsize=(20, 20), dpi=100),而是使用subplots函数
# eg:创建一个带有多个axes(坐标系/绘图区)的图
fig,axes=plt.subplots(nrows=1, ncols=2, figsize=(20, 20), dpi=100)
# 2.绘制图像时也不是使用plt.plot(x, y, label=标签名)
axes[0].plot(x, y,label='香蕉')
axes[1].plot(x, y, color='red', linestyle='--',label='苹果')
# 3.添加x,y轴刻度不变
x_ticks_label = ["%d月"%i for i in x]
y_ticks = range(40)
# 4.刻度显示不使用plt.xticks()、plt.yticks()
axes[0].set_xticks(x[::5])
axes[0].set_yticks(y_ticks[::5])
axes[0].set_xticklabels(x_ticks_label[::5])
axes[1].set_xticks(x[::5])
axes[1].set_yticks(y_ticks[::5])
axes[1].set_xticklabels(x_ticks_label[::5])
# 5.添加网格不使用plt.grid()
axes[0].grid(True, linestyle="--", alpha=0.5)
axes[1].grid(True, linestyle="--", alpha=0.5)
# 6.添加描述信息不使用plt.xlabel()、plt.ylabel()、plt.title()
axes[0].set_xlabel("月份")
axes[0].set_ylabel("价格")
axes[0].set_title("苹果价格变化", fontsize=20)
axes[1].set_xlabel("月份")
axes[1].set_ylabel("价格")
axes[1].set_title("香蕉苹果价格变化", fontsize=20)
# 7.图像保存不变
plt.savefig("./test.png")
# 8.添加图例不使用plt.legend(loc=0)
axes[0].legend(loc=0)
axes[1].legend(loc=0)
# 9.图像显示不变
plt.show()
注意:plt.函数名() 相当于面向过程的画图方法,axes.set_方法名()相当于面向对象的画图方法
(5)常见图形
折线图、散点图、柱状图、直方图、饼图。
①折线图—plt.plot—(具体参数看前面2.(1)③)
显示数据变化趋势
import matplotlib.pyplot as plt
import random
# 设置显示中文字体
plt.rcParams["font.sans-serif"] = ["SimHei"]
# 设置正常显示符号
plt.rcParams["axes.unicode_minus"] = False
# 创建画布
plt.figure(figsize=(20,5), dpi=100)
# 读取数据
x=np.array(range(1,13))
y=np.array([random.randint(1,100) for i in x])
# 绘制图像
plt.plot(x, y,ls='-',lw=5,c='red',marker='o',markersize=10,markeredgecolor='white',markerfacecolor='b')
# 添加x,y刻度
x_ticks_label=("%d月"%i for i in x)
y_ticks=range(0,101,10)
y_ticks_label=("%d万"%i for i in y_ticks)
plt.xticks(x,x_ticks_label)
plt.yticks(y_ticks,y_ticks_label)
# 添加描述信息
plt.xlabel("月份")
plt.ylabel("人数")
plt.title("一年人数变化表",fontsize=20)
# 添加网格
plt.grid(True,linestyle='--',alpha=0.5)
# 保存图像
plt.savefig('./images/折线.png')
plt.show()
②散点图—plt.scatter(x, y, s, c, marker, alpha, linewidths, edgecolors)
- s:散点大小
- c:散点颜色
- marker:散点图形状
- alpha:散点透明度
- linewidths:三点边界线的宽度
- edgecolors:设置散点边界线颜色
显示数据之间分布规律
import matplotlib.pyplot as plt
import random
# 设置显示中文字体
plt.rcParams["font.sans-serif"] = ["SimHei"]
# 设置正常显示符号
plt.rcParams["axes.unicode_minus"] = False
# 创建画布
plt.figure(figsize=(5,5), dpi=100)
# 读取数据
x=np.array(range(1,13))
y=np.array([random.randint(1,100) for i in x])
# 绘制图像
plt.scatter(x,y,s=20,c='b',marker='o',alpha=0.7, linewidths=1, edgecolors='r')
# 添加x,y刻度
x_ticks_label=("%d月"%i for i in x)
y_ticks=range(0,101,10)
y_ticks_label=("%d万"%i for i in y_ticks)
plt.xticks(x,x_ticks_label)
plt.yticks(y_ticks,y_ticks_label)
# 添加描述信息
plt.xlabel("月份")
plt.ylabel("人数")
plt.title("一年人数变化表",fontsize=20)
# 添加网格
plt.grid(True,linestyle='--',alpha=0.5)
# 保存图像
plt.savefig('./images/一年人数变化表_scatter.png')
plt.show()
③柱状图—bar(x, height, width, bottom, align, **kwargs)
显示各个数据的大小,进行统计或比较数据之间的差别
- height:y值
- width : 柱状图的宽度
- color:选择柱状图的颜色
- bottom:柱状图与x轴距离
- align : 每个柱状图的位置对齐方式{‘center’, ‘edge’}默认为 ‘center’
import matplotlib.pyplot as plt
import random
# 设置显示中文字体
plt.rcParams["font.sans-serif"] = ["SimHei"]
# 设置正常显示符号
plt.rcParams["axes.unicode_minus"] = False
# 创建画布
plt.figure(figsize=(20,5), dpi=100)
# 读取数据
x=np.array(range(1,13))
y=np.array([random.randint(1,100) for i in x])
# 绘制图像
plt.bar(x,y,color='b',width=0.5,align='center')
# 添加x,y刻度
x_ticks_label=("%d月"%i for i in x)
y_ticks=range(0,101,10)
y_ticks_label=("%d万"%i for i in y_ticks)
plt.xticks(x,x_ticks_label)
plt.yticks(y_ticks,y_ticks_label)
# 添加描述信息
plt.xlabel("月份")
plt.ylabel("人数")
plt.title("一年人数变化表",fontsize=20)
# 添加网格
plt.grid(True,linestyle='--',alpha=0.5)
# 保存图像
plt.savefig('./images/一年人数变化表_.png')
plt.show()
④直方图—plot.hist(x, bins, range, cumulative, bottom, align, rwidth, color,edgecolor, label)
显示数据分布状况,即该数值在数据中出现的数量
- x : 需要传递的数据,是数组
- bins : 组间距
- range:上下界
- cumulative:是否计算累计频率
- bottom:为直方图的每个条形添加基准线,默认为0
- align:对齐方式:‘left’, ‘mid’, ‘right’
- rwidth:条形的宽度
- color:填充色
- edgecolor:设置条形边框颜色
- label:设置直方图标签
import matplotlib.pyplot as plt
import random
x=range(0,20)
y=[1,2,3,1,1,5,5,9,9,9,9,7]
# 其中1出现3次,2出现1次,3出现1次,5出现2次,7出现1次,9出现4次
plt.figure(figsize=(15,15))
nums,bins,patches = plt.hist(y,bins=20,edgecolor='r',color='b')
⑤饼图—plt.pie(x, explode,labels=,colors=,autopct=,pctdistance,labeldistance,shadow,startangle,radius,wedgeprops,textprops,center)
显示数据不同分类的占比
-
x:浮点型数组,表示每个扇形的面积
-
explode:标注部分扇面
为了强调某一个扇形,我们会让这个扇形脱离整个圆形,此时设置explode=[0,1,0],1表示会分离扇形
-
labels:每部分名称
-
colors=:每部分的颜色
-
autopct:百分比
-
pctdistance:百分比标签与圆心距离
-
labeldistance:标签与圆心距离
-
shadow:是否添加饼图阴影效果
-
startangle:设置饼图的初始摆放角度
-
radius:设置饼图半径大小
-
wedgeprops:设置饼图内外边界的属性
-
textprops:设置饼图中文本属性
-
center:设置中心位置
若给出的x数组值为小数,则可以设置
%1.2f%%
,并且会自动转为百分比若给出的x数组值为整数,则可以设置
%d%%
import matplotlib.pyplot as plt
import numpy as np
import random
# 设置显示中文字体
plt.rcParams["font.sans-serif"] = ["SimHei"]
# 设置正常显示符号
plt.rcParams["axes.unicode_minus"] = False
# 读取数据
x=np.array([0.55,0.15,0.3])
# x = np.array([35, 25, 40])
# 创建画布
plt.figure(figsize=(5,5), dpi=100)
# 绘制图像
plt.pie(x,labels=['跑步','逛街','看电影'],colors=['r','b','g'],autopct='%1.2f%%',pctdistance=0.5,labeldistance=1.1,shadow=True,)
# plt.pie(x,labels=['跑步','逛街','看电影'],autopct='%d%%',colors=['r','b','g'])
# 添加x和y轴刻度
plt.title("市民下班去向图",fontsize=20)
# 保存图像
plt.savefig("./images/市民下班去向图.png")
# 9.图像显示不变
plt.show()