二、Matplotlib绘制统计图形详解
2.1 柱状图和条形图
2.1.1 柱状图
导入支持库:
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 = [1,2,3,4,5]
y = [6,10,4,5,1]
调用函数绘制图形,设置标尺:
plt.bar(x,y,align="center",color="b",tick_label=["A","B","C","D","E"],alpha=0.6)
plt.xlabel("测试难度")
plt.ylabel("试卷数量")
plt.grid(True,axis="y",ls=":",color="r",alpha=0.3)
plt.show()
结果:
2.1.2 条形图
导入支持库:
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 = [1,2,3,4,5]
y = [6,10,4,5,1]
调用函数绘制图形,设置标尺:
plt.barh(x,y,align="center",color="c",tick_label=["A","B","C","D","E"])
plt.ylabel("试卷难度")
plt.xlabel("试卷分数")
plt.grid(True,axis="x",ls=":",color="r",alpha=0.3)
plt.show()
结果:
2.1.3 间断条形图
导入支持库:
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 = [(30,100),(180,50),(260,70)]
y = [(60,90),(190,20),(230,30),(280,60)]
调用函数绘制图形,设置标尺:
plt.broken_barh(x,(20,8),facecolors="#1f78b4")
plt.broken_barh(y,(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()
结果:
2.1.4 阶梯图
导入支持库:
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",where="pre",lw=2)
plt.xlim(0,11)
plt.xticks(np.arange(1,11,1))
plt.ylim(-1.2,1.2)
plt.show()
结果:
2.2 堆积图和直方图
2.2.1 堆积柱状图
导入支持库:
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 = [1,2,3,4,5]
y = [6,10,4,5,1]
y1=[2,6,3,8,5]
调用函数绘制图形,设置标尺:
plt.bar(x,y,align="center",color="#66c2a5",tick_label=["A","B","C","D","E"],label="班级A")
plt.bar(x,y1,align="center",color="#8da0cb",bottom=y,label="班级B")
plt.xlabel("试卷难度")
plt.ylabel("试卷份数")
plt.legend()
plt.show()
结果:
v
2.2.2 堆积条形图
导入支持库:
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 = [1,2,3,4,5]
y = [6,10,4,5,1]
y1=[2,6,3,8,5]
调用函数绘制图形,设置标尺:
plt.barh(x,y,align="center",color="#66c2a5",tick_label=["A","B","C","D","E"],label="班级A")
plt.barh(x,y1,align="center",color="#8da0cb",left=y,label="班级B")
plt.ylabel("试卷难度")
plt.xlabel("试卷份数")
plt.legend()
plt.show()
结果:
2.2.3 堆积折线图
导入支持库:
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(1,6,1)
y = [0,4,3,5,6]
y1 = [1,3,4,2,7]
y2 = [3,4,1,6,5]
调用函数绘制图形,设置标尺:
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.2.4 直方图
导入支持库:
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
设置绘图数据:
scoresT = np.random.randint(0,100,100)
x = scoresT
bins = range(0,101,10)
调用函数绘制图形,设置标尺:
plt.hist(x,bins = bins, color = "#377eb8",histtype="bar",rwidth=1.0)
plt.xlabel("测试成绩")
plt.ylabel("学生人数")
plt.show()
运行结果:
2.2.5 堆积直方图
导入支持库:
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
设置绘图数据:
scoresT1=np.random.randint(0,100,100)
scoresT2=np.random.randint(0,100,100)
x=[scoresT1,scoresT2]
调用函数绘制图形,设置标尺:
colors=["#8dd3c7","#bebada"]
labels=["班级A","班级B"]
bins = range(0,100,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()
运行结果:
(1) 改变堆积柱状图显示样式
导入支持库:
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
设置绘图数据:
scoresT1=np.random.randint(0,100,100)
scoresT2=np.random.randint(0,100,100)
x=[scoresT1,scoresT2]
调用函数绘制图形,设置标尺:
colors=["#8dd3c7","#bebada"]
labels=["班级A","班级B"]
bins = range(0,100,10)
plt.hist(x,bins=bins,color=colors,histtype="bar",rwidth=1.0,stacked=False,label=labels)
plt.xlabel("测试成绩(分)")
plt.ylabel("学生人数")
plt.title("不同班级的测试成绩的直方图")
plt.legend(loc="upper left")
plt.show()
运行结果:
v
(2) 直方图的不同形状
导入支持库:
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
设置绘图数据:
scoresT1=np.random.randint(0,100,100)
scoresT2=np.random.randint(0,100,100)
x=[scoresT1,scoresT2]
调用函数绘制图形,设置标尺:
colors=["#8dd3c7","#bebada"]
labels=["班级A","班级B"]
bins = range(0,100,10)
plt.hist(x,bins=bins,color=colors,histtype="bar",rwidth=1.0,stacked=False,label=labels)
plt.xlabel("测试成绩(分)")
plt.ylabel("学生人数")
plt.title("不同班级的测试成绩的直方图")
plt.legend(loc="upper left")
plt.show()
运行结果:
2.3 饼图和箱线图
2.3.1 饼图
导入支持库:
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
设置绘图数据:
#数据
students = [0.35,0.15,0.20,0.3]
#绘图参数
labels = "A难度水平","B难度水平","C难度水平","D难度水平"
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.3.2 非分列式饼图
导入支持库:
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
设置绘图数据:
labels = "A难度水平","B难度水平","C难度水平","D难度水平"
students = [0.35,0.15,0.20,0.3]
colors = ["#377eb8","#4daf4a","#984ea3","#ff7f00"]
调用函数绘制图形,设置标尺:
plt.pie(students,labels=labels,autopct="%3.1f%%",startangle=45,colors=colors,pctdistance=0.7,labeldistance=1.2)
plt.title("选择不同难度测试试卷的学生占比")
plt.show()
运行结果:
2.3.3 内嵌环形饼图
导入支持库:
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
设置绘图数据:
elements = ["面粉","砂糖","奶油","草莓酱","坚果"]
weight1=[40,15,20,10,15]
weight2=[30,25,15,20,10]
colormapList = ["#e41a1c","#377eb8","#4daf4a","#984ea3","#ff7f00"]
outer_colors = colormapList
inner_colors = colormapList
调用函数绘制图形,设置标尺:
wedges1,texts1,autotexts1 = plt.pie(weight1,autopct="%3.1f%%",radius=1,pctdistance=0.85,colors=outer_colors,textprops=dict(color="w"),wedgeprops=dict(width=0.3,edgecolor="w"))
wedges2,texts2,autotexts2 = plt.pie(weight2,autopct="%3.1f%%",radius=0.7,pctdistance=0.75,colors=inner_colors,textprops=dict(color="w"),wedgeprops=dict(width=0.3,edgecolor="w"))
plt.legend(wedges1,elements,fontsize=12,title="颜料表",loc="center left",bbox_to_anchor=(0.91,0,0.3,1))
plt.setp(autotexts1,size=15)
plt.setp(autotexts2,size=15)
plt.setp(texts1,size=12)
plt.title("不同过江面包配料比例表")
plt.show()
运行结果:
2.3.4 箱线图
导入支持库:
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
设置绘图数据:
testA = np.random.randn(5000)
testB = np.random.randn(5000)
testList=[testA,testB]
labels=["随机数生成器AlphaRM","随机数生成器BetaRM"]
colors=["#1b9e77","#d95f02"]
whis=1.6
width=0.35
调用函数绘制图形,设置标尺:
bplot=plt.boxplot(testList,whis=whis,widths=width,sym="o",labels=labels,patch_artist=True)
for patch,color in zip(bplot["boxes"],colors):
patch.set_facecolor(color)
plt.ylabel("随机数值")
plt.title("生成器抗干扰能力的稳定性比较")
plt.grid(axis="y",ls=":",lw=1,color="gray",alpha=0.4)
plt.show()
运行结果:
2.3.5 水平方向的箱线图
导入支持库:
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.random.randn(1000)
调用函数绘制图形,设置标尺:
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.3.6 不绘制离群值得水平放置的箱线图
导入支持库:
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.random.randn(1000)
调用函数绘制图形,设置标尺:
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()
运行结果:
2.4 误差棒图
2.4.1 误差棒图
导入支持库:
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(0.1,0.6,10)
y = np.exp(x)
error = 0.05+0.15*x
lower_error= error
upper_error = 0.*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()
运行结果:
2.4.2 带误差棒的柱状图
导入支持库:
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 = [100,68,79,91,82]
std_err = [7,2,6,10,5]
error_attri = dict(elinewidth=2,ecolor="black",capsize=3)
调用函数绘制图形,设置标尺:
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.4.3 带误差棒的条形图
导入支持库:
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 = [1200,2400,1800,2200,1600]
std_err = [150,100,180,130,80]
bar_err = [150,100,180,130,80]
bar_width=0.6
colors = ["#e51a1c","#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="x",ls=":",color="gray",alpha=0.2)
plt.xlim(0,2600)
plt.show()
运行结果:
2.4.4 带误差棒的多数据并列柱状图
导入支持库:
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)
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="#87ceeb",
align="center",
yerr=std_err1,
error_kw=error_attri,
label="2010")
plt.bar(x+bar_width,y2,
bar_width,
color="#cd6c5c",
align="center",
yerr=std_err2,
error_kw=error_attri,
label="2013")
plt.xticks(x+bar_width/2,tick_label)
plt.title("不同年份的芒果种植区的单次收割量")
plt.grid(True,axis="y",ls=":",color="gray",alpha=0.2)
plt.legend()
plt.show()
运行结果:
2.4.5 带误差棒的堆积柱状图
导入支持库:
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)
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(scolor="black",elinewidth=2,capsize=0)
调用函数绘制图形,设置标尺:
plt.bar(x,y1, bar_width, align="center", yerr=std_err1, label="地区1", error_kw=error_attri)
plt.bar(x,y2, bar_width, align="center", yerr=std_err2, label="地区2", error_kw=error_attri)
plt.title("不同地区大型图书展销会的图书采购情况")
plt.grid(True,axis="y",ls=":",color="gray",alpha=0.2)
plt.xticks(x,tick_label)
plt.legend()
plt.show()
运行结果:
2.5 完善统计图形
2.5.1 添加图例和标题
导入支持库:
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(-2*np.pi,2*np.pi,200)
y = np.sin(x)
y1 = np.cos(x)
调用函数绘制图形,设置标尺:
plt.plot(x,y,label=r"$\sin(x)$")
plt.plot(x,y1,label=r"$\cos(x)$")
plt.legend(loc="lower left")
plt.title("正弦函数和余弦函数的折线图")
plt.show()
运行结果:
2.5.2 图例的展示样式调整
导入支持库:
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(0,2.1,0.1)
y = np.power(x,3)
y1 = np.power(x,2)
y2 = np.power(x,1)
调用函数绘制图形,设置标尺:
plt.plot(x,y,ls="-",lw=2,label="$x^3$")
plt.plot(x,y1,ls="-",lw=2,c="r",label="$x^2$")
plt.plot(x,y2,ls="-",lw=2,c="y",label="$x^1$")
plt.legend(loc="upper left", bbox_to_anchor=(0.05,0.95),ncol=3,title="power function",shadow=True,fancybox=True)
plt.show()
运行结果:
2.5.3 标题的展示样式调整
导入支持库:
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(-2,2,1000)
y = np.exp(x)
调用函数绘制图形,设置标尺:
plt.plot(x,y,ls="-",lw=2,color="g")
plt.title("center demo")
plt.title("Left Demo",loc="left",fontdict={"size":"xx-large","color":"r","family":"Times New Roman"})
plt.title("right demo",loc="right",family="Comic Sans MS",size=20,style="oblique",color="c")
plt.show()
运行结果:
2.5.4 调整刻度范围和刻度标签
导入支持库:
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(-2*np.pi,2*np.pi,200)
y = np.sin(x)
调用函数绘制图形,设置标尺:
plt.subplot(211)
plt.plot(x,y)
plt.subplot(212)
plt.xlim(-2*np.pi,2*np.pi)
plt.xticks([-2*np.pi,-3*np.pi/2,-1*(np.pi)/2,0,(np.pi)/2,np.pi,3*np.pi/2,2*np.pi], ["$-3\pi/2$","$-\pi$","$-\pi/2$","$0$","$\pi/2$","$3\pi/2$","$2\pi$","$2\pi$"])
plt.plot(x,y)
plt.show()
运行结果:
2.5.5 逆序设置坐标轴刻度标签
导入支持库:
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
设置绘图数据:
time = np.arange(1,11,0.5)
machinePower = np.power(time,2)+0.7
调用函数绘制图形,设置标尺:
plt.plot(time,machinePower, linestyle="-", linewidth=2, color="r")
plt.xlim(10,1)
plt.xlabel("使用年限")
plt.ylabel("机器功率")
plt.title("机器损耗曲线")
plt.grid(ls=":",lw=1,color="gray",alpha=0.5)
plt.show()
运行结果:
2.5.6 向统计图添加表格
导入支持库:
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
设置绘图数据:
labels = "A难度水平","B难度水平","C难度水平","D难度水平"
students = [0.35,0.15,0.20,0.30]
explode = [0.1,0.1,0.1,0.1]
colors=["#377eb8","#e41a1c","#4daf4a","#984ea3"]
调用函数绘制图形,设置标尺:
plt.pie(students,explode=explode,labels=labels,autopct="%1.1f%%",startangle=45,shadow=True,colors=colors)
plt.title("选择不同难度测试试卷的学生占比")
colLabels = ["A难度水平","B难度水平","C难度水平","D难度水平"]
rowLabels = ["学生选择试卷人数"]
studentValues=[[350,150,200,300]]
colColors=["#377eb8","#e41a1c","#4daf4a","#984ea3"]
plt.table(cellText=studentValues,
cellLoc="center",
colWidths=[0.3]*4,
colLabels=colLabels,
colColours=colColors,
rowLabels=rowLabels,
rowLoc="center",
loc="bottom")
plt.show()
运行结果: