matplotlib
-
是一款用于数据可视化的Python软件包,支持跨平台运行,他能根据Numpy ndarray数组来绘制2D(3D)图像。
-
优点:
* Matplotib提供了了一个套面向绘图对象编程的ApI接口 * 依托于Python,借助Python的强大的可拓展性,Matplotlib可以在许多不同的环境中被使用 * 基于Matlab的和基于面向对象的,但是它完全免费 * Matplotlib实现了几乎是完全自主控制的图形定义功能
一、pyplot子库的基本使用
1、引入pyplot子库:
import matplotlib.pyplot as plt
2、plot函数(线型图or折线图)
plt.plot(x,y,format_string,**kwargs)
参数说明:
参数 | 说明 |
---|---|
x | X轴数据,列表或数组,可选。 |
y | Y轴数据,列表或数组。 |
format_string | 控制曲线的格式字符串,可选。 |
**kwargs | 第二组或更多(x,y,f,format_string) 当绘制多条曲线时,各条曲线的x不能省略。 |
format_string: 控制曲线的格式字符串,可选由颜色字符、风格字符和标记字符组成。
颜色字符 | 说明 |
---|---|
‘b’ | 蓝色 |
‘g’ | 绿色 |
‘r’ | 红色 |
‘c’ | 青绿色 cyan |
‘m’ | 洋红色 magenta |
‘y’ | 黄色 |
‘k’ | 黑色 |
‘w’ | 白色 |
‘0.8’ | 灰度值字符串 |
风格字符 | 说明 |
---|---|
‘-’ | 实线 |
‘–’ | 破折线 |
‘-.’ | 点划线 |
‘:’ | 虚线 |
‘’ ’ ’ | 无线条 |
标记字符 | 说明 |
---|---|
‘.’ | 点标记 |
‘o’ | 实心圈标记 |
‘^’ | 上三角标记 |
'*' | 星形标记 |
‘+’ | 十字标记 |
‘x’ | x标记 |
通常还可以使用如下的表示方式:
color: 控制颜色,color=‘green’
linestyle: 线条风格,lingstyle=‘dashed’
marker: 标记风格,marker=‘o’
markerfacecolor: 标记颜色,markerfacecolor=‘bule’
markersize: 标记尺寸,markersize=20
3、如何标题写中文
- 修改字体配置 plt.rcParams[“font.sans-serif”] 字体设置时,字体名称不区别大小写 \textcolor{red}{字体设置时,字体名称不区别大小写} 字体设置时,字体名称不区别大小写
中文字体 | 说明 |
---|---|
‘SimHei’ | 中文黑体 |
‘Kaiti’ | 中文楷体 |
‘LiSu’ | 中文隶书 |
‘FangSong’ | 中文仿宋 |
‘YouYuan’ | 中文幼圆 |
STSong | 华文宋体 |
- 当字体设置支持中文后,必须设置负号,否则当数值中出现负值时,负号无法正确显示
解决方式: plt.rcParams[‘axes.unicode_minus’] = False
字体问题总结:
plt.rcParams[“font.sans-serif”] = [‘SimHei’] (e.g)
plt.rcParams[‘axes.unicode_minus’] = False
4、pyplot的文本显示
(1)
函数 | 说明 |
---|---|
plt.xlabel() | 对X轴增加文本标签 |
plt.ylabel() | 对Y轴增加文本标签 |
plt.title() | 对图形整体增加文本标签 |
plt.text() | 在任意位置增加文本 |
plt.annotate() | 在图形中增加带箭头的注解 |
- fontsiz参数: 设置文字大小
- linewidth参数:设置线条宽度
(2)设置x轴和y轴的刻度
matplotlib.pyplot.xticks(ticks=None,labels=None, kwargs)
- ticks:此参数是xtick位置的列表,和一个可选参数。如果将一个空列表作为参数传递,则它将删除所有的xticks
(就是把坐标轴变成自己想要的样子) \textcolor{red}{(就是把坐标轴变成自己想要的样子)} (就是把坐标轴变成自己想要的样子)
- label:此参数包含放置在给定刻度线位置的标签。他是一个可选参数。
- **kwargs:此参数是文本属性,用于控制标签的外观
- rotation:旋转角度 如:rotation = 45
- color: 颜色 如:color = "red
(3)显示图表 show()
plt.show()
(4)图例 legend()
# 注意,在使用图例前为每个图形设置label参数
plt.plot(x,y,label = "xxxx")
# 默认会使用每个图形的label值作为图例中的说明
plt.lengend()
图例的图例位置设置
plt.lengend(loc=)
- loc代表了图例在整个坐标轴平面中的位置(一般选取’best’这个参数值)
- 第一种:默认是“best",图例自动’安家’在一个坐标面内的数据图标最少的位置
- 第二种:loc = ‘xxx’ 分别有0:‘best’ (自动寻找最好的位置)
位置字符串 | 位置值 | 备注 |
---|---|---|
“best” | 0 | 自动寻找最好的位置 |
“upper right” | 1 | 右上角 |
“upper left” | 2 | 左上角 |
“lower left” | 3 | 左下角 |
“lower right” | 4 | 右下角 |
“right” | 5 | 右边中间 |
“center left” | 6 | 左边中间 |
“center right” | 7 | 右边中间 |
“lower center” | 8 | 中间最下面 |
“upper center” | 9 | 中间最上面 |
“center” | 10 | 正中心 |
(5)显示每条数据的值 x,y值的位置
plt.text(x,y, string, fontsize = 15, verticalalignment = “top”, horizontalignment=“right”)
- x,y表示坐标值上的值
- string :表示说明文字
- fontsize:表示字体大小
- verticalalignment:(va)垂直对齐方式,参数:[‘center’|‘top’|‘bottom’|‘baseline’]
- hrrizontalalignment:(ha)水平对齐方式,参数:[‘center’|‘right’|‘left’]
二、其他元素可视性
1、显示网格:plt.grid()
plt.grid(True, linestyle = “–”,color = “gray”, linewidth = “0.5”, axis = ‘x’)
- linestyle : 线型
- color:颜色
- linewidth:宽度
- axis:x,y,both,显示x/y/两者的格网
2、plt.gca() 对坐表轴的操作
ax = plt.gca()
# 通过坐标轴spines,确定 top ,bottom, left
# 不需要右侧和上侧线条,则可以设置他的颜色
ax.spines['right'].set_color("none")
ax.spines['top'].set_color("none")
# 移动轴到指定位置
# 在这里,position位置参数有三种,data, outward, axes
# axes: 0.0-1.0之间的值,整个轴上的比例
# data 表示数值移动,其后的数字表示移动到Y轴的刻度值
ax.spines['left'].set_position(('axes',0.5))
三、柱状图的绘制
matplotlib.pyplot.bar(x, height, width: float = 0.8, bottom = None, *, align: str = 'center', data = None, **kwargs)
- x表示x坐标,数据类型为float类型,一般为np.arange()生成的固定步长列表
- height :表示柱状图的高度,也就是y坐标值,数据类型为float类型,一般为一个列表,包含生成柱状图的所有y值
- width :表示柱状图的宽度,取值在0~1之间,默认值为0.8
- bottom: 表示柱状图的起始位置,也就是y轴的起始坐标,默认值为None
- align :表示柱状图的中心位置,”center“,“lege”表示边缘,默认值为”center“
- color :表示柱状图颜色,默认为蓝色
- alpha :表示透明度,取值在0~1之间,默认为1
- label :表示标签,设置后需要调用ply.legend()生成
- edgecolor (ec):表示边框颜色
- linewidth(lw): 表示边框宽度,浮点数或类数组,默认为None
- tick_label :表示柱子的刻度标签,字符串或字符串列表,默认值为None。
- linestyle(ls):表示线条样式
1、基本的柱状图
import matplotlib.pyplot as plt
# x轴数据
x = range(5)
# y轴数据
data = [5,20,15,25,10]
# 设置图形标题
plt.title("基本柱状图")
# 绘制网格
plt.grid(ls = "--", alpha = 0.5)
# bar 绘制图形,x 表示x坐标 data表示柱状图的高度
plt.bar(x, data)
- 柱状图颜色
plt.bar(x, data, facecolor= "green")
plt.bar(x, data, color= ['r','g','b'])
f a c e c o l o r 和 c o l o r 设置单个颜色时使用方式一样 \textcolor{red}{facecolor和color设置单个颜色时使用方式一样} facecolor和color设置单个颜色时使用方式一样
c o l o r 可以设置多个颜色值, f a c e c o l o r 不可以 \textcolor{red}{color可以设置多个颜色值,facecolor不可以} color可以设置多个颜色值,facecolor不可以
2、同位置多柱状图
总体步骤: 先将x轴的文本转换为数值,再确定每一条柱子的位置,最后再将数值转换为文本。
e.g
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False
# 设置基本属性......
# .....省略
# 国家
countries = ['挪威','德国','中国','美国','瑞典']
# 金牌个数
gold_medal = np.array([16,12,9,8,8])
# 银牌个数
silver_medal = np.array([8,10,4,10,5])
# 铜牌个数
bronze_medal = np.array([13,5,2,7,5])
# 1、将x轴转换为数值
x = np.arange(len(countries))
# 2、设置图形的宽度
width = 0.2
# 3、确定x起始位置
# 金牌的起始位置
gold_x = x
# 银牌的起始位置
silver_x = x + width
# 铜牌的起始位置
bronze_x = x + 2*width
# 4、分别绘制图形
# 金牌图形
plt.bar(gold_x, gold_medal, width = width,color = "gold")
# 银牌图形
plt.bar(silver_x, silver_medal, width = width, color = "silver")
# 铜牌图形
plt.bar(bronze_x,bronze_medal,width = width, color = "saddlebrown")
# 5、将x的坐标变回来
# 注意x标签的位置未居中
plt.xticks(x + width,labels = countries)
# 6、显示高度文本
for i in range(len(countries)):
#金牌的文本设置
plt.text(gold_x[i], gold_medal[i], gold_medal[i],va="bottom", ha = "center")
plt.text(silver_x[i], silver_medal[i], silver_medal[i],va="bottom", ha = "center")
plt.text(bronze_x[i], bronze_medal[i], bronze_medal[i],va="bottom", ha = "center")
3、堆叠柱状图
总体步骤: 确定好每个柱子的bottom
e.g
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False
# 设置基本属性......
# .....省略
# 国家
countries = ['挪威','德国','中国','美国','瑞典']
# 金牌个数
gold_medal = np.array([16,12,9,8,8])
# 银牌个数
silver_medal = np.array([8,10,4,10,5])
# 铜牌个数
bronze_medal = np.array([13,5,2,7,5])
# 设置图形的宽度
width = 0.3
# 绘制图形
# 金牌图形
plt.bar(countries, gold_medal, color = "gold",label="金牌", bottom = silver_medal + bronze_medal,width = width)
# 银牌图形
plt.bar(countries, silver_medal, color = "silver", label="银牌", bottom = bronze_medal,width = width)
# 铜牌图形
plt.bar(countries, bronze_medal, color = "saddlebrown", label="铜牌",width = width)
# 设置坐标轴
plt.ylabel('奖牌数')
# 设置图例
plt.legend(loc='upper right')
# 设置文本值
for i in range(len(countries)):
max_y= bronze_medal[i] + silver_medal[i] +gold_medal[i]
plt.text(countries[i], max_y, max_y,va = "bottom", ha = "center")
4、水平柱状图
调用Matplotlib的bath()函数可以生成水平柱状图。
- barh()函数的用法与bar()函数的用法基本一样,只是在调用barh()函数时使用y参数传入Y轴数据,使用width参数传入代表条柱宽度的数据。
plt.barh(y, width, height = 0.8, left = None, *, align = 'center', **kwargs)
四、直方图 plt.hist()
- 柱状图和直方图的区别: \textcolor{red}{柱状图和直方图的区别:} 柱状图和直方图的区别:
柱状图 | 直方图 |
---|---|
柱状图一般用于描述离散型分类数据的对比 | 直方图一般用于描述连续型数据的分布关系 |
每根柱子宽度固定,柱子之间会有间距 | 每根柱子宽度可以不一样,且一般没有间距 |
横轴变量可以任意排序 | 横轴变量有一定顺序规则 |
plt.hist(x, bins=None, range=None, density=None, weights=None, cumulative=False, bottom=None, histtype='bar',align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, normed=None, *, data=None, **kwargs )
- x: 作直方图所要用的数据,必须是一维数组;多维数组可以先进行扁平化再作图;必选参数;
- bins:直方图的柱数,即要分的组数,默认为10;
- weights 与x形状相同的权重数组;将x中的每个元素乘以对应权重值再计数;如果normed或density取值为True,则会对权重进行归一化处理。这个参数可用于绘制已合并的数据的直方图;
- density:布尔,可选。如果"True",返回元组的第一个元素将会将计数标准化以形成一个概率密度,也就是说,直方图下的面积(或积分)总和为1。这是通过将计数除以数字的数量来实现的观察乘以箱子的宽度而不是除以总数数量的观察。如果叠加也是"真实"的,那么柱状图被规范化为1。(替代normed)
- bottom:数组,标量值或None;每个柱子底部相对于y=0的位置。如果是标量值,则每个柱子相对于y=0向上/向下的偏移量相同。如果是数组,则根据数组元素取值移动对应的柱子;即直方图上下便宜距离;
- histtype:(‘bar’, ‘barstacked’, 'step,‘stefille’条形方stepfilled’是有填充的直方图;当histtype取值为’step’或’stepfilled’,rwidth设置失效,即不能指定柱子之间的间隔,默认连接在一起;
- align: {‘left’, ‘mid’, ‘right’};‘left’:柱子的中心位于bins的左边缘;‘mid’:柱子位于bins左右边缘之间;‘right’:柱子的中心位于bins的右边缘;
- color:具体颜色,数组(元素为颜色)或None。
- label:字符串(序列)或None;有多个数据集时,用label参数做标注区分;
- normed:是否将得到的直方图向量归一化,即显示占比,默认为0,不归一化;不推荐使用,建议改用density参数;
- edgecolor:直方图边框颜色;
- alpha:透明度;
*** e.g***
# 使用numpy随机生成300个随机数据
x_value = np.random.randint(140,180,300)
# 绘制直方图,第一个参数时数据
plt.hist(x_value, bins = 10, edgecolor = 'white')
1、返回值
- num:数组或数组列表
- 直方图的值
- bins:数组
- 返回各个bin的区间范围
- patches:返回每个bin里面包含的数据,是一个list
num, bins, patches = plt.hist(x_value, bins = 10, edgecolor = 'white')
num
# 输出:array([14., 19., 11., 11., 24., 18., 13., 15., 14., 15., 12., 17., 8.,
22., 13., 10., 15., 17., 13., 19.])
bins
# 输出:array([140. , 143.9, 147.8, 151.7, 155.6, 159.5, 163.4, 167.3, 171.2,
175.1, 179. ])
for p in patches:
print(p)
print(p.get_x())
print(p.get_y())
print(p.get_height())
# 输出:Rectangle(xy=(140, 0), width=3.9, height=33, angle=0)
140.0
0.0
33.0
Rectangle(xy=(143.9, 0), width=3.9, height=22, angle=0)
143.90000000000003
0.0
22.0
Rectangle(xy=(147.8, 0), width=3.9, height=42, angle=0)
147.8
0.0
42.0
Rectangle(xy=(151.7, 0), width=3.9, height=28, angle=0)
151.7
0.0
28.0
Rectangle(xy=(155.6, 0), width=3.9, height=29, angle=0)
155.60000000000002
0.0
29.0
Rectangle(xy=(159.5, 0), width=3.9, height=29, angle=0)
159.5
0.0
29.0
Rectangle(xy=(163.4, 0), width=3.9, height=30, angle=0)
163.40000000000003
0.0
30.0
Rectangle(xy=(167.3, 0), width=3.9, height=23, angle=0)
167.3
0.0
23.0
Rectangle(xy=(171.2, 0), width=3.9, height=32, angle=0)
171.2
0.0
32.0
Rectangle(xy=(175.1, 0), width=3.9, height=32, angle=0)
175.10000000000002
0.0
32.0
2、添加折线直方图
在直方图中,我们也可以加一个折线图,辅助我们查看数据变化情况
-
首先通过pyplot.subplots()创建axes对象
-
通过axes对象调用hist()方法绘制直方图,返回折线图所需要的下x.y数据
-
然后axes对象调用plot()绘制折线图
# 创建一个画布 fig,ax= plt. subplots() # 绘制直方图 num, bins_limit, patches = ax. hist(x_value,bins=10, edgecolor='white') # 注意num返回的个数是10,bins_limit返回的个数为11,需要截取 print (bins_limit[:10]) # 曲线图 ax.plot(bins_limit[:10],num, '--',marker="o") # 若想显示后面部分的折线(即 175~180部分) # ax.plot(bins_limit, np.append(num, num[-1]), '--',marker="o",)
3、不等距分组
只需要确定分组上下限,,并指定 histtype = “bar” 就可以
*** e.g***
fig , ax = plt.subplots()
x= np.random.normal(100,20,100) # 均值和标准差
bins = [50, 60, 70, 90, 100, 110, 140, 150]
ax.hist(x,bins, color='g', edgecolor='white')
plt.show()
4、多类型直方图
- 可以以列表形式传入多种数据给hist()方法的x数据
# 分别生成10000, 5000, 2000个值
x_multi = [np.random.randn(n) for n in [10000, 5000, 2000]]
ax.hist(x_multi,........) (省略)
5、堆叠直方图
- 直方图属性data:以列表的形式传入两组数据
- 设置直方图stacked:为True,允许数据覆盖
五、饼状图 pie()
饼状图用来显示一个数据系列,具体来说,饼状图显示一个数据系列中各项目的占项目总和的百分比。
可使用x/sum(x)来计算各个扇形区域占饼图总和的百分比。
pyplot. pie (x,explode-None, labels-None, colors-None, autopct=None)
pie()函数的参数说明如下:
- x:数组序列,数组元素对应扇形区域的数量大小。
- labels: 列表字符串序列,为每个扇形区域备注一个标签名字。
- colors; 为每个扇形区域设置颜色,默认按照颜色周期自动设置。
- autopct: 格式化字符串"fmt%pct",使用百分比的格式设置每个扇形区的标签,并将其放置在扇形区内。
- pctdistance:设置百分比标签与圆心的距离;
- labeldistance:设置各扇形标签(图例)与圆心的距离;
- explode:指定饼图某些部分的突出显示,即呈现爆炸式;()
- shadow:是否添加饼图的阴影效果
*** e.g***
# 设置大小
plt.rcParams['figure.figsize'] = (5,5)
# 定义饼的标签
labels = ['娱乐','育儿','饮食','房贷','交通','其他']
# 每个标签所占的数量
x = [200,500,1200,7000,200,900]
# 绘制饼图
plt.pie(x,labels = labels)
1、百分比显示 percentage
autopct
plt.pie(x,labels = labels, autopct = '%.2f%%')
2、饼状图的分离
explode:指定饼图某些部分的突出显示
# 饼图分离
explode = (0.03, 0.05, 0.06 ,0.04, 0.08, 0.1)
# 设置阴影效果
plt.pie(x,labels = labels,autopct='%3.2f%%',explode = explode)
3、设置饼状图百分比和文本距离中心位置:
- pctdistance:设置百分比标签与圆心的距离
- labeldistance:设置各扇形标签(图例)与圆心的距离
4、设置x、y的刻度一样,使其饼图为正圆
plt.axis(‘equal’)
六、散点图 scatter()
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None,vmin=None, vmax=None, alpha=None, linewidths=None, , edgecolors=None, plotnonfinite=False,data-None, *kwargs)
- x, y→散点的坐标
- S→散点的面积
- C→散点的颜色(默认值为蓝色,‘b’,其余颜色同plt.plot())
- marker→散点样式(默认值为实心圆,‘o’,其余样式同plt.plot( ))
- alpha → 散点透明度([0,1]之间的数,0表示完全透明,1则表示完全不透明)
- linewidths→散点的边缘线宽
- edgecolors→ 散点的边缘颜色
- cmap→ Colormap,默认None,标量或者是一个colormap的名字,只有c是一个浮点数数组的时才使用
*** e.g***
# x轴数据
x= np.array([1,2,3,4,5,6,7,8])
# y轴数据
y = np.array([1,4,9,16,7,11,23,18])
plt.scatter(x,y)
七、雷达图
*** e.g***
#各个属性值
feature = ['语文','数学','英语','物理','化学','生物']
value = np.array([95,96,98,85,79,85])
# 设置每个数据点的显示位置,在雷达图上用角度表示
angles=np.linspace(0, 2*np.pi,len(feature), endpoint=False)
angles=np.concatenate((angles,[angles[0]]))
feature = np.concatenate((feature,[feature[0]]))
# 绘图
fig=plt.figure(facecolor='white')
subject_label = ['Li Hua']
# 拼接数据首尾,使图形中线条封闭
values=np.concatenate((value,[value[0]]))
print(values)
# 设置为极坐标格式
ax = fig.add_subplot(111, polar=True)
# 绘制折线图
ax.plot(angles, values, 'o-', linewidth=1,label=subject_label[0])
# 填充颜色
ax.fill(angles, values, alpha=0.25)
# 设置图标上的角度划分刻度,为每个数据点处添加标签
ax.set_thetagrids(angles * 180/np.pi, feature)
# 设置雷达图的范围
ax.set_ylim(0,100)
# 添加标题
plt.title('学生的成绩分布雷达图')
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=1,frameon=False)
1、np.linspace() (创建等差数列)
np.linspace 的作用就是将圆 (2pi)分成了n等份,即例子对应的6个科目,6份。
- 若将endpoint设置成True,2pi 就会包括进去,这将会导致首尾重合。因此需要制定endpoint=False这个选项,否则会默认endpoint=True。
2、np.concatenate()
这个命令用于数组的拼接。
angles = np.concatenate((angles,[angles[0]]))
- 相当于把angles数组和angles[0]进行沿水平方向拼接。
- 拼接数据首尾,使图形中线条封闭
3、ax.set_thetagrids(angles * 180/np.pi, feature)
作用:就是加上刻度的作用,与plt.xticks 或 ax.set_xticks作用相同。
4、ax.fill(angles, values, alpha=0.25)用于填充颜色
八、热力图
m a t p l o t l i b . c m \textcolor{red}{matplotlib.cm} matplotlib.cm是Matplotlib中的一个模块,它提供了一组用于处理颜色映射(colormap)的函数和类。颜色映射是一种将数值映射到颜色的方法,常用于制作热力图、等值线图、散点图等。
matplotlib.cm 中包含了多种不同的 colormap(颜色映射),常用的 colormap 包括:
- viridis
- plasma
- inferno
- magma
- cividis
- jet
- rainbow
- coolwarm
- Greys
- Blues
- Greens
- Oranges
- Reds
1、viridis:一种从深蓝色到黄色的颜色映射,通常用于温度图或流场图。
e.g
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2 * np.pi, 100)
y = np.linspace(0, 2 * np.pi, 100).reshape(-1, 1)
z = np.sin(x) + np.cos(y)
fig, ax = plt.subplots()
im = ax.imshow(z, cmap='viridis')
fig.colorbar(im)
plt.show()
2、 plasma:一种从暗紫色到亮黄色的颜色映射,通常用于高对比度的数据可视化。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2 * np.pi, 100)
y = np.linspace(0, 2 * np.pi, 100).reshape(-1, 1)
z = np.sin(x) + np.cos(y)
fig, ax = plt.subplots()
im = ax.imshow(z, cmap='plasma')
fig.colorbar(im)
plt.show()
3、cool:一种从蓝色到青色的颜色映射,通常用于温度变化的可视化。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2 * np.pi, 100)
y = np.linspace(0, 2 * np.pi, 100).reshape(-1, 1)
z = np.sin(x) + np.cos(y)
fig, ax = plt.subplots()
im = ax.imshow(z, cmap='cool')
fig.colorbar(im)
plt.show()