绘制折线图
折线图可以显示随时间变化的连续数据,因此非常适合用于显示在相等时间间隔下数据的趋势。如基础体温曲线图,学生成绩走势图,股票月成交量走势图,月销售统计分析图,微博,公众号,网站访问量统计图等等都可以使用折线图体现。在折线图中,类别数据沿水平轴均匀分布,所有值数据沿垂直轴均匀分布。
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
df1 = pd.read_excel('data.xls') # 导入Excel文件
# 多折线图
x1 = df1['姓名']
y1 = df1['语文']
y2 = df1['数学']
y3 = df1['英语']
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码
plt.rcParams['xtick.direction'] = 'out' # x轴的刻度线向外显示
plt.rcParams['ytick.direction'] = 'in' # y轴的刻度线向内显示
plt.title('语数外成绩大比拼', fontsize='18') # 图表标题
plt.plot(x1, y1, label='语文', color='r', marker='p')
plt.plot(x1, y2, label='数学', color='g', marker='.', mfc='r', ms=8, alpha=0.7)
plt.plot(x1, y3, label='英语', color='b', linestyle='-.', marker='*')
plt.grid(axis='y') # 显示网格关闭y轴
plt.ylabel('分数')
plt.yticks(range(50, 150, 10))
plt.legend(['语文', '数学', '英语']) # 图例
plt.savefig('image.png')
plt.show()
绘制柱形图
柱形图,又称长条图,柱状图,条形图等一种以长方形的长度为变量的统计图表。柱形图用来比较两个或两个以上的数据(不同时间或者不同条件),只有一个变量,通常用于较小的数据集分析。 Matplotlib绘制柱形图主要使用到bar()函数,语法如下:
bar(x,height,width,*,align=‘center’,data=None,**kwargs)
参数说明:
x:表示柱形的x坐标值,x轴数据
height:表示柱形的高度,y轴数据
width:表示柱形的宽度,默认值为0.8,可以指定固定值。
bottom:表示柱形底部的y坐标值。
align:表示柱形的对齐方式,"center"表示柱形刻度线居中对齐,"edge"表示将柱形的左边与刻度线对齐。
tick_label:表示柱形对应的标签。
基本柱形图
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
df = pd.read_excel('books.xlsx')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
x=df['年份']
height=df['销售额']
plt.grid(axis="y", which="major") # 生成虚线网格
#x、y轴标签
plt.xlabel('年份')
plt.ylabel('线上销售额(元)')
#图表标题
plt.title('2013-2019年线上图书销售额分析图')
plt.bar(x,height,width = 0.5,align='center',color = 'b',alpha=0.5,bottom=0.8)
#设置每个柱子的文本标签,format(b,',')格式化销售额为千位分隔符格式
for a,b in zip(x,height):
plt.text(a, b,format(b,','), ha='center', va= 'bottom',fontsize=9,color = 'b',alpha=0.9)
#图例
plt.legend(['销售额'])
plt.show()
多柱形图bar()
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
df = pd.read_excel('books.xlsx',sheet_name='Sheet2')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
x=df['年份']
y1=df['京东']
y2=df['天猫']
y3=df['自营']
width =0.2 #柱子宽度,若显示n个柱子,则width值需小于1/n ,否则柱子会出现重叠
#y轴标签
plt.ylabel('线上销售额(元)')
#图表标题
plt.title('2013-2019年线上图书销售额分析图')
plt.bar(x,y1,width = width,color = 'darkorange')
plt.bar(x+width,y2,width = width,color = 'deepskyblue')
plt.bar(x+2*width,y3,width = width,color = 'g')
#设置每个柱子的文本标签,format(b,',')格式化销售额为千位分隔符格式
for a,b in zip(x,y1):
plt.text(a, b,format(b,','), ha='center', va= 'bottom',fontsize=8)
for a,b in zip(x,y2):
plt.text(a+width, b,format(b,','), ha='center', va= 'bottom',fontsize=8)
for a, b in zip(x, y3):
plt.text(a + 2*width, b, format(b, ','), ha='center', va='bottom', fontsize=8)
plt.legend(['京东','天猫','自营'])#图例
plt.show()
绘制直方图hist()
直方图,又称质量分布图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型,纵轴表示分布情况。直方图是数值数据分布的精确图形表示,是一个连续变量(定量变量)的该概率分布的估计。绘制直方图主要用到hist()函数,语法如下:
hist(x, bins=None, range=None, density=False,weights=None, cumulative=False,
bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None,
log=False, color=None, label=None, stacked=False, *, data=None, **kwargs)
参数说明:
- x: 此参数是数据序列。
- bins: 此参数是可选参数,它包含整数,序列或字符串。
- range: 此参数是可选参数,它是箱子的上下限。
- density: 此参数是可选参数,它包含布尔值。
- weights: 此参数是可选参数,并且是一个权重数组,与x的形状相同。
- bottom: 此参数是每个容器底部基线的位置。
- histtype: 此参数是可选参数,用于绘制直方图的类型。 {‘bar’,‘barstacked’,‘step’,‘stepfilled’}
- align: 此参数是可选参数,它控制如何绘制直方图。 {‘left’,‘mid’,‘right’}
- rwidth: 此参数是可选参数,它是条形图的相对宽度,是箱宽度的一部分
- log: 此参数是可选参数,用于将直方图轴设置为对数刻度
- color: 此参数是一个可选参数,它是一个颜色规格或一系列颜色规格,每个数据集一个。
- label: 此参数是可选参数,它是一个字符串或匹配多个数据集的字符串序列。
- normed: 此参数是可选参数,包含布尔值,而是使用density关键字参数。
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
df = pd.read_excel('grade1.xls')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
x=df['得分']
plt.xlabel('分数')
plt.ylabel('学生数量')
# 显示图标题
plt.title("高一数学成绩分布直方图")
plt.hist(x, bins = [0,25,50,75,100,125,150],facecolor="blue", edgecolor="black", alpha=0.5) #bin从0开始绘制,alpha代表颜色深浅
plt.show()
绘制饼状图
饼状图常用来显示各个部分在整体中所占的比例。例如,在工作中如果遇到需要计算总费用或者金额的各个部分构成比例的情况,一般通过各个部分与总额相除来进行计算,而且这种比例表示方法很抽象,而通过饼形图将直接显示各个组成部分所占比例,一目了然。主要使用到pie()函数,语法如下:
matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None,
pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1,
counterclock=True, wedgeprops=None, textprops=None, center=0, 0,
frame=False, rotatelabels=False, *, normalize=None, data=None)
参数说明:
- x:各个饼块的尺寸。类1维数组结构。
- explode:每个饼块相对于饼圆半径的偏移距离,取值为小数。类1维数组结构。默认值为None。
- labels:每个饼块的标签。字符串列表。默认值为None。
- colors:每个冰块的颜色。类数组结构。颜色会循环使用。 默认值为None,使用当前色彩循环。
- autopct:饼块内标签。None或字符串或可调用对象。默认值为None。如果值为格式字符串,标签将被格式化,如果值为函数,将被直接调用。
- pctdistance:饼块内标签与圆心的距离。浮点数。默认值为0.6,autopct不为None该参数生效。
- shadow:饼图下是否有阴影。布尔值。默认值为False。
- labeldistance:饼块外标签与圆心的距离。浮点值或None。默认值为1.1。如果设置为None,标签不会显示,但是图例可以使用标签。
- startangle:饼块起始角度。浮点数。默认值为0,即从x轴开始。角度逆时针旋转。
- radius:饼图半径。浮点数。默认值为1。
- counterclock:角度是否逆时针旋转。布尔值。默认值为True。
- wedgeprops:饼块属性。字典。默认值为None。具体见matplotlib.patches.Wedge 。
- textprops:文本属性。字典。默认值为None。
- center:饼图中心坐标。(float,float)浮点数二元组。默认值为(0,0)。
- frame:是否绘制子图边框。布尔值。默认为False。
- rotatelabels:饼块外标签是否按饼块角度旋转。布尔值。默认为False。
- normalize:是否归一化。布尔值或None。默认值为None。
- True:完全饼图,对x进行归一化,sum(x)==1。
- False:如果sum(x)<=1,绘制不完全饼图。如果sum(x)>1,抛出ValueError异常。
- None:如果sum(x)>=1,默认值为True。如果sum(x)<1,默认值为False。
注意
- 未来版本(当前版本3.3.3),默认值将改为True。绘制不完全饼图,需要明确传递normalize=False。
- pie()的返回值为三元组。
- patches :matplotlib.patches.Wedge对象序列。类型为列表。
- texts:外标签Text对象列表。类型为列表。
- autotexts:只有autopct属性不为None才会返回值,饼块内标签Text对象列表。类型为列表。
基础饼状图
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
df1 = pd.read_excel('data2.xls')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.figure(figsize=(5,3)) #设置画布大小
labels = df1['地区']
sizes = df1['销量']
#设置饼形图每块的颜色
colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen','pink','gold']
plt.pie(sizes, #绘图数据
labels=labels,#添加区域水平标签
colors=colors,# 设置饼图的自定义填充色
labeldistance=1.02,#设置各扇形标签(图例)与圆心的距离
autopct='%.1f%%',# 设置百分比的格式,这里保留一位小数
startangle=90,# 设置饼图的初始角度
radius = 0.5, # 设置饼图的半径
center = (0.2,0.2), # 设置饼图的原点
textprops = {'fontsize':9, 'color':'k'}, # 设置文本标签的属性值
pctdistance=0.6)# 设置百分比标签与圆心的距离
# 设置x,y轴刻度一致,保证饼图为圆形
plt.axis('equal') #设置x,y轴刻度一致
plt.title('2020年1月各地区销量占比情况分析')
plt.show()
分裂饼状图
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
df1 = pd.read_excel('data2.xls')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.figure(figsize=(5,3)) #设置画布大小
labels = df1['地区']
sizes = df1['销量']
#设置饼形图每块的颜色
colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen','pink','gold']
plt.pie(sizes, #绘图数据
labels=labels,#添加区域水平标签
colors=colors,# 设置饼图的自定义填充色
labeldistance=1.02,#设置各扇形标签(图例)与圆心的距离
autopct='%.2f%%',# 设置百分比的格式,这里保留一位小数
startangle=90,# 设置饼图的初始角度
radius = 0.5, # 设置饼图的半径
center = (0.2,0.2), # 设置饼图的原点
textprops = {'fontsize':9, 'color':'k'}, # 设置文本标签的属性值
pctdistance=0.6,# 设置百分比标签与圆心的距离
# shadow=True, #阴影
explode = (0.1,0,0,0,0,0,0,0,0,0)) #设置分裂饼图,0.1代表分裂的距离
#explode = (0.1,0,0,0,0,0,0,0.1,0.1,0)) #设置多分裂饼图
# 设置x,y轴刻度一致,保证饼图为圆形
plt.axis('equal')
plt.title('2020年1月各地区销量占比情况分析')
plt.show()
立体带阴影饼状图
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
df1 = pd.read_excel('data2.xls')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.figure(figsize=(5,3)) #设置画布大小
labels = df1['地区']
sizes = df1['销量']
#设置饼形图每块的颜色
colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen','pink','gold']
plt.pie(sizes, #绘图数据
labels=labels,#添加区域水平标签
colors=colors,# 设置饼图的自定义填充色
labeldistance=1.02,#设置各扇形标签(图例)与圆心的距离
autopct='%.1f%%',# 设置百分比的格式,这里保留一位小数
startangle=90,# 设置饼图的初始角度
radius = 0.5, # 设置饼图的半径
center = (0.2,0.2), # 设置饼图的原点
textprops = {'fontsize':9, 'color':'k'}, # 设置文本标签的属性值
pctdistance=0.6,# 设置百分比标签与圆心的距离
shadow=True, #阴影
explode = (0.1,0,0,0,0,0,0,0,0,0)) #设置分裂饼图
#explode = (0.1,0,0,0,0,0,0,0.1,0.1,0)) #设置多分裂饼图
# 设置x,y轴刻度一致,保证饼图为圆形
plt.axis('equal')
plt.title('2020年1月各地区销量占比情况分析')
plt.show()
环形图
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
df1 = pd.read_excel('data2.xls')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.figure(figsize=(5,3)) #设置画布大小
labels = df1['地区']
sizes = df1['销量']
#设置饼形图每块的颜色
colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen','pink','gold']
plt.pie(sizes, #绘图数据
labels=labels,#添加区域水平标签
colors=colors,# 设置饼图的自定义填充色
autopct='%.1f%%',# 设置百分比的格式,这里保留一位小数
# radius =1 , # 设置饼图的半径
pctdistance=0.85, #饼块内标签与圆心的距离
startangle = 180, #饼块起始角度
textprops = {'fontsize':9, 'color':'k'}, # 设置文本标签的属性值
wedgeprops = {'width': 0.4, 'edgecolor': 'k'})
plt.title('2020年1月各地区销量占比情况分析')
plt.show()
内嵌环形图
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
plt.rcParams['font.sans-serif']=['SimHei']
df1 = pd.read_excel('data2.xls')
df2=pd.read_excel('data2.xls',sheet_name='2月')
#数据集,x1,x2分别对应外环、内环百分比例
x1=df1['销量']
x2=df2['销量']
#设置饼状图各个区块的颜色
colors = ['red', 'yellow', 'slateblue', 'green','magenta','cyan','darkorange','lawngreen','pink','gold']
#外环
plt.pie(x1,autopct='%.1f%%',radius=1,pctdistance=0.85,colors=colors,wedgeprops=dict(linewidth=2,width=0.3,edgecolor='w'))
#内环
plt.pie(x2,autopct='%.1f%%',radius=0.7,pctdistance=0.7,colors=colors,wedgeprops=dict(linewidth=2,width=0.4,edgecolor='w'))
#图例
legend_text=df1['地区']
plt.legend(legend_text,title='地区',frameon=False,bbox_to_anchor=(0.2,0.5))#设置图例标题、位置、去掉图例边框
plt.axis('equal')#设置坐标轴比例以显示为圆形
plt.title('2020年1月和2月各地区销量占比情况分析')
plt.show()
绘制散点图scatter()
散点图主要用来查看数据的分布情况的分布情况或相关性,一般用在线性回归分析中,查看数据点在坐标系平面上的分布情况。散点图表示因变量随自变量而变化的大致趋势,据此可以选择合适的函数对数据点进行拟合。散点图与折线图类似,也是一个个点构成的。但不同之处在于,散点图的各点之间不会按照前后关系以线条连接起来。matplotlib绘制散点图使用plot()函数和scatter()函数都可以实现。scatter()函数专门用户绘制散点图。scatter()函数的语法如下:
matplotlib.pyplot.scatter(x, y,s=None,marker=None,c=None,cmap=None,norm=None,
vmin=None,vmax=None,alpha=None,linewidths=None,verts=None,edgecolors=None,
*,data=None,**kwargs)
参数说明:
- x, y,就是散点的坐标,数据点的位置
- s=None, 散点的大小,面积
- marker=None, 散点样式,默认值为实心圆,'o'
- c=None, 散点的颜色,默认为‘b’, 也就是blue
- cmap=None, 指的是matplotlib.colors.Colormap,也就是色彩映射表实例或注册的色彩映射表名称,相当于多个调色盘的合集。仅当 c 是浮点数组时才使用 cmap。
- norm=None, 如果 c 是浮点数组,则使用范数 在 0 到 1 的范围内缩放颜色数据 c,以便映射到色彩映射表 cmap。
- vmin=None, vmax=None, 这两个参数与默认规范结合使用,以将颜色数组 c 映射到色彩映射表 cmap。如果为 None,则使用颜色数组的相应最小值和最大值。当给出范数时,不可以使用这两个参数。
- alpha=None, 散点透明度([0, 1]之间的数,0表示完全透明,1则表示完全不透明)
- linewidths=None, 散点的边缘线宽
- edgecolors=None, 散点的边缘颜色
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
aa =r'JDdata.xls'
bb=r'JDcar.xls'
dfaa = pd.DataFrame(pd.read_excel(aa))
dfbb=pd.DataFrame(pd.read_excel(bb))
df1=dfaa[['业务日期','金额']]
df2=dfbb[['投放日期','支出']]
#去除空日期和金额为0的记录
df1=df1[df1['业务日期'].notnull() & df1['金额'] !=0]
df2=df2[df2['投放日期'].notnull() & df2['支出'] !=0]
df1['业务日期'] = pd.to_datetime(df1['业务日期'])
df2['投放日期'] = pd.to_datetime(df2['投放日期'])
dfData = df1.set_index('业务日期',drop=True)
dfCar=df2.set_index('投放日期',drop=True)
# 按月度统计并显示销售金额
dfData_month=dfData.resample('M').sum().to_period('M')
# 按月度统计并显示广告费支出金额
dfCar_month=dfCar.resample('M').sum().to_period('M')
#x为广告费用,y为销售收入
x=pd.DataFrame(dfCar_month['支出'])
y=pd.DataFrame(dfData_month['金额'])
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
plt.title('销售收入与广告费散点图') #图表标题
plt.scatter(x, y, color='red') #真实值散点图
plt.show()
绘制面积图stackplot()
面积图用于体现数量随时间变化的程度,也可用于引起人们对总值趋势的注意。例如,表示随时间而变化的利润的数据可以绘制在面积图中,以强调总利润。
matplotlib绘制面积图主要使用stackplot()函数,语法如下:
matplotlib.pyplot.stackplot(x, *args,data=None,**kwargs)
参数说明:
x:x轴数据 *args:当传入的参数个数未知的时使用
*args。这里指y轴数据可以传入多个y轴。
data:data关键字参数。如果给定一个数据参数,所有位置和关键字参数将被替换。
**kwargs:关键字参数,其他可选参数,如color(颜色)、alpha(透明度)等。
标准面积图
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
df = pd.read_excel('books.xlsx')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
x=df['年份']
y=df['销售额']
#图表标题
plt.title('2013-2019年线上图书销售情况')
plt.stackplot(x, y)
plt.show()
堆叠面积图
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
df = pd.read_excel('books.xlsx',sheet_name='Sheet2')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
x=df['年份']
y1=df['京东']
y2=df['天猫']
y3=df['自营']
#图表标题
plt.title('2013-2019年线上图书销售情况')
plt.stackplot(x, y1,y2,y3,colors=['#6d904f','#fc4f30','#008fd5'])
#图例
plt.legend(['京东','天猫','自营'],loc='upper left')
plt.show()
绘制热力图
热力图是通过密度函数进行可视化用于表示地图中点点密度的热图。它使人们能够独立于缩放因子感知点的密度。热力图可以显示不可点击区域发生的事情。利用热力图可以看数据表里多个特征两两的相似度。例如,以特殊高度高亮的方式显示访客热衷的页面区域和访客所在的地理区域的图示。热力图在网页分析、业务数据分析等其他领域也有较为广泛的应用。
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap #热力图设置颜色
import matplotlib as mpl
mpl.use('TkAgg')
df = pd.read_excel('data1.xls',sheet_name='高二一班')
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
# 提取了df DataFrame对象中的"语文"列到"生物"列之间的数据,并将其转换为Numpy数组,存储在名为X的变量中。这里使用.loc属性来定位指定的列范围。
X = df.loc[:,"语文":"生物"].values #包头包尾
# 提取了df DataFrame对象中的"姓名"列的数据,并将其存储在名为name的变量中。
name=df['姓名']
# 创建自定义的颜色映射
cmap = LinearSegmentedColormap.from_list('mycmap', ['purple', 'pink', 'red'])
# 使用X数组的值创建了一个热力图。热力图是一种可视化方式,用不同的颜色表示不同数值的密度或强度。
plt.imshow(X,cmap)
# 设置x轴刻度标签的位置和对应的标签文本。range(0, 6, 1)表示x轴刻度的位置,即从0到6(不包括6),步长为1。['语文', '数学', '英语', '物理', '化学', '生物']是对应的标签文本,分别对应每个刻度位置上的标签。
plt.xticks(range(0,6,1),['语文','数学','英语','物理','化学','生物'])#设置x轴刻度标签
# 设置y轴刻度标签的位置和对应的标签文本。range(0, 12, 1)表示y轴刻度的位置,即从0到12(不包括12),步长为1。name是之前提取的学生姓名数据,它们将作为y轴刻度标签显示在图表上。
plt.yticks(range(0,12,1),name)#设置y轴刻度标签
# 添加了一个颜色条,用于解释热力图中不同颜色所代表的值。
plt.colorbar() #显示颜色条
plt.title('学生成绩统计热力图')
plt.show()
绘制箱型图boxplot()
箱形图又称箱线图,盒须图或盒式图,它是一种用作显示一组数据分散情况下的资料等统计图。因形状像箱子而得名。箱形图最大的优点就是不受异常值的影响(异常值也称为离群值),可以以一种相对稳定的方式描述数据的离散分布情况,因此在各种领域也经常被使用。另外,箱形图也常用语异常值的识别。matplotlib绘制箱形图主要使用boxplot()函数,语法如下:
boxplot(x, notch=None, sym=None, whis=None, positions=None,
widths=None, patch_artist=None, bootstrap=None, usermedians=None,
conf_intervals=None, meanline=None, showmeans=None, showcaps=None,
showbox=None, showfliers=None, boxprops=None, labels=None,
flierprops=None, medianpropos=None, meanprops=None, capprops=None,
whiskerpropos=None, manage_ticks=True, autorange=False,
zorder=None, *, data=None)
参数说明:
- x:绘制箱型图的数据。
- sym:表示异常值对应的符号,默认为空心圆圈。
- vert:表示是否将箱形图垂直摆放,默认为垂直摆放。
- whis:表示箱形图上下须与上下四分位的距离,默认为1.5倍的四分位差。
- positions:表示箱体的位置。
- widths:表示箱体的宽度,默认为0.5。
- patch_artist:表示是否填充箱体的颜色,默认不填充。
- meanline:是否用横跨箱体的线条标出中位数,默认不使用。
- showcaps:表示是否显示箱体顶部和底部的横线,默认显示。
- showboxs:表示是否显示箱形图的箱体,默认显示。
- showfliers:表示是否显示异常值,默认显示。
- labels:表示箱形图的标签。
- boxpropos:表示控制箱体属性的字典。
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
x1=[1,2,3,5,7,9]
x2=[10,22,13,15,8,19]
x3=[18,31,18,19,14,29]
plt.boxplot([x1,x2,x3])
plt.show()
箱型图组成
下面介绍一下箱形图每部分具体含义以及如何通过箱形图识别异常值。
- 下四分位
指的是数据的25%分位点所对应的值(Q1)。计算分位数可以使用pandas的quantile()函数。例如,Q1 = df['总消费'].quantile(q=0.25)
- 中位数
指的是数据的50%分位点所对应的值(Q2),例如,Q1 = df['总消费'].quantile(q=0.5)
- 上四分位
指的是数据的75%分位点所对应的值(Q3),例如,Q1 = df['总消费'].quantile(q=0.75)
- 上限
上限的计算公式为:Q3+1.5(Q3-Q1)
- 下限
下限的计算公式为:Q1-1.5(Q3-Q1) 其中Q3-Q1表示四分位差,如果使用箱形图识别异常值,其判断标准是,当变量的数据值大于箱形图的上限或者小于箱形图的下限时,就可以将这样的数据判定为异常值。
异常值判断标准
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
import pandas as pd
df=pd.read_excel('tips.xlsx')
plt.boxplot(x = df['总消费'], # 指定绘制箱线图的数据
whis = 1.5, # 指定1.5倍的四分位差
widths = 0.3, #指定箱线图中箱子的宽度为0.3
patch_artist = True, #填充箱子颜色
showmeans = True, #显示均值
boxprops = {'facecolor':'RoyalBlue'}, # 指定箱子的填充色为宝蓝色
flierprops = {'markerfacecolor':'red', 'markeredgecolor':'red', 'markersize':3}, # 指定异常值的填充色、边框色和大小
meanprops = {'marker':'h','markerfacecolor':'black', 'markersize':8},# 指定均值点的标记符号(六边形)、填充色和大小
medianprops = {'linestyle':'--','color':'orange'}, # 指定中位数的标记符号(虚线)和颜色
labels = ['']) # 去除x轴刻度值
# 计算下四分位数和上四分位
Q1 = df['总消费'].quantile(q = 0.25)
Q3 = df['总消费'].quantile(q = 0.75)
# 基于1.5倍的四分位差计算上下限对应的值
low_limit = Q1 - 1.5*(Q3 - Q1)
up_limit = Q3 + 1.5*(Q3 - Q1)
# 查找异常值
val=df['总消费'][(df['总消费'] > up_limit) | (df['总消费'] < low_limit)] #|是或者的意思
print('异常值如下:')
print(val)
plt.show()
绘制3D图表
3D图表有立体感比较美观,看起来也比较多高大上。下面介绍两种3D图表,即三维状形图和三维曲面图。
绘制3D图表,我们仍然使用matplotlib3.4.2,但需要安装mpl_toolkits工具包。使用pip工具进行安装
3D柱形图
# 导入了需要使用的库,包括Matplotlib用于绘图,Axes3D用于创建3D坐标轴,以及numpy用于生成数据。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D
import numpy as np
import pandas as pd
import matplotlib as mpl
mpl.use('TkAgg')
# 创建了一个新的图形窗口,并在该窗口中创建了一个3D坐标轴对象。
fig = plt.figure()
# axes3d = Axes3D(fig)
axes3d = fig.add_axes(Axes3D(fig)) #解决matplotlib绘图时导致版本不对出现空白的问题
# 定义了一个列表zs,其中包含了多个z轴的值。
zs = [1, 5, 10, 15, 20]
# 这个for循环迭代遍历zs列表中的每个值。在每次迭代中,代码生成了x和y数据。
# x是一个0到9的数组,y是一个包含10个随机整数的数组,整数范围为0到29。
# 然后,axes3d.bar函数用于在3D坐标轴上绘制柱状图。
# zs参数指定了柱状图的z轴位置,zdir参数指定了柱状图在x方向上的摆放方式,
# color参数指定了柱状图的颜色。
for z in zs:
x = np.arange(0, 10)
y = np.random.randint(0, 30, size=10)
axes3d.bar(x, y, zs=z, zdir='x', color=['r', 'green', 'yellow', 'c'])
plt.show()
3D曲面图
# 导入了所需的库和模块。matplotlib.pyplot是用于绘图的主要模块,
# numpy用于数值计算,mpl_toolkits.mplot3d提供了创建3D图形所需的工具。
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib as mpl
mpl.use('TkAgg')
# 创建了一个新的图形对象和一个3D坐标轴对象。
# plt.figure()创建一个新的图形窗口,
# Axes3D(fig)创建一个与该图形窗口关联的3D坐标轴对象。
fig = plt.figure()
# ax = Axes3D(fig)
ax = fig.add_axes(Axes3D(fig)) #解决matplotlib绘图时导致版本不对出现空白的问题
# 这三行定义了用于绘制图形的参数。
# delta是x和y值的步长。
# np.arange()函数生成一个从起始值到结束值的数组,步长为delta。
delta = 0.125
# 生成代表X轴数据的列表
x = np.arange(-4.0, 4.0, delta)
# 生成代表Y轴数据的列表
y = np.arange(-3.0, 4.0, delta)
# 对x、y数据执行网格化 使用np.meshgrid()函数创建了一个二维网格,
# 其中x和y值用于生成每个网格点的坐标。
# X和Y是两个二维数组,分别包含了每个网格点的x和y坐标。
X, Y = np.meshgrid(x, y)
# 这几行计算了用于绘制图形的z值。
# Z1和Z2是两个二维数组,分别表示两个函数的z值。
# Z是最终的z值,通过将两个函数的z值相减并乘以2得到。
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
# 计算Z轴数据(高度数据)
Z = (Z1 - Z2) * 2
# 绘制3D图形这行使用ax.plot_surface()函数绘制了3D图形的表面。
# 它使用x、y和z值作为输入,并通过设置rstride和cstride参数来控制网格线的跨度。
# cmap参数设置颜色映射,使用'rainbow'色彩映射。
ax.plot_surface(X, Y, Z,
rstride=1, # rstride(row)指定行的跨度
cstride=1, # cstride(column)指定列的跨度
cmap=plt.get_cmap('rainbow')) # 设置颜色映射
# 设置了z轴的范围,限制了绘图时z值的显示范围。
ax.set_zlim(-2, 2)
plt.show()
绘制多个子图表
matplotlib可以实现在一个图上绘制多个子图表。matplotlib提供了3种方法:一是subplot()函数;二是subplots()函数;三是add_subplot()函数。
subplot()函数
subplot()函数直接指定划分方式和位置,它可以将一个绘图区分为n个子图,每一个subplot()函数只能绘制一个子图。语法如下:
matplotlib.pyplot.subplot(*args,**kwargs)
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
# 创建了一个2行3列的子图网格。subplot()函数的第一个参数指定网格的行数,
# 第二个参数指定列数,第三个参数指定当前子图的索引。
# 在2x3网格中创建第一个子图
plt.subplot(2, 3, 1)
# 在2x3网格中创建第二个子图
plt.subplot(2, 3, 2)
# 在2x3网格中创建第三个子图
plt.subplot(2, 3, 3)
# 在2x3网格中创建第四个子图
plt.subplot(2, 3, 4)
# 在2x3网格中创建第五个子图
plt.subplot(2, 3, 5)
# 在2x3网格中创建第六个子图
plt.subplot(2, 3, 6)
# 显示带有所有子图的图形
plt.show()
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
#第1个子图表-折线图
plt.subplot(2,2,1)
plt.plot([1, 2, 3, 4,5])
#第2个子图表-散点图
plt.subplot(2,2,2)
plt.plot([1, 2, 3, 4,5], [2, 5, 8, 12,18], 'ro')
#第3个子图表-柱形图
plt.subplot(2,1,2)
x=[1,2,3,4,5,6]
height=[10,20,30,40,50,60]
plt.bar(x,height)
plt.show()
subplots()函数
subplots()函数用来画布与子图,语法如下:
matplotlib.pyplot.subplots(nrows=1, ncols=1, sharex=False, sharey=False,
squeeze=True,subplot_kw=None, gridspec_kw=None,**fig_kw)
参数说明:
- nrows, ncols: 这些参数是子图网格的行数/列数。
- sharex, sharey: 这些参数控制x(共享x)或y(共享)轴之间的属性共享。
- squeeze: 此参数是可选参数,它包含布尔值,默认值为True。
- num: 此参数是pyplot.figure关键字,用于设置图形编号或标签。
- subplot_kwd: 此参数是带有关键字的字典,该关键字传递给用于创建每个子图的add_subplot调用。
- gridspec_kw: 此参数是带有关键字的字典,该关键字已传递到GridSpec构造函数,该构造函数用于创建放置子图的网格。
返回值: 此方法返回以下值。
- fig: 此方法返回图形布局。
- ax: 此方法返回axes.Axes对象或Axes对象数组。
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.use('TkAgg')
# 创建一个Figure对象和一个包含2x2个子图的网格。Figure对象代表整个图形窗口,而axes是一个2x2的数组,包含了每个子图的坐标轴对象。
figure,axes=plt.subplots(2,2)
# 第一个子图(左上角)上绘制了一个简单的折线图。传递给plot函数的参数是y值的列表,而x值将自动生成为默认的[0, 1, 2, 3, 4]。
axes[0,0].plot([1, 2, 3, 4,5]) #折线图
# 在第二个子图(右上角)上绘制了一个散点图。传递给plot函数的参数是x值列表和y值列表,而字符串'ro'指定了红色圆圈作为散点的标记样式。
axes[0,1].plot([1, 2, 3, 4,5], [2, 5, 8, 12,18], 'ro')#散点图
# 第三个子图(左下角)上创建了一个柱状图。传递给bar函数的参数分别是x坐标和相应的柱高度。
x=[1,2,3,4,5,6]
height=[10,20,30,40,50,60]
axes[1,0].bar(x,height)
# 第四个子图(右下角)上创建了一个饼图。传递给pie函数的参数是用于各个扇区的数值列表。autopct='%1.1f%%'参数用于在饼图中显示百分比标签,保留一位小数。
x = [2,5,12,70,2,9]
axes[1,1].pie(x,autopct='%1.1f%%')
plt.show()
图表的保存
plt.savefig('image.png')
注意: 保存代码于心在图表预览前 也就是在plt.show()之前