【学习笔记】python数据可视化之matplotlib实践第三章

绘制统计图形

(1)堆积图

1.堆积柱状图:在bar()函数中的参数bottom进行取值

仔细观察以下代码堆积柱状图就是使用了两个bar函数,在第二个bar函数中增加了bottom参数,同时删除了tick_label参数,需要注意的是两个bar函数中的颜色设置尽可能区分度大


import matplotlib.pyplot as plt
import matplotlib as mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

x = [1,2,3,4,5]
y1 = [6,10,4,5,1]
y2 = [2,6,3,8,5]

plt.bar(x,y1,align = 'center',color = '#66c2a5',tick_label = ['A','B','C','D','E'],label = '班级A')
plt.bar(x,y2,align = 'center',color = '#8da0cb',bottom = y1,label = '班级B')

plt.xlabel('测试难度')
plt.ylabel('试卷份数')
plt.legend()

plt.show()

运行结果: 

2.堆积条形图:与堆积柱状图十分类似。需要变化的仅有两个部分:1.将bar函数变成barh函数  2.将bar函数中的参数bottom变成barh函数中的left参数

import matplotlib.pyplot as plt
import matplotlib as mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

x = [1,2,3,4,5]
y1 = [6,10,4,5,1]
y2 = [2,6,3,8,5]

plt.barh(x,y1,align = 'center',color = '#66c2a5',tick_label = ['A','B','C','D','E'],label = '班级A')
plt.barh(x,y2,align = 'center',color = '#8da0cb',left = y1,label = '班级B')

plt.xlabel('测试难度')
plt.ylabel('试卷份数')
plt.legend()

plt.show()

运行结果: 

3.堆积直方图:用来比较定量数据的分布差异和分布特征

观察以下代码,仅仅增加一些数据和设置stacked参数就可以达到有直方图变为堆积直方图的目的


import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np

mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

x1 = np.random.randint(0,100,100)
x2 = np.random.randint(0,100,100)
x = [x1,x2]
colors = ['#8dd3c7','#bebada']
labels = ['班级A','班级B']

bins = range(0,101,10)

plt.hist(x,bins = bins,color = colors,histtype='bar',rwidth = 1.0,stacked= True,label = labels)

plt.xlabel('测试分数')
plt.ylabel('学生人数')
plt.title('不同班级的测试成绩的直方图')

plt.legend(loc = 'upper left')

plt.show()

运行结果: 

特别地,如果我们把stacked参数去掉,就可以得到并排放置的直方图,这里不在展示代码,仅展示运行结果

4.直方图和柱状图的区别

1.直方图是描述连续型数据的分布,柱状图是描述离散型数据的分布,一个描述定量数据,一个描述定性数据

2.从图形展示效果上,柱状图柱体之间有空隙,直方图的柱体之间没有空隙

5.堆积折线图:将若干条折线放在同一个坐标轴上,以每条折线下部和下方折线作为填充边界,用一种颜色填充代表此条折线的数值区域,每个填充区域相互堆积但不会相互覆盖。

stackplot()函数相关参数介绍:plt.stackplot(x,y,y1,y2,labels = labels,colors = colors)

x

数据序列的x轴坐标

y,y1,y2分别表示第一、二、三数据序列的y值
labels图例标签
colors数据序列的填充颜色

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(1,6,1)
y = [0,4,3,5,6]
y1 = [1,3,4,2,7]
y2 = [3,4,1,6,3]

labels = ['blueplanet','brownplanet','greenplanet']
colors = ['#8da0cb','#fc8d62','#66c2a5']

plt.stackplot(x,y,y1,y2,labels = labels,colors = colors)

plt.legend(loc = 'upper left')

plt.show()

运行结果: 

(2)分块图:对比多数据的分布差异

1.多数据并列柱状图

观察以下代码,绘制多数据并列柱状图就是使用两个bar函数,同时第二个bar函数的x位置应该进行调整

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

x = np.arange(5)
y = [6,10,4,5,1]
y1 = [2,6,3,8,5]

bar_width = 0.35
tick_label = ['A','B','C','D','E']

plt.bar(x,y,bar_width,color = 'c',align = 'center',label = '班级A',alpha = 0.5)
plt.bar(x+bar_width,y1,bar_width,color = 'b',align = 'center',label = '班级B',alpha = 0.5)

plt.xlabel('测试难度')
plt.ylabel('试卷份数')
plt.xticks(x+bar_width/2,tick_label)

plt.legend()

plt.show()

运行结果: 

2.多数据平行条形图

与绘制多数据并列柱状图非常相似,下列代码只是将bar变成barh即可得到多数据平行条形图

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

x = np.arange(5)
y = [6,10,4,5,1]
y1 = [2,6,3,8,5]

bar_width = 0.35
tick_label = ['A','B','C','D','E']

plt.barh(x,y,bar_width,color = 'c',align = 'center',label = '班级A',alpha = 0.5)
plt.barh(x+bar_width,y1,bar_width,color = 'b',align = 'center',label = '班级B',alpha = 0.5)

plt.xlabel('测试难度')
plt.ylabel('试卷份数')
plt.xticks(x+bar_width/2,tick_label)

plt.legend()

plt.show()

运行结果: 

(3)间断条形图:用来可视化定性数据的相同指标在时间维度上的指标值的变化情况,实现定性数据的相同数据的相同指标的变化情况的有效直观比较

使用plt.broken_barh()函数

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

plt.broken_barh([(30,100),(180,50),(260,70)],(20,8),facecolors = '#1f78b4')
#[(60,90),(190,20),(230,30),(280,60)]表示从起点是x轴的数值为60的位置起,沿着x轴正方向移动90个单位;(10,8)表示从起点是y轴的数值为10的位置起,沿y轴正方向移动8个单位;facecolors表示每个柱体的颜色
plt.broken_barh([(60,90),(190,20),(230,30),(280,60)],(10,8),facecolors = ('#7fc97f','#beaed4','#fdc086','#ffff99'))

plt.xlim(0,360)
plt.ylim(5,35)
plt.xlabel('演出时间')

plt.xticks(np.arange(0,361,60))
plt.yticks([15,25],['歌剧院A','歌剧院B'])
plt.grid(ls = '-',lw = 1,color = 'gray')
plt.title('不同地区的歌剧院的演出时间比较')
plt.show()

运行结果: 

(4)阶梯图:凸显时序数据的波动周期和规律 

使用plt.step()函数

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

x = np.linspace(1,10,10)
y = np.sin(x)
#plt.step(x,y,color = '#8dd3c7',lw = 2)与plot()函数完全相同,where = 'pre'表示x轴上的每个数据点对应的y轴上的数值向左侧绘制水平线直到x轴上的此数据点的左侧为止,即按照左开右闭区间进行数据点选取
#当参数值为post则为按照左闭右开区间选取
plt.step(x,y,color = '#8dd3c7',where = 'pre',lw = 2)

plt.xlim(0,11)
plt.xticks(np.arange(1,11,1))
plt.ylim(-1.2,1.2)

plt.title('pre参数值对应的图形')
plt.show()

运行结果: 两种参数下的阶梯图形

 

 

(5)堆积阶梯型直方图:兼具阶梯图和直方图的特征

观察以下代码,堆积阶梯型直方图的绘制就是在绘制堆积直方图的基础上改变histtype参数 


import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np

mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

x1 = np.random.randint(0,100,100)
x2 = np.random.randint(0,100,100)
x = [x1,x2]
colors = ['#8dd3c7','#bebada']
labels = ['班级A','班级B']

bins = range(0,101,10)

plt.hist(x,bins = bins,color = colors,histtype='stepfilled',rwidth = 1.0,stacked= True,label = labels)

plt.xlabel('测试分数')
plt.ylabel('学生人数')
plt.title('不同班级的测试成绩的直方图')

plt.legend(loc = 'upper left')

plt.show()

运行结果: 

(6)饼图:定性数据的比例展示

1.分裂式饼图

以下代码中使用plt.pie()函数出现的一些陌生参数:

explode饼片边缘偏离半径的百分比
autopct饼片文本标签内容对应的数组百分比样式
shadow是否绘制饼片的阴影

 


import matplotlib.pyplot as plt
import matplotlib as mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

labels = 'A难度水平','B难度水平','C难度水平','D难度水平'

students = [0.35,0.15,0.2,0.3]

colors = ['#377eb8','#4daf4a','#984ea3','#ff7f00']
explode = (0.1,0.1,0.1,0.1)
plt.pie(students,explode = explode,labels = labels,autopct='%3.1f%%',startangle=45,shadow = True,colors = colors)

plt.title('选择不同难度测试试卷的学生占比')
plt.show()

运行结果: 

2.非分裂式饼图

以下代码中使用到plt.pie()函数出现的一些参数:

pctdistance百分比数值的显示位置
labeldistance标签值的显示位置

import matplotlib.pyplot as plt
import matplotlib as mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

labels = 'A难度水平','B难度水平','C难度水平','D难度水平'

students = [0.35,0.15,0.2,0.3]

colors = ['#377eb8','#4daf4a','#984ea3','#ff7f00']

plt.pie(students,labels = labels,autopct='%3.1f%%',startangle=45,pctdistance=0.7,labeldistance = 1.2,colors = colors)

plt.title('选择不同难度测试试卷的学生占比')
plt.show()

运行结果: 

3.内嵌环形饼图:通过将多个饼图进行嵌套,就可以进行多组定性数据比例分布的比较 


import matplotlib.pyplot as plt
import matplotlib as mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

elements = ['面粉','砂糖','奶油','草莓酱','坚果']

weight1 = [40,15,20,10,15]
weight2 = [30,25,15,20,10]

colors = ['#377eb8','#4daf4a','#984ea3','#ff7f00','#e41a1c']
outer_colors = colors
inner_colors = colors
#radius=1表示饼图的半径为1,textprops=dict(color='w') 设置文本颜色为白色;#wedgeprops=dict(width=0.3, edgecolor='w') 设置饼图的宽度为0.3,边缘颜色为白色
wedges1,texts1,autotexts1 = plt.pie(weight1,autopct='%3.1f%%',radius = 1,colors = colors,pctdistance=0.85,textprops=dict(color = 'w'),wedgeprops=dict(width = 0.3,edgecolor = 'w'))
wedges2,texts2,autotexts2 = plt.pie(weight2,autopct='%3.1f%%',radius = 0.7,colors = colors,pctdistance=0.75,textprops=dict(color = 'w'),wedgeprops=dict(width = 0.3,edgecolor = 'w'))
#bbox_to_anchor=(0.91, 0, 0.3, 1) 设置图例相对于图表的位置
plt.legend(wedges1,elements,fontsize = 12,title = '配料表',loc = 'center left',bbox_to_anchor = (0.91,0,0.3,1))
#plt.setp()函数用来设置图形对象的一系列属性
#wedges1表示第一个饼图的扇形部分
#autotexts1表示饼图中的百分比文本
#texts1表示饼图中的标签文本
plt.setp(autotexts1,size = 15,weight = 'bold')
plt.setp(autotexts2,size = 15,weight = 'bold')
plt.setp(texts1,size = 12)
plt.title('不同果酱面包配料比例表')

plt.show()

运行结果: 

(7)箱线图:多组定量数据的分布比较

 以下代码中出现几个陌生的参数关于plt.boxplot()函数的:

test(名字可改)传递给boxplot函数的数据源,如为二维数组,则按列的方向对数据进行统计,即有几列数据就有几个箱线图
whis指定箱线图的须线范围
widths指定箱线图的宽度
sym指定异常点的形状
labels指定每一个数据集箱线图的标签
patch_artist是否给箱体添加颜色

 

 

 

 

 

 

 

 

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False

test1 = np.random.randn(5000)
test2 = np.random.randn(5000)

test = [test1,test2]
labels = ['随机数生成器AlphaRM','随机数生成器BetaRM']
colors = ['#1b9e77','#d95f02']

whis = 0.6
width = 0.35
#这个参数告诉matplotlib在绘制箱线图时,将箱体视为填充的图形对象(patches),而不是简单的线条
bplot = plt.boxplot(test,whis = whis,widths = width,sym ='o',labels = labels,patch_artist=True)
#这段代码遍历bplot['boxes']中的每个箱体,并将其与colors列表中的颜色一一对应。zip函数用于将两个列表的元素配对
for patch,color in zip(bplot['boxes'],colors):
    #对于每个箱体,使用set_facecolor()方法设置其填充颜色。这样可以为每个箱体指定不同的颜色,从而实现箱线图的美化
    patch.set_facecolor(color)

plt.ylabel('随机数值')
plt.title('生成器抗干扰能力的稳定性比较')

plt.grid(axis = 'y',ls = ':',lw = 1,color = 'gray',alpha = 0.4)
plt.show()

运行代码: 

要想获得V型凹痕箱体,需要在boxplot()函数中增加参数notch设置为True即可,以下是运行结果: 

1.水平方向的箱线图

在boxplot()函数基础上增加了vert参数

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False

x = np.random.randn(1000)
#vert=False 参数指定了箱线图的方向为水平方向,而不是默认的垂直方向。这意味着箱线图的长条(箱体)将水平放置,而中位数线、须线和异常值点将垂直于箱体
plt.boxplot(x,vert = False)

plt.xlabel('随机数值')
plt.yticks([1],['随机数生成器AlphaRM'],rotation = 90)
plt.title('生成器抗干扰能力的稳定性')

plt.grid(axis = 'x',ls = ':',lw = 1,color = 'gray',alpha = 0.4)
plt.show()

运行结果: 

2.不绘制离群值的水平放置的箱线图

 在以上代码基础上,在函数plt.boxplot()中设置showfliers参数即可

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl

mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False

x = np.random.randn(1000)
#vert=False 参数指定了箱线图的方向为水平方向,而不是默认的垂直方向。这意味着箱线图的长条(箱体)将水平放置,而中位数线、须线和异常值点将垂直于箱体
plt.boxplot(x,vert = False,showfliers=False)

plt.xlabel('随机数值')
plt.yticks([1],['随机数生成器AlphaRM'],rotation = 90)
plt.title('生成器抗干扰能力的稳定性')

plt.grid(axis = 'x',ls = ':',lw = 1,color = 'gray',alpha = 0.4)
plt.show()

运行结果: 

(8)误差棒图:定量数据的误差范围 

plt.errorbar()中参数介绍:

yerr单一数值的非对称形式误差范围
fmt

数据点的标记样式和数据点标记的连接线样式

ecolor误差棒的线条颜色
elinewidth误差棒的线条粗细
ms数据点的大小
mfc数据点的标记颜色

mec

数据点的标记边缘颜色
capthick误差棒边界横杠的厚度
capsize误差棒边界横杠的大小

 

 

 

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0.1,0.6,10)
y = np.exp(x)

error = 0.05+0.15*x

lower_error = error
upper_error = 0.3*error
error_limit = [lower_error,upper_error]

plt.errorbar(x,y,yerr=error_limit,fmt = ':o',ecolor='y',elinewidth=4,ms = 5,mfc = 'c',mec = 'r',capthick=1,capsize=2)

plt.xlim(0,0.7)
plt.show()

运行结果: 

1.带误差棒的柱状图

观察下列代码发现,在柱状图上增加误差棒就需在plt.bar()函数中设置yerr,error_kw两个参数

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['LiSu']
mpl.rcParams['axes.unicode_minus'] = False

x = np.arange(5)
y = [100,68,79,91,82]
std_err = [7,2,6,10,5]
#定义误差条的样式,包括线宽、颜色和帽的大小。
error_attri = dict(elinewidth = 2,ecolor = 'black',capsize = 3)
#error_kw = error_attri: 指定误差条的样式,包括线宽、颜色和帽的大小
plt.bar(x,y,color = 'c',width = 0.6,align = 'center',yerr = std_err,error_kw = error_attri,tick_label = ['园区1','园区2','园区3','园区4','园区5'])

plt.xlabel('芒果种植区')
plt.ylabel('收割量')
plt.title('不同芒果种植区的单次收割量')

plt.grid(True,axis = 'y',ls = ':',color = 'gray',alpha = 0.2)
plt.show()

运行结果: 

2.带误差棒的条形图

与上文中绘制带误差棒的柱状图类似,注意将yerr转化为xerr

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['LiSu']
mpl.rcParams['axes.unicode_minus'] = False

x = np.arange(5)
y = [1200,2400,1800,2200,1600]
std_err = [150,100,180,130,80]
bar_width = 0.6
colors = ['#e41a1c','#377eb8','#4daf4a','#984ea3','#ff7f00']

plt.barh(x,y,bar_width,color = colors,align = 'center',xerr = std_err,tick_label = ['家庭','小说','心理','科技','儿童'])

plt.xlabel('订购数量')
plt.ylabel('图书种类')
plt.title('不同图书种类的采购情况')

plt.grid(True,axis = 'y',ls = ':',color = 'gray',alpha = 0.2)
plt.show()

运行结果: 

3.带误差棒的多数据并列柱状图

 由以下代码可知,绘制带误差棒的多数据并列柱状图就是在绘制多数据并列柱状图的函数参数中加上误差和对误差棒的样式设置即可

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['LiSu']
mpl.rcParams['axes.unicode_minus'] = False

x = np.arange(5)
y1 = [100,68,79,91,82]
y2 = [120,75,70,78,85]
std_err1 = [7,2,6,10,5]
std_err2 = [5,1,4,8,9]

error_attri = dict(elinewidth = 2,ecolor = 'black',capsize = 3)
bar_width = 0.4
tick_label = ['园区1','园区2','园区3','园区4','园区5']
plt.bar(x,y1,bar_width,color = 'c',align = 'center',yerr = std_err1,error_kw = error_attri,label = '2010')
plt.bar(x+bar_width,y2,bar_width,color = 'skyblue',align = 'center',yerr = std_err2,error_kw = error_attri,label = '2013')

plt.xlabel('芒果种植区')
plt.ylabel('收割量')
plt.title('不同芒果种植区的单次收割量')
plt.xticks(x+bar_width/2,tick_label)
plt.legend()
plt.grid(True,axis = 'y',ls = ':',color = 'gray',alpha = 0.2)
plt.show()

运行结果: 

4.带误差棒的堆积柱状图 

 只需要向bar函数传递yerr就可以在堆积柱状图的基础上,实现带误差棒的堆积柱状图的绘制

import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['LiSu']
mpl.rcParams['axes.unicode_minus'] = False

x = np.arange(5)
y1 = [1200,2400,1800,2200,1600]
y2 = [1050,2100,1300,1600,1340]
std_err1 = [150,100,180,130,80]
std_err2 = [120,110,170,150,120]
bar_width = 0.6

tick_label = ['家庭','小说','心理','科技','儿童']
error_attri = dict(elinewidth = 2,ecolor = 'black',capsize = 0)
plt.bar(x,y1,bar_width,color = '#6495ED',align = 'center',yerr = std_err1,label = '地区1',error_kw = error_attri)
plt.bar(x,y2,bar_width,color = '#FFA500',align = 'center',yerr = std_err2,label = '地区2',error_kw = error_attri,bottom = y1)
plt.ylabel('订购数量')
plt.xlabel('图书种类')
plt.title('不同图书种类的采购情况')
plt.xticks(x,tick_label)
plt.legend()
plt.grid(True,axis = 'y',ls = ':',color = 'gray',alpha = 0.2)
plt.show()

运行结果: 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值