文章图片
目录
-
- 1. Matplotlib介绍与安装
-
- 1.1 Matplotlib介绍
- 1.2 Matplotlib安装
- 2. Matplotlib绘图
-
- 2.1 创建画布
- 2.2 添加子图
- 2.3 plt.subplots用法
- 3. Matplotlib绘制图形
-
- 3.1 折线图
- 3.2 散点图
- 3.3 条形图
-
- 3.3.1 条形图
- 3.1.2 堆叠条形图
- 3.1.3 分组条形图
- 3.1.4 水平条形图
- 3.4 直方图
- 3.5 扇形图
- 3.6 箱形图
- 3.7 雷达图
1. Matplotlib介绍与安装 1.1 Matplotlib介绍
- 介绍:Matplotlib是一个Python的基础绘图库,它可与Numpy一起使用,代替Matlab使用
- 安装:pip install matplotlib
- 在任何绘图之前,我们需要一个Figure对象,可以理解成我们需要一张画板才能开始绘图;Matplotlib所绘制的图位于图片(figure)对象中,我们可以通过plt.figure生成一个新的图片,
from matplotlib.pyplot as plt# # figsize:传入元组,英寸单位的宽和高
# dpi:图像的分辨率
fig = plt.figure(figsize=(10,10),dpi=60)
print(fig)
# 展示图片
fig.show()
Figure(640x480)
文章图片
2.2 添加子图
- 可以通过plt.subplot创建一个或多个子图
# 添加一个子图
plt.subplot(221)
plt.show()
【Python数据分析(一)(Matplotlib使用)】
文章图片
# 创建多个子图
ax1 = plt.subplot(2,2,1) # 2*2,最多4个图形,index=1,选择了第一个
ax2 = plt.subplot(2,2,2)
ax3 = plt.subplot(2,2,3)
ax4 = plt.subplot(2,2,4)plt.show()
文章图片
- 索引超出范围报错
ax5 = plt.subplot(2,2,5)
plt.show()
ValueError: num must be 1 <= num <= 4, not 5
2.3 plt.subplots用法
- 除上述方法外,Matplotlib包含一个快捷方法plt.subplots创建一个新的图片,返回包含了以生成子图对象的Numpy数组
- plt.subplots(nrows, ncols, sharex, sharey)
- nrows:子图的行数
- ncols:组图的列数
- sharex:所有子图使用相同的x轴刻度
- sharey:所有子图使用相同的y轴刻度
# 2*2,nrows子图的行数,ncols子图的列数,sharex,sharey共享刻度
plt.subplots(2,2,sharex=True,sharey=True)
plt.show()
文章图片
- 返回值:return fig(画布), axs(子图)
- 子图绘制散点图
fig, axs = plt.subplots(2,2,sharex=True,sharey=True)# 选中第一张图
axs[0,0].scatter(range(5))
# 选中第二张图
axs[0,1].scatter(range(5),list(range(5))[::-1])
plt.show()
文章图片
- 调整子图的间距
plt.subplots_adjust(wspace=0,hspace=0)
plt.show()
文章图片
3. Matplotlib绘制图形 matplotlib能够绘制折线图,散点图,条形图,直方图,饼图等等
3.1 折线图
- 介绍:折线图以折线的上升或下降来表示统计数量的增减变化的统计图
- 特点:能够显示数据的变化趋势,反应事物的变化情况
- 折线图绘制:可以通过plot()函数来绘制
- 语法:plt.plot(x, y)
- 实例
from matplotlib import pyplot as pltx = [1,4,7,8,9]
y = [5,6,3,5,6]plt.plot(x,y)
plt.show()
文章图片
- plt.plot()函数除了传入制图数据,还可以进行其他设置
- color:设置线的颜色
- linestyle:设置线的样式
- marker:标记样式
- 实例
plt.plot(x,y,color='r',linestyle='--',marker='4')
plt.show()
文章图片
- 实例
# 假设一天中每隔两个小时的气温分别是[15,13,14.5,17,20,25,26,26,27,22,18,15],绘制图形
from matplotlib import pyplot as plt# 每隔两个小时:2,4,6,8....24
x = list(range(2,26,2))
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]plt.plot(x,y)
plt.show()
文章图片
- 图形组成:实际上图形组成除了x,y轴,还有其他很多组建,下图所示
文章图片
方法 | 描述 |
---|---|
plt.figure(figsize=None,dpi=None) | 生成新的图片,figsieze:图片大小,dpi:透明度 |
plt.savefig(fname) | 保存图片 |
plt.xticks(ticks=None) | 设置x轴刻度的值 |
plt.yticks(ticks=None) | 设置y轴刻度的值 |
plt.xlable(xlable) | 设置x轴标签 |
plt.ylable(ylable) | 设置y轴标签 |
plt.title() | 设置图片标题 |
plt.grid() | 根据x轴和y轴的数值展示轴网格 |
- 实例
from matplotlib import pyplot as plt# 每隔两个小时:2,4,6,8....24
x = list(range(2,26,2))
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]# 设置画布大小
plt.figure(figsize=(14,8))# 设置x轴刻度:以0h,0.5h,1h,1.5h....23.5h显示
# ticks:刻度
# lables:刻度标签
# rotation:旋转角度
x_t = [i/2 for i in range(0,48)]
x_l = ['{}h'.format(i/2) for i in range(0,48)]
plt.xticks(x_t,x_l,rotation=45)# 设置y轴刻度:最大值,最小值
y_t = range(min(y),max(y))
plt.yticks(y_t)# 添加x轴标签
plt.xlable('time')# 添加y轴标签
plt.ylable('temperature')# 添加标题
plt.title('temperature change')# 添加网格
plt.grid()# 绘制图形
plt.plot(x,y)# 保存图片:要在show之前保存,否则就是空白图
plt.savefig('mat.png')# 展示图片
plt.show()
文章图片
- 中文显示:当我们需要设置轴标签、标题等,通常会使用到中文,但是matplotlib默认不显示中文,例如:
# 如果列表a表示10点到12点的每一分钟的气温,如何绘制折线图观察每分钟气温的变化情况
from matplotlib import pyplot as plt
import randomx = range(0,120)
# 生成120个随机整数
y = [random.randint(30,38) for i in range(120)]# 刻度:0,10,20,30....110
x_t = range(0,120,10)
# 显示x刻度标签:十点0分,十点10分....十一点0分,十一点10分....十一点50分
x_l = ['十点{}分'.format(i) for i in range(0,60,10)]
x_l += ['十一点{}分'.format(i) for i in range(0,60,10)]plt.xticks(x_l,x_t,rotation=45)
plt.plot(x,y)
plt.show()
文章图片
- 解决方法:
- 方法一:
import matplotlibfont = {
'family':'Arial Unicode MS',
'weight':'bold',
'size':12
}
matplotlib.rc("font",**font)
- 方法二:
import matplotlib.pyplot as plt# plt.rcParams['font.family'] = 'Arial Unicode MS'
plt.rcParams['font.sans-serif'] = 'Arial Unicode MS'
# 解决坐标轴负数的负号显示问题
plt.rcParams['axes.unicode_minus'] = False
文章图片
- 方法三:局部设置方式
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
x = [1,2,3,4]
y = [3,2,1,3]plt.plot(x,y)
plt.xlabel("x轴标签",fontproperties=font)
plt.show()
- 以下代码可以查看matplotlib支持的字体文件
from matplotlib import font_managera = sorted([f.name for f in font_manager.fontManager.ttflist])
for i in a:
print(i)
- 添加图例:plt.legend()
'''
假设大家在30岁的时候,根据自己的实际情况,统计出来了你和同桌从11岁到30岁每年交的男女朋友的数量如列表a和b,请绘制出该数据的折线图,以便分析自己和同桌每年交男女朋友的数量走势
a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
b = [1,0,3,1,2,2,2,3,1,1,1,1,1,2,1,1,2,3,2,2]
要求:
? y轴表示个数
? x轴表示岁数,比如11岁,12岁
'''
from matplotlib import pyplot as plt# 显示中文
plt.rcParams['font.sans-serif'] = 'Arial Unicode MS'# 构建x,y
my_y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
my_cls_y = [1,0,3,1,2,2,2,3,1,1,1,1,1,2,1,1,2,3,2,2]
x = range(11,31)# x刻度、标签
x_t = [i for i in range(11,31)]
x_l = ['{}岁'.format(i) for i in range(11,31)]
plt.xticks(x_t,x_l,ratation=45)# 绘图
plt.plot(x,my_y,label='自己')
plt.plot(x,my_cls_y,label='同桌')# 添加图例
# 1、plt.plot()添加label属性
# 2、plt.legend()局部指定字体,要使用prop
plt.legend()# 展示图片
plt.show()
文章图片
- 添加数据标签:plt.annotate()
- 参数:
- text:注释的文本
- xy:需要注释的点的坐标
- xttext:注释文本的坐标
- arrowprops:箭头的样式属性,参数类型为字典
1、wedth:箭身的宽度
2、facecolor:箭头的颜色
3、headlength:箭头的头的长度
4、headwidth:箭头的宽度
from matplotlib import pyplot as plt
import randomx = range(10)
y = [random.randint(10,30) for i in range(10)]plt.plot(x,y,marker='o')# 数据标签
plt.annotate('28',xy=(0,28),xytext=(-0.3,0),arrowsprops={'width':2})plt.show()
文章图片
# arrowsprops参数使用
from matplotlib import pyplot as plt
import randomx = range(10)
y = [random.randint(10,30) for i in range(10)]plt.plot(x,y,marker='o')# 数据标签
plt.annotate('This is a zhushi',xy=(0,18),xytext=(2,28),arrowsprops={'facecolor':'r','headlength':30,'headwidth':30,'width':30})plt.show()
文章图片
# 实现:将每个点都使用上数据标签
from matplotlib import pyplot as plt
import randomx = range(10)
y = [random.randint(10,30) for i in range(10)]plt.plot(x,y,marker='o')# 数据标签
for xy in zip(x,y):
plt.annotate(xy, xy=xy, xytext=xy, arrowprops={'width':2,'facecolor':'y'})plt.show()
文章图片
3.2 散点图
- 介绍:散点图用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式
- 特点:判断变量之间是否存在数量关联趋势,表示离群点(分布规律)
- 散点图绘制:通过scatter()函数绘制
- 语法:plt.scatter(x,y)
- 实例
'''
假设通过爬虫你获取到了长沙2019年4,10月份每天白天的最高气温(分别位于列表a,b),那么此时如何寻找出气温和随时间变化的某种规律
a = [11,17,16,11,12,11,12,13,10,14,8,13,12,15,14,17,18,21,16,17,30,14,15,15,15,19,21,22,22,22,23]
b = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,15,10,11,13,12,13,6]
'''
from matplotlib import pyplot as plty_4 = [11,17,16,11,12,11,12,13,10,14,8,13,12,15,14,17,18,21,16,17,30,14,15,15,15,19,21,22,22,22,23]
y_10 = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,15,10,11,13,12,13,6]# 中文显示
plt.rcParams['font.sans-serif'] = 'Arial Unicode MS'# 4,10月份的分布分开
x_4 = range(1,32)
x_10 = range(51,82)# 绘制散点图
plt.scatter(x_4,y_4)
plt.scatter(x_10,y_10)# 刻度:四月1号....四月31号 十月1号....十月31号
x_t = list(x_4) + list(x_10)
x_l = ['四月{}号'.format(i) for i in range(x_4)]
x_l += ['十月{}号'.format(i) for i in range(x_10)]
plt.xticks(x_t[::4], x_l[::4], rotation=45)# 展示图片
plt.show()
文章图片
3.3 条形图
3.3.1 条形图
- 介绍:条形图是用宽度相同的条形的高度或长短来表示数据多少的图形,条形图可以横置或纵置,纵置也称为柱形图
- 特点:
- 能够使人们一眼看出各个数据的大小
- 易于比较数据之间的差别
- 柱形图绘制:通过bar()函数绘制
- 语法:plt.bar(x,height)
- 实例
'''
假设你获取到了2019年内地电影票房前20的电影(列表a)和电影票房数据(列表b),那么如何更加直观的展示该数据
a = ["流浪地球","复仇者联盟4:终局之战","哪吒之魔童降世","疯狂的外星人","飞驰人生","蜘蛛侠:英雄远征","扫毒2天地对决","烈火英雄","大黄蜂","惊奇队长","比悲伤更悲伤的故事","哥斯拉2:怪兽之王","阿丽塔:战斗天使","银河补习班","狮子王","反贪风暴4","熊出没","大侦探皮卡丘","新喜剧之王","使徒行者2:谍影行动","千与千寻"]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23,5.22]单位:亿
'''from matplotlib import pyplot as plt# 构建x,height
a = ["流浪地球","复仇者联盟4:终局之战","哪吒之魔童降世","疯狂的外星人","飞驰人生","蜘蛛侠:英雄远征","扫毒2天地对决","烈火英雄","大黄蜂","惊奇队长","比悲伤更悲伤的故事","哥斯拉2:怪兽之王","阿丽塔:战斗天使","银河补习班","狮子王","反贪风暴4","熊出没","大侦探皮卡丘","新喜剧之王","使徒行者2:谍影行动","千与千寻"]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23,5.22]# 中文显示
plt.rcParams['font.sans-serif'] = 'Arial Unicode MS'# 放大画布
plt.figure(figsize=(14,8))# 设置刻度
plt.xticks(rotation=90)# 绘制柱形图
# width:调整柱子的宽度,默认0.8
# bottom:y的起始值
# align:默认center居中,设置为edge边缘,取决于width的正负值
plt.bar(a,b,width=-0.3,bottom=30,align='edge')plt.show()
3.1.2 堆叠条形图
- 实例
from matplotlib import pyplot as plt# 构建x,height
fruits = ['水果', '梨子', '车厘子']
Q1_sales = [1000, 800, 3000]
Q2_sales = [1200, 700, 2800]# 中文显示
plt.rcParams['font.sans-serif'] = 'Arial Unicode MS'# 绘制条形图
plt.bar(fruits, Q1_sales, bottom=Q2_sales, label='Q1')
plt.bar(fruits, Q2_sales, label='Q2')# 添加图例
plt.legend()# 展示图片
plt.show()
文章图片
3.1.3 分组条形图
- 实例
在这里插入代码片
3.1.4 水平条形图
- 水平条形图绘制:通过barh()函数绘制
- 语法:plt.barh(y,width)
- 实例
from matplotlib import pyplot as plt# 构建y,width
a = ["流浪地球","复仇者联盟4:终局之战","哪吒之魔童降世","疯狂的外星人","飞驰人生","蜘蛛侠:英雄远征","扫毒2天地对决","烈火英雄","大黄蜂","惊奇队长","比悲伤更悲伤的故事","哥斯拉2:怪兽之王","阿丽塔:战斗天使","银河补习班","狮子王","反贪风暴4","熊出没","大侦探皮卡丘","新喜剧之王","使徒行者2:谍影行动","千与千寻"]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23,5.22]# 中文显示
plt.rcParams['font.sans-serif'] = 'Arial Unicode MS'# 绘制水平条形图
plt.barh(a,b)# 显示图片
plt.show()
文章图片
3.4 直方图
- 介绍:直方图是由一系列高度不等的纵向条纹或线段表示数据分布的情况,一般用横轴表示数据范围,纵轴表示分布情况
- 特点:绘制连续性的数据,展示一组或者多组数据的分布情况
- 直方图绘制:通过hist()函数绘制
- 语法:plt.hist(x, bins=None)
- bins为组数:组数=极差/组距
- 实例
'''
练习
某地区连续50年中四月份平均气温数据如下:
temp_li= [6.9,4.1,6.6,5.2,6.4,7.9,8.6,3.0,4.4,6.7,7.1,4.7,9.1,6.8,8.6,5.2,5.8,7.9,5.6,8.8,8.1,5.7,8.4,4.1,6.4,6.2,5.2,6.8,5.6,5.6,6.8,8.2,6.4,4.8,6.9,7.1,9.7,6.4,7.3,6.8,7.1,4.8,5.8,6.5,5.9,7.3,5.5,7.4,6.2,7.7]
根据以上数据,推断该地区四月份平均气温的分布类型
'''from matplotlib import pyplot as plt# 显示中文
plt.rcParams['font.sans-serif'] = 'Arial Unicode MS'temp_li= [6.9,4.1,6.6,5.2,6.4,7.9,8.6,3.0,4.4,6.7,7.1,4.7,9.1,6.8,8.6,5.2,5.8,7.9,5.6,8.8,8.1,5.7,8.4,4.1,6.4,6.2,5.2,6.8,5.6,5.6,6.8,8.2,6.4,4.8,6.9,7.1,9.7,6.4,7.3,6.8,7.1,4.8,5.8,6.5,5.9,7.3,5.5,7.4,6.2,7.7]# 组距
b = 1# bins组数:组数=极差/组距,round:四舍五入
bi = round(max(temp_li)-min(temp_li))//b# 绘制直方图
plt.hist(temp_li, bins=bi, density=True) # bins一定是整数类型,默认为10# 显示标签
plt.xlabel('区间')
plt.ylabel('频数/频率')
plt.title('直方图')# 展示图片
plt.show()
文章图片
3.5 扇形图
- 介绍:扇形图,用整个圆表示总数,用园内各个扇形的大小表示各部分数量占总数的百分数
- 扇形图绘制:通过pie()函数绘制
- 语法:plt.pie(x, explode=None, labels=None)
- x
- explode:设置某几个分块是否有分离饼图
- labels:每块扇形标签
- autopct:百分比数据标签
- shadow:是否显示阴影
- 实例
'''
将以下frac数据绘制扇形图,并且设置其扇形标签为label
frac = [1/50,6/50,11/50,15/50,9/50,6/50,2/50]
label = ['[3,4]','(4,5]','(5,6]','(6,7]','(7,8]','(8,9]','(9,10]']
'''from matplotlib import pyplot as pltfrac = [1/50,6/50,11/50,15/50,9/50,6/50,2/50]
label = ['[3,4]','(4,5]','(5,6]','(6,7]','(7,8]','(8,9]','(9,10]']# 绘制扇形图
# labels:扇形标签
# autopct:百分比数据标签
# explode:设置某几个分块是否要分离饼图,传入为元组
# shadow:是否显示阴影
# textprops:设置字体,传入为字典
explode_li = (0,0.3,0,0,0,0,0.2)
plt.pie(frac, labels=label, autopct='%.2f%%', explode=explode_li, shadow=True, textprops={'size':20})# 展示图片
plt.show()
文章图片
- plt.pie()有3个返回值
- patches:绘制饼图每一块的对象
- texts:文本的列表
- autotexts:百分比的文本列表
- 介绍:箱型图是一种直观简洁的方式去呈现一组数据的分布。广泛用于各个数据分析领域,它能非常简单明了地显示一组数据中5个重要数值,并且还能发现一组数据中的存在的异常值
- 最大值
- 最小值
- 中位数
- 下四分位数(Q1)
- 上四分位数(Q3)
- 箱形图绘制:通过boxplot()函数绘制
- 语法:plt.boxplot()
- 参数:
- x:需要绘制的箱型图的数据
- notch:是否展示置信区间 默认为False
- sym:代表异常点的符号表示,默认为圆点
- vert:是否是垂直的,默认是True
- whis:上下限系数,默认为1.5
- positions:设置每个盒子的位置
- widths:设置每个盒子的宽度
- labels:每个盒子的label
- meanline和showmeans:都为True的时候 会展示平均线
- 实例
from matplotlib import pyplot as plt
import random'''
随机生成100个 1-100的数据
'''
data = https://www.it610.com/article/[random.randint(1,100) for i in range(100)]# 列表添加异常值
data.extend([-100,500])# 绘制箱形图
# sym:异常点的符号表示,默认原点
# widths:每个盒子的宽度
# meanline/showmeans:都为True的时候,会展示平均线
plt.boxplot(data, sym='^', widths=0.2, meanline=True, showmeans=True)# 展示图片
plt.show()
文章图片
3.7 雷达图
- 介绍:雷达图又被叫做蜘蛛网图,适用于显示三个或更多的维度的变量的强弱情况,比如某个企业在哪些业务方面的投入等,都可以使用雷达图方便的表示
- 雷达图绘制:通过polar()函数绘制,在matplotlib.pyplot中,可以通过plt.polar来绘制雷达图,这个方法的参数跟plt.plot非常的类似,只不过是x轴的坐标点应该为弧度(2*PI=360°)
- 实例
from matplotlib import pyplot as plt
import numpy as npquaters = ['Q1','Q2','Q3','Q4']
sales = [40,91,44,90,40]# 弧度 = 2*PI=360°
# 求theta,2*PI
theta = np.linspace(0, np.pi*2, 5) # 创建等差数列# 绘制雷达图
plt.polar(theta, sales)# 设置刻度标签
# plt.xticks(theta,quaters)# 填充
plt.fill(theta, sales)# 展示图片
plt.show()
文章图片