目录
折线图-plt.stackplot()&plt.step()
柱状图-plt.bar()
基本准备(前两种在我之前的文章《Python matplotlib入门级绘制图形(二)--利用统计基础函数绘制简单的图形》有详细介绍)
#导入模块
import matplotlib.pyplot as plt
import numpy as np
#设置参数
plt.rcParams["font.sans-serif"]=["Heiti TC"]
plt.rcParams["axes.unicode_minus"]=False
#录入数据
x=np.linspace(1,5,5)
y=np.random.randint(1,10,5)
plt.bar()--多颜色柱状图
plt.bar(x,y,edgecolor="black",hatch="/",color=["dodgerblue","rosybrown","yellow","darkorange","lightgreen"],tick_label=["dodgerblue","rosybrown","yellow","darkorange","lightgreen"])
plt.ylim(0,10)
plt.xlabel("Bar Color",weight="bold")
plt.ylabel("Using Frequency")
plt.yticks(np.linspace(0,10,11))
plt.title("Bar Test")
for a,b in zip(x,y):
plt.text(a,b,b,ha="center",va="bottom",fontsize=12,alpha=0.7)
plt.show()
plt.bar()--单颜色柱状图
plt.bar(x,y,edgecolor="black",hatch="/",color="dodgerblue",label="zero")
plt.ylim(0,10)
plt.legend()
plt.xlabel("Bar Color",weight="bold")
plt.ylabel("Using Frequency")
plt.yticks(np.linspace(0,10,11))
plt.title("Bar Test")
for a,b in zip(x,y):
plt.text(a,b,b,ha="center",va="bottom",fontsize=12,alpha=0.7)
plt.show()
plt.barh()--条形图
plt.barh(x,y,edgecolor="black",hatch="/",color=["dodgerblue","rosybrown","yellow","darkorange","lightgreen"],tick_label=["dodgerblue","rosybrown","yellow","darkorange","lightgreen"])
plt.ylim(0,6)
plt.xlabel("Bar Color",weight="bold")
plt.ylabel("Using Frequency")
plt.yticks(np.linspace(0,5,6))
plt.title("Bar Test")
for a,b in zip(x,y):
plt.text(b,a,b,ha="left",va="center",fontsize=12,alpha=0.7)
plt.show()
值得注意的是条形图的参数和柱状图的一模一样,但在使用plt.text(a,b,s,ha,va,fontsize,alpha)时需要注意此时的a和b需要互换变成plt.text(b,a,s,ha,va,fontsize,alpha)且ha,va参数需要调整才能得出相对美观的图形
plt.bar()--堆积图
bar版
x=np.linspace(1,10,10)
y1=np.random.randint(1,10,10)
y2=np.random.randint(1,10,10)
plt.bar(x,y1,align="center",edgecolor="black",color="yellow")
plt.bar(x,y2,align="center",edgecolor="black",color="darkorange",bottom=y1)
与之前的图像不同的是此时运用了两次bar(),在同一张figure中绘图,将第二个bar()中的bottom设置为第一个bar()中的height坐标也就是上面的y1,就可以达到堆积的效果,意思是第二份柱状图的底座标是是一个柱状图的y坐标
barh版
plt.barh(x,y1,align="center",edgecolor="black",color="yellow",label="orgin")
plt.barh(x,y2,align="center",edgecolor="black",color="darkorange",left=y1,label="change")
plt.legend()
plt.show()
此处的区别是将bottom改为了left,将柱状图的左侧坐标设置为上一个柱状图的y坐标
对于直方图堆积方式也是类似
plt.bar()--分块图
bar版
bar_width=0.35
plt.bar(x-bar_width/2,y1,color="dodgerblue",edgecolor="black",width=bar_width,align="center")
plt.bar(x+bar_width/2,y2,color="darkorange",edgecolor="black",width=bar_width,align="center")
plt.xticks(np.linspace(1,10,10))
plt.show()
barh版
bar_width=0.35
plt.barh(x-bar_width/2,y1,height=bar_width,color="dodgerblue",edgecolor="black",align="center",label="A")
plt.barh(x+bar_width/2,y2,height=bar_width,color="darkorange",edgecolor="black",align="center",label="B")
plt.legend()
plt.xticks(np.linspace(1,10,10))
plt.show()
思路:原本只用一个bar()或barh()时,刻度指向柱子的中间。此时插入一个柱子若没有调整柱宽以及位置会显得不协调。因此,以bar()为例,对于第一个坐标,一个柱子向左平移半个柱宽,另一个向右平移半个柱宽,可以达到第一个bar()的每个柱子右边界对齐中间刻度,第二个bar()的每个柱子左边界对齐中间刻度。
注意:柱状图与条形图的柱宽参数名称不同,柱状图为width,条形图为height
间断条形图broken_barh()
首先讲一下一个例子,小明想要去看电影,可是他不知道要看什么电影,同时他要求在12点前要去吃饭,赶上午饭。
此时,就可以用简短条形图来表示不同电影院来直观显示各个时间段的电影。
plt.broken_barh(list1,position,facecolor)
list1:此处是一个列表,内部为多个元组数据,如:[(a,b),(c,d)]。那第一个元组举例,表示,在x=a处向右移动b个单位
postion:通常也是一个元组(y,length),表示矩形左下角纵坐标为y,往上走length个单位,也就是矩形的长度。
facecolor:决定的是间断条形图的颜色。
以下为例题的一个例子:
plt.broken_barh([(30,100),(180,50),(260,70)],(20,8),facecolor='dodgerblue',edgecolor='black',alpha=0.7)
plt.broken_barh([(60,90),(190,30),(230,40),(280,90)],(10,8),facecolor='darkorange',edgecolor='black',alpha=0.5)
#限制范围
plt.ylim(5,35)
plt.xlim(0,360)
#修改数据
plt.xticks(np.arange(0,480,60),['8:30','9:00','9:30','10;00','10:30','11:00','11:30','12:00'])
plt.yticks([24,14],['电影A','电影院B'])
#标题
plt.xlabel('时间点')
plt.title('不同电影院的演出时间比较')
plt.show()
当然如果为了美观,可以考虑添加plt.grid()
注:数据为随意的,可能不太合理。
折线图-plt.stackplot()&plt.step()
一般的折线图在第一篇文章已经叙述,这里讲述的是另一种--堆积折线图
堆积折线图stackplot()
此处以y=指数函数为例
令三条曲线分别为y=、y= 、y=
y1=np.exp(x)
y2=np.exp(x)/2
y3=np.exp(x)/3
plt.stackplot(x,y1,y2,y3,colors=['r','g','b'],labels=['红','青','蓝'],alpha=0.5)
plt.legend(loc='upper left')
plt.show()
会看到图像俩俩之间区域颜色会偏向数值大的曲线颜色,最后的数值颜色比较是图像与x轴的大小比较
阶梯图step()
首先引进数据
x=np.linspace(1,10,10)
#设置阶梯的形状
y=np.sin(x)
plt.step(x,y,color="c",where="pre")
此处参数需注意的是where,它有俩个参数,"pre"、"post"
pre会导致曲线先上升后向右
post会导致曲线先向右后上升(图像如下)
饼图-plt.pie()
分裂式饼图
相比于第二篇文章,这里的饼图分裂是全部分裂,即explode的数据全部不为0
x=np.random.randint(10,30,5)
s=x.sum()
x=x/s
explode=np.ones(5)/10
plt.pie(x,autopct="%.2f%%",shadow=True,wedgeprops={"edgecolor":"black"},colors=["rosybrown","c","dodgerblue","yellow","darkorange"],labels=["鸡","鸭","鹅","猪","牛"],explode=explode,startangle=-60)
此处不做过多描述,详情看文章(二)
内嵌环形饼图
此处是本部分的重点
数据先用上副图的数据
为了数据的美观
plt.pie(x,autopct="%.2f%%",shadow=True,colors=["rosybrown","c","dodgerblue","yellow","darkorange"],radius=1,pctdistance=0.85,labels=["鸡","鸭","鹅","猪","牛"],wedgeprops={'width':0.3,'edgecolor':'w'},textprops={'color':'w'},startangle=-60)
plt.pie(x,autopct="%.2f%%",shadow=True,colors=["rosybrown","c","dodgerblue","yellow","darkorange"],radius=0.7,pctdistance=0.65,labels=["鸡","鸭","鹅","猪","牛"],wedgeprops={'width':0.3,"edgecolor":'w'},textprops={'color':'w'},startangle=-60)
这里多了几个参数
pctdistance:文本标签到圆心的距离
textprops:设置文本的字典,也有这样表示的,textprops=dict(color='w')
wedgeprops:之前已经用过,不过是用来给饼图的边框涂黑,这里还用于设定饼图环的半径,
width是从外缘开始往圆心计算
为了美观,我把figure的大小figsize调到了(10,10)
箱线图-boxplot()
基础知识
箱线图是由一个箱体还有一对箱须所组成的图形。箱体是由第一四分位数、中位数(第二四分位数)和第三四分位数所组成的(四分位数说人话就是把数值从小到大排列,分成四等份),箱须末端之外的数值可以理解为离群值,因此,箱须是对一组数据的大致直观描述。
(图片来自百度百科)
(图片来源于CSDN博主Mapc的图片)
绘制图像
准备数据
x=np.random.randn(5000)
#这一部分用于帮助理解,实际操作不需使用
#此函数用于将一堆数据分成4等份(0到100步长为25,也就是说每25取一个数据)
y=np.percentile(x,np.arange(0,100,25))
#第一等分
Q1=y[1]
#第二等分
Q2=y[2]
#第三等分
Q3=y[3]
print('IQR={}'.format(Q3-Q1))
IQR=Q3-Q1
whis=1.6
first=Q1-whis*IQR
third=Q3+whis*IQR
图像
plt.boxplot()中
vert:决定了箱线图的摆放方向
sym:决定了离群值的形状
patch_artist:是否填充颜色
plt.boxplot(x,whis=1.72,widths=whis,vert=False,sym='o',patch_artist=True)
plt.grid(axis='x',ls=':')
#以下部分用于理解实际绘制不需使用
plt.annotate("Q3+whisxIQR",
xy=(Q3+whis*IQR,1),
xytext=(3,2),
color="black",
alpha=0.7,
weight="bold",
fontsize=12,
arrowprops=dict(arrowstyle="->",connectionstyle="arc3",color="b"))
plt.annotate("Q1-whisxIQR",
xy=(Q1-whis*IQR,1),
xytext=(Q1-whis*IQR,2),
color="black",
alpha=0.7,
weight="bold",
fontsize=12,
arrowprops=dict(arrowstyle="->",connectionstyle="arc3",color="b"))
plt.annotate("Q1",
xy=(Q1,1),
xytext=(Q1,2),
color="black",
alpha=0.7,
weight="bold",
fontsize=12,
arrowprops=dict(arrowstyle="->",connectionstyle="arc3",color="b"))
plt.annotate("Q2:Median",
xy=(Q2,1),
xytext=(Q2,2.5),
color="black",
alpha=0.7,
weight="bold",
fontsize=12,
arrowprops=dict(arrowstyle="->",connectionstyle="arc3",color="b"))
plt.annotate("Q3",
xy=(Q3,1),
xytext=(Q3,2),
color="black",
alpha=0.7,
weight="bold",
fontsize=12,
arrowprops=dict(arrowstyle="->",connectionstyle="arc3",color="b"))
plt.show()
误差棒图
一类直线上的误差棒
导入数据
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,ecolor='y',fmt=":o",elinewidth=3,ms=5,mfc='c',mec='r',capthick=1,capsize=1)
plt.show()
yerr:决定竖直误差棒长度
xerr:决定水平误差棒长度
ecolor:误差棒颜色
elinewidth:误差棒宽度
ms:数据点的大小
mfc:数据点的颜色
mec:数据点边缘颜色
capthick:误差棒横杠宽度
capsize:误差棒横杆大小
二类柱状图上的误差棒
以文章二的数据为例(此处例子中的误差参数数值是随意设置的,使用时要根据实际问题设置)
x=np.linspace(1,12,12)
height=np.random.randint(1,12,12)
#误差参数
std_err=np.random.randint(1,3,12)
error_attri=dict(elinewidth=2,ecolor='black',capsize=2)
导出图像
plt.bar(x,height,error_kw=error_attri,yerr=std_err,edgecolor="black",width=0.8,hatch="/",tick_label=["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],color=["rosybrown","dodgerblue","lightgreen","c","darkorange","chartreuse","red","blue","green","yellow","purple","gray"])
plt.xticks(np.linspace(1,12,12))
plt.title("季度销量")
plt.xlabel("月份(月)")
plt.ylabel('销量(万元)')
plt.xticks(fontsize=8,rotation=45)
plt.yticks(fontsize=8)
for a,b in zip(x,height):
plt.text(a,b,b,ha="center",va="bottom",fontsize=8,color="black")
plt.show()
此处区别于文章二多了个误差字典error_kw还有yerr。
error_kw:设置的是误差棒的宽度,颜色,水平横杆的大小
yerr:则设置了误差棒竖直方向上俩杠的长度
入门篇Finish.
参考: