Matplotlib绘图库

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()

市民下班去向图

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PCGuo999

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值