【Matplotlib-2】 基础统计函数和图形

设置可显示中文+处理坐标轴刻度为负数情况

import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams["font.sans-serif"]=["SimHei"] ## 设置字体为SimHei,从而可以显示中文
mpl.rcParams["axes.unicode_minus"]=False ## 不使用默认的“Unicode minus”模式来处理坐标轴轴线的刻度标签是负数的情况,一般可以使用“ASCII hyphen”模式来处理坐标轴轴线的负刻度值的情况

柱状图

plt.bar(x,y,align="center",color="blue",width= 3, edgecolor = 'red', tick_label=["A","B","C","D","E"],alpha=0.6,hatch='///',label = '数据集1')

x——可以是数值也可以是字符串

x = ['c', 'a', 'd', 'b']
y = [1, 2, 3, 4]
## 此时柱状图会自动将x轴标签按照字符串顺序排序变为:a、b、c、d

也可以不用x用另外设定的x轴标签——plt.xticks或tick_label

plt.xticks(np.arange(4), ('A','B', 'C', 'D'), rotation=30) #np.arange指定刻度位置ticks,rotation控制倾斜角度
## 此时横轴标签变为:A、B、C、D
## tick_label直接作为plt.bar的参数

y轴刻度间距——plt.yticks

plt.yticks(np.arange(0, 5, 0.2)) ## 0~5,每隔0.2一个刻度

align——柱体对齐方式:align='center'表示柱体中心点放在列表x的元素值处

edgecolor——每个bar的边框颜色

hatch——每个bar的填充图案以及密集程度

关键字参数hatch可以有很多取值,例如'//''\\''|''-'(斜线、竖线、横线)等,每种符号字符串都是一种填充柱体的几何样式。而且,符号字符串的符号数量越多,柱体的几何图形的密集程度越高

条形图

x的值显示在y轴上,y的值显示在x轴上,tick_label是y轴标签

plt.barh(x,y,align="center",color="c",tick_label=["A","B","C","D","E"], label = '班级A')

堆积柱状图

## 设定bar()的bottom参数作为上方一个条形的底
plt.bar(x, y, align = 'center', color = 'blue', bottom = y1, label = '班级B');

image-20220214110747882

堆积条形图

## 设定barh的Left参数作为右侧的左边界
plt.barh(x,y,align="center",left=y1,color="#8da0cb",label="班级B")

image-20220214111139131

并列柱状图和并列条形图

并列的bar的x1坐标:x1 = x+bar_width

bar_width = 0.35
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)

刻度的横坐标x_ticks = x + bar_width/2

plt.xticks(x+bar_width/2,tick_label)

demo

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
# some simple data
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"]
# create bar
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)
# set x,y_axis label
plt.xlabel("测试难度")
plt.ylabel("试卷份数")
# set xaxis ticks and ticklabels
plt.xticks(x+bar_width/2,tick_label)
plt.legend()
plt.show()

直方图

和柱状图的区别:柱状图描述离散数据的分布,直方图描述连续数据的分布。图形上,柱状图每个bar间有间隙,直方图没有。

使用场景:展现数据在不同区间的分布特征

bins = range(0,101,10) #[0,101)间分10个区间
plt.hist(x,bins=bins,facecolor="#377eb8",edgecolor = 'black',rwidth=10,histtype = 'bar', orientation = 'vertical',stacked = False, density = False)

bins——bar分布的区间

facecolor——直方图颜色

edgecolor——bar边框颜色

rwidth——

histtype——直方图类型:‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’

bar——柱状

step——折线(只有边框线条)

image-20220214115913591

stepfilled

image-20220214135209099

orientation——直方图的方向:默认vertical竖直、horizontal水平

stacked——True绘制堆积直方图,False绘制并列直方图

density——默认值为False, 表示用每个区间的数值个数来绘图,当取值为True时,柱子的高度为每个区间的频率

饼图

https://blog.csdn.net/captain811/article/details/79248912?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2~default~LandingCtr~HighlightScore-4.queryctrv2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~LandingCtr~HighlightScore-4.queryctrv2

https://zhuanlan.zhihu.com/p/38160291

饼图通过将一个圆饼按照分类的占比划分成多个区块,整个圆饼代表数据的总量,每个区块(圆弧)表示该分类占总体的比例大小,所有区块(圆弧)的加和等于 100%。

labels = ["面粉","砂糖","奶油","草莓酱","坚果"] ## 每个饼片的文字标签
weight = [0.15,0.35,0.25,0.25] ## 饼片的权重(和为1)
colors = ["#377eb8","#4daf4a","#984ea3","#ff7f00"] ## 饼片的颜色
explode = (0.1,0,0,0) ## 饼片突出的程度
wedges, texts, autotexts = plt.pie(weight, labels = labels, explode = explode, autopct = "%3.1f%%", colors = colors, shadow = True, startangle = 45, radius = 0.7, labeldistance = 1.1, pctdistance = 0.7, textprops = dict('fontsize' = 13, 'color' = 'black'), wedgeprops = {'linewidth':0.3, 'edgecolor':'white'}, frame = True, center = (1,1))
## 图例函数“plt.legend(wedges,elements)”,我们就可以将饼片外部的文本标签放在图例中,而饼片的数值标签仍然放在饼片内部。函数legend()的参数wedges和elements分别表示饼片实例列表和文本标签列表
plt.legend(wedges,weight,fontsize=12,title="配料表",loc="center left",bbox_to_anchor=(0.91, 0, 0.3, 1))
plt.axis('equal') ## 让显示的饼图保持圆形,需要添加axis保证长宽一样

weight——饼图饼片权重值

explode——饼片分裂的程度。explode=None饼片不分裂。

labels——各饼片的标签

autopct——将各饼片对应weight的取值转成百分比

colors——各饼片的颜色

shadow——饼片是否有阴影

startangle——第一个饼片的起始角度是以x轴为起点逆时针旋转45°的

radius——饼图半径大小

labeldistance——设置各扇形标签(图例)与圆心的距离,半径的倍数

pctdistance——百分比标签距离圆心的距离,半径的倍数

textprops——设置饼图中文本的属性,如字体大小、颜色等

wedgeprops——设置饼图内外边界的属性,如边界线的粗细、颜色等

wedgeprops= {'lw':1, 'edgecolor':'w'}

frame——设置是否显示饼图背后的图框。如果设置为True的话,需要同时控制图框x轴、y轴的范围和饼图的中心位置

center = (1,1)

center——饼图中心位置。默认是原点

import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams["font.sans-serif"]=["SimHei"]
mpl.rcParams["axes.unicode_minus"]=False
elements = ["面粉","砂糖","奶油","草莓酱","坚果"]
weight = [40,15,20,10,15]
colors = ["#1b9e77","#d95f02","#7570b3","#66a61e","#e6ab02"]
wedges, texts, autotexts = plt.pie(weight,autopct="%3.1f%%",textprops=dict(color="w"),colors=colors)
## 函数legend()的参数wedges和elements分别表示饼片实例列表和文本标签列表,而且这两个参数要一起配合使用才可以将饼片外部的文本标签放置在图例内部
plt.legend(wedges,elements,fontsize=12,title="配料表",loc="center left",bbox_to_anchor=(0.91, 0, 0.3, 1))
plt.setp(autotexts, size=15, weight="bold")
plt.setp(texts,size=12)
plt.title("果酱面包配料比例表")
plt.show()

内嵌环形饼图

将多个饼图进行嵌套,从而实现内嵌环形饼图的可视化效果。这样,就可以进行多组定性数据比例分布的比较。

由多个饼图叠加

绘制外层饼图、内层饼图、中心空白区域、设置饼图边界线颜色、粗细

## 嵌套饼图
import matplotlib as mpl
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(12,8), facecolor = 'cornsilk')
mpl.rcParams["font.sans-serif"]=["SimHei"]
mpl.rcParams["axes.unicode_minus"]=False
labels1 = "A难度水平","B难度水平","C难度水平","D难度水平"
labels2 = ['A', 'B', 'C', 'D']
students1 = [0.35,0.15,0.20,0.30]
colors1 = ['orange', 'limegreen', 'blue', 'violet']
explode = (0,0,0,0)
# 绘制外层饼图
wedges1, texts1, autotexts1 = plt.pie(students1,explode=explode,
labels=labels1,
autopct="%3.1f%%",
startangle=45,
shadow=False,
colors=colors1,pctdistance = 0.85, labeldistance = 1.1,radius = 0.7, wedgeprops= {'lw':1, 'edgecolor':'w'})
# 绘制内层饼图
students2 = [0.3, 0.2, 0.25, 0.25]
colors2 = ['orange', 'limegreen', 'blue', 'violet']
wedges2, texts2, autotexts2 = plt.pie(students2,explode=explode,labels=labels2,autopct="%3.1f%%",startangle=45,shadow=False,colors=colors2,pctdistance = 0.85, labeldistance = 1.1, radius = 0.5, wedgeprops= {'lw':1, 'edgecolor':'w'}) ## wedgeprops设置边界线颜色才可将饼图区分开
# 绘制中心空白饼图
plt.pie(x=[1], colors = 'w', radius = 0.3)
plt.legend(wedges1, labels1, loc = 'upper right', title = '外环', edgecolor = 'red', facecolor = 'pink', fontsize =10, ncol = 2)
# plt.legend(wedges2, labels2, loc = 'lower right', title = '内环', edgecolor = 'red', facecolor = 'pink', fontsize =10)
plt.title("title", style = 'oblique', size = 'xx-large', color = 'c', family="Comic Sans MS")
plt.table([students1, students2], cellLoc='center', colWidths=[0.4, 0.4, 0.4, 0.4], colLabels=labels1, colColours=colors1, rowLabels=['外环数据', '内环数据'], rowLoc='center', loc = 'bottom')
plt.show()

image-20220216104128160

箱线图

  • 四分位数

    是统计学中分位数的一种,即把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值就是四分位数。第三四分位数与第一四分位数的差距又称四分位距IQR(IQR = Q3 - Q1)。与方差标准差一样,表示统计资料中各变量分散情形

    • 第一四分位数(Q1),又称“较小四分位数”,等于该样本中所有数值由小到大排列后第25%的数字。
    • 第二四分位数(Q2),又称“中位数”,等于该样本中所有数值由小到大排列后第50%的数字。
    • 第三四分位数(Q3),又称“较大四分位数”,等于该样本中所有数值由小到大排列后第75%的数字。
  • 四分位距

    QD = IQR / 2

  • 组成

    箱体的组成部分有:箱体、箱须和离群值,其中,箱体主要由第一四分位数、中位数和第三四分位数组成,箱须又分为上箱须和下箱须。

    上箱须 = Q3 + whis * IQR

    下箱须 = Q1 - whis * IRQ

    在上箱须、下箱须范围以外的数据为离群值

    image-20220216112114255

bplot = plt.boxplot(testList,whis=whis,
widths=width,
sym="o",
labels=labels,
patch_artist=True,
vert = True, showfliers = True, notch = False)

whis——箱须位置(数据离群范围)

widths——箱体宽度

sym——离群数据点表示图形

patch_artist——是否给箱体上色(要给箱体上色,需要设为True)

vert——箱体方向:True为竖向,False为横向

showfliers——是否显示离群值

notch——箱体是否V型。True时为V型。

## 我们要对箱线图的返回值进行操作,这个返回值是一个字典数据结构,由于需要对箱体添加颜色,所以使用键“boxes”来调出键值“bplot["boxes"]”。最后,使用内置函数zip()生成元组列表zip(bplot["boxes"],colors),使用for循环对每个箱体进行颜色填充
colors = ["#1b9e77","#d95f02"]
for patch,color in zip(bplot["boxes"],colors):
patch.set_facecolor(color)
## 竖向箱线图
import matplotlib as mpl
mpl.rcParams["font.sans-serif"]=["FangSong"]
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="+", labels=labels, patch_artist=True,vert = True, showfliers = 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()
## 横向箱线图
import matplotlib as mpl
mpl.rcParams["font.sans-serif"]=["FangSong"]
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="+", patch_artist=True,vert = False, showfliers = True)
for patch,color in zip(bplot["boxes"],colors):
patch.set_facecolor(color)
plt.xlabel("随机数值")
plt.yticks(ticks= [1, 2], labels= labels, rotation = 90) ## 这里不把labels放到boxplot中,因为文字方向无法旋转。所以用yticks手动设置刻度标签
plt.title("生成器抗干扰能力的稳定性比较")
plt.grid(axis="y",ls=":",lw=1,color="gray",alpha=0.4)
plt.show()

image-20220216134222345

image-20220216134254370

posted @   徘徊彼岸花  阅读(245)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示