目录
Matplotlib简介
matplotlib
是
Python
的
2D
&
3D
绘图库。
可以处理数学运算、绘制图表,或者在图像上绘制点、直线和曲线。
matplotlib
通过
pyplot
模块提供了和
MATLAB
类似的绘图
API
,将众多绘图对象所构成的复杂结构隐藏在这套API
内部。
安装
matplotlib
之前先要安装
numpy
。
matplotlib
是开源库,可以从
https://matplotlib.org/
下载。
最好将输入数据转换为
np.array
类型
matplotlib
库由各种可视化类构成,内部结构复杂,受
Matlab
启发。
matplotlib.pyplot
是绘制各类可视化图形的命令子库,相当于快捷方式。
导入matplotlib模块
import matplotlib.pyplot as plt
图的参数说明
axes: 设置坐标轴边界和表面的颜色、坐标刻度值大小和网格的显示
figure:
控制
dpi
、边界颜色、图形大小、和子区
( subplot)
设置
font:
字体集(font family)、字体大小和样式设置grid: 设置网格颜色和线性
legend: 设置图例和其中的文本的显示
line:
设置线条(颜色、线型、宽度等)和标记
patch:
是填充
2D空间的图形对象,如多边形和圆。控制线宽、颜色和抗锯齿设置等。
savefig: 可以对保存的图形进行单独设置。例如,设置渲染的文件的背景为白色
verbose:
设置
matplotlib
在执行期间信息输出,如
silent
、
helpful
、
debug和debug-annoying。
xticks
和
yticks:
为
x,y轴的主刻度和次刻度设置颜色、大小、方向,以及标签大小
matplotlib图像组成部分介绍
matplotlib绘图步骤分析
① 创建窗口、设置子图,每个figure
对象是一个图
② 绘制图形
plot
、设置横纵坐标等参数
③ 图形展示及保存
matplotlib实现简单图像
import matplotlib.pyplot as plt
import numpy as np
# 定义 x 变量的范围 (-3,3) 数量 50
x=np.linspace(-3,3,50)
y=x**2
plt.figure()
plt.plot(x, y)
plt.show()
matplotlib画布
画布-plt.figure()
plt.figure(num=None,figsize=None,dpi=None,facecolor=None,edgecolor=None, frameon=True)
•
num:
图像编号或名称,数字为编号 ,字符串为名称
•
figsize:
指定
figure
的宽和高,单位为英寸;
•
dpi
参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为
80 1
英寸等于
2.5cm
,
A4纸是 21*30cm
的纸张
•
facecolor:
背景颜色
•
edgecolor:
边框颜色
•
frameon:
是否显示边框
实例
import matplotlib.pyplot as plt
fig=plt.figure(num="蓝色背景",figsize=(4,3),facecolor="blue")
plt.show()
fig=plt.figure(num="红色背景",figsize=(4,3),facecolor="red")
plt.show()
同一画布制作多张图像
① 确定区域
plt.figure().add_subplot(*)
② 制作子图
plt.subplot(*)
创建多个子图
plt.figure(**). add_subplot(nrows, ncols, index, **kwargs)plt.figure(**). add_subplot(pos, **kwargs)
•
子图将采用
nrows * ncols
的网格上的
index
位置
•
pos
是一个三位整数,其中第一个数字是行数,第二个数字是列数和第三个数字是子图的索引。
•
例如:
plt.figure(**). add_subplot(235)
与
plt.figure(**). add_subplot(2,3,5)
等价
实例
import matplotlib.pyplot as plt
fig = plt.figure()
axl = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
plt.show()
import matplotlib.pyplot as plt
fig = plt.figure()
axl = fig.add_subplot(121)
ax2 =fig.add_subplot(122)
ax2.axis(“off”) #不显示第二个子图
plt.show()
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
axl = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
plt.plot(np.random.randn(50).cumsum(), 'k--')
#默认最后一个子图
plt.show()
图像默认绘制在最后一个子图上面
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
ax1.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)
ax2.scatter(np.arange(30), np.arange(30) + 3 * np.random.randn(30))
plt.show()
plt.subplots
matplotlib
有一个更为方便的方法
plt.subplots
,它可以创建一个新的
Figure
,
并返回一个含有已创建的
subplot
对象的
NumPy
数组。
>>> fig, axes = plt.subplots(2, 3)
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7fb626374048>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7fb62625db00>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7fb6262f6c88>],
[<matplotlib.axes._subplots.AxesSubplot object at 0x7fb6261a36a0>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7fb626181860>,
<matplotlib.axes._subplots.AxesSubplot object at 0x7fb6260fd4e0>]], dtype
=object)
相关参数
plt.subplots(nrows=1, ncols=1, *, sharex=False, sharey=False, subplot_kw=None, **fig_kw)
参数
| 说明 |
nrows
|
subplot
的行数
|
ncols
|
subplot
的列数
|
sharex
|
所有
subplot
应该使用相同的
X
轴刻度
(
调节
xlim
将会影响所有
subplot)
|
sharey
|
所有
subplot
应该使用相同的
Y
轴刻度
(
调节
ylim
将会影响所有
subplot)
|
subplot_ kw
|
用于创建各
subplot
的关键字字典
|
**fig_ kw
|
创建
figure
时的其他关键字,如
plt.subplots(2,2,figsize=(8,6))
|
调整subplot周围的间距
默认情况下,matplotlib 会在 subplot 外围留下一定的边距,并在 subplot 之间留下一定的间距。间距跟图像的高度和宽度有关,因此,如果你调整了图像大小(不管是编程还是手工),间距也会自动调整。利用 Figure 的 subplots_adjust方法可以轻而易举地修改间距。
plt.subplots_adjust(left=None,bottom=None,right=None,top=None,wspace=None, hspace=None
•
left:
此参数是该图子图的左侧。
•
right:
此参数是该图子图的右侧。
•
bottom:
此参数是该图子图的底部。
•
top:
此参数是该图子图的顶部。
•
wspace:
此参数是为子图之间的空间 保留的宽
度量,表示为平均轴宽度的 一部分。
•
hspace:
此参数是为子图之间的空间保 留的高
度量,表示为平均轴高度的一 部分。
•
注意这些值都是
0
到
1
之间的值,代表 百分比。
实例
import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(2, 2, sharex=True, sharey=True)
for i in range(2):
for j in range(2):
axes[i, j].hist(np.random.randn(500))
plt.subplots_adjust(wspace=0.2, hspace= 0)
plt.show()
plot函数
plt.plot(x, y, format_string, **kwargs)
可以绘制点和线, 并且对其样式进行控制
tip:当绘制多条曲线时各条曲线的x不能省略
format_string参数
颜色字符
标记字符
风格字符
效果图
简单案例
单个图像
plt.plot([3,1,2,5,4])
plt.show()
多个图像
import numpy as np
import matplotlib.pyplot as plt
a=np.arange(10)
plt.plot(a, a*1.5,a, a*2.5, a*3.5) #横坐标相同
plt.show()
完整案例
import numpy as np
import matplotlib.pyplot as plt
x=np.arange(10)
y1=x*1.5;
y2=x*2.5;
y3=x*3.5;
y4=x*4.5
plt.figure()
plt.plot(x,y1,’go-',x,y2,'rx',y3,'*',x,y4,'b-.’)
plt.show()
更多参数设定
设置标题、轴标签、刻度及刻度标签
函数 | 说明 |
set_title(*)
|
设定图像的标题
|
plt.set_xticks(ticks=None, labels=None)
|
设定
X
轴数据刻度以及标签
|
set_xticklabels(*,*)
|
设定
X
轴刻度的标签
|
set_xlabel(*,*)
|
设定
X
轴的名称
|
plt.set_yticks(ticks=None, labels=None)
|
设定
Y
轴数据刻度以及标签
|
set_yticklabels(*,*)
|
设定
Y
轴刻度的标签
|
set_ylabel(*,*)
|
设定
Y
轴的名称
|
实例
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(np.random.randn(1000).cumsum())
ticks = ax.set_xticks([0, 250, 500, 750, 1000])
labels = ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'],rotation=30,
fontsize='small')
ax.set_title('My first matplotlib plot')
plt.show()
注释
matplotlib.pyplot.text()
plt.text(x, y, s, fontdict=None, **kwargs)
功能用于将文本添加到数据坐标中x,y位置的轴上。
参数 | 描述 |
x
,
y
:
float
|
放置文本的位置。默认情况下,这是在数据坐标中。
可以使用变换参数来更改坐标系。
|
s
:
str
|
文本。
|
fontdict
:
dict
默认无
|
用于覆盖默认文本属性的字典。如果
fontdict
为
None
则默认值由
rcParams
确定。
|
**
夸克
| 文字属性 |
实例
import numpy as np
import matplotlib.pyplot as plt
t = np.arange(0.0, 2.0, 0.01)
s = np.sin(2*np.pi*t)
plt.plot(t, s)
plt.title(r'$\alpha_i > \beta_i$', fontsize=20)
plt.text(1, -0.6, r'$\sum_{i=0}^\infty x_i$', fontsize=20)
plt.text(0.6, 0.6, r'$\mathcal{A}\mathrm{sin}(2 \omega t)$',fontsize=20)
plt.xlabel('time (s)')
plt.ylabel('volts (mV)')
plt.show()
tip:图片内部的字体需要掌握一定的Latex语言才可以
在图中添加箭头
plt.arrow(x, y, dx, dy, **kwargs)
作用是向子图中添加箭头
• x, y : 箭头起点坐标
• dx, dy : 箭头x上的长度和y轴上的长度
• width:箭头尾部的宽度。类型为浮点数,默认值为0.001。
• head_width:完全箭头头部的宽度。类型为浮点数或None,默认值为3*width。
• head_length:完全箭头头部的长度。类型为浮点数或None,默认值为
• 1.5*head_width
实例
import matplotlib.pyplot as plt
fig,axes=plt.subplots(3,4)
axes[0,0].arrow(0,0,1,1)
axes[0,1].arrow(0,0,1,1,width=0.2,head_width=0.5)
axes[0,2].arrow(0,0,1,1,width=0.2,head_width=0.5,head_length=0.2)
axes[0,3].arrow(0,0,1,1,width=0.2,head_width=0.5,head_length=0.2,length_includes_head=True)
axes[1,0].arrow(0,0,1,1,width=0.2)
axes[1,1].arrow(0,0,1,1,width=0.2,shape='full')
axes[1,2].arrow(0,0,1,1,width=0.2,shape='left')
axes[1,3].arrow(0,0,1,1,width=0.2,shape='right')
axes[2,0].arrow(0,0,1,1,width=0.2)
axes[2,1].arrow(0,0,1,1,width=0.2,overhang=0.2)
axes[2,2].arrow(0,0,1,1,width=0.2)
axes[2,3].arrow(0,0,1,1,width=0.2,head_starts_at_zero=True)
plt.show()
边框设定
隐藏右边框和上边框
•
使用
plt.gca
获取当前坐标轴信息。
•
使用
.spines
分别设置边框右侧边框和上边框,并用
.set_color
设置边框颜色:默认白色;
ax=plt.gca()
# right 、 top 、 bottom 、 left
ax.spines[‘right’].set_color('none')
ax.spines['top'].set_color('none')
添加定制图像
matplotlib.axes.Axes.add_patch(p)
matplotlib
有一些表示常见图形的
对象。这些对象被称为块(
patch
),
其中有些(如
Rectangle
和
Circle
)。要在图表中添加一个 图
形,你需要创建一个块对象
shp
,
然后通过
ax.add_patch(shp)
将其
添加到
subplot
中
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
rect = plt.Rectangle((0.2, 0.75), 0.4, 0.15, color='k', alpha=0.3)
circ = plt.Circle((0.7, 0.2), 0.15, color='b', alpha=0.3)
pgon = plt.Polygon([[0.15, 0.15], [0.35, 0.4], [0.2, 0.6]],color='g', alpha=0.5)
ax.add_patch(rect)
ax.add_patch(circ)
ax.add_patch(pgon)
plt.show()
pyplot文本显示函数
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,5,0.02)
plt.plot(x,np.cos(2*np.pi*x),'r--')
plt.xlabel('横轴:时间',fontproperties='SimHei',fontsize=15,color='green')
plt.ylabel('纵轴:振幅',fontproperties='SimHei',fontsize=15)
plt.title(r'正弦波实例$y=cos(2\pix)$',fontproperties='SimHei',fontsize=25)
plt.show()
在有中文输出的处增加一个属性:fontproperties
图例
ax.legend([line1, line2, line3], labels=['label1', 'label2’, 'label3'],lloc='lower right', fontsize=12, frameon=True, title=None)
实例
import matplotlib.pyplot as plt
import numpy as np
from numpy.random import randn
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(randn(1000).cumsum(), 'k', label='one')
ax.plot(randn(1000).cumsum(), 'k--', label='two')
ax.plot(randn(1000).cumsum(), 'k.', label='three')
ax.legend(labels=["1","2","3"],loc='best')
plt.show()
更多参数设定
设置图例边框及背景
•
plt.legend(loc=‘best’,frameon=False) #
去掉图例边框
•
plt.legend(loc=‘best’,edgecolor=‘blue’) #
设置图例边框颜色
•
plt.legend(loc='best',facecolor='blue') #
设置图例背景颜色
,
若无边框
,
参数无效
设置图例标题
•
plt.legend(loc='best',title='figure 1 legend') #
去掉图例边框
设置位置
•
0: ‘best‘
1: ‘upper right‘
2: ‘upper left‘
3: ‘lower left‘
4: ‘lower right'
5: ‘right‘
6: ‘center left‘
7: ‘center right
'8: ‘lower center'
9: ‘upper center‘
10: ‘center'
同一窗口生成多个图
plt.subplot(nrows, ncols, plot_number)
在全局绘图区域中创建一个分区体系,并定位到一个子绘图区域。
plt.subplot(3,2,4)或plt.subplot(324)
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 100)
plt.subplot(221) #作图1
plt.plot(x, x)
plt.subplot(222) #作图2
plt.plot(x, -x)
plt.subplot(223) #作图3
plt.plot(x, x ** 2)
plt.grid(color='r', linestyle='--', linewidth=1,alpha=0.3)#作图4
plt.subplot(224)
plt.plot(x, np.log(x))
plt.show()
不均衡布局
plt.subplot2grid(shape, loc, rowspan, colspan)
参数shape 所划定的网格布局作为绘图区域以实现在参数loc 位置处绘制图形的目的。其中,shape,loc取值均为元组。
ax1 = plt.subplot2grid((3,3), (0,0), colspan=3)
ax2 = plt.subplot2grid((3,3), (1,0), colspan=2)
ax3 = plt.subplot2grid((3,3), (1, 2), rowspan=2)
ax4 = plt.subplot2grid((3,3), (2, 0))
ax5 = plt.subplot2grid((3,3), (2, 1))
plt.suptitle("subplot2grid")
import matplotlib.pyplot as plt
import numpy as np
import math
x = np.arange(1,10)
a1 = plt.subplot2grid((3,3),(0,0),colspan = 2)
a1.plot(x, np.exp(x))
a1.set_title(‘指数’
,fontproperties='SimHei',fontsize=15)
a2 = plt.subplot2grid((3,3),(0,2), rowspan = 3)
a2.plot(x, x*x)
a2.set_title(‘平方’
,fontproperties='SimHei',fontsize=15)
a3 = plt.subplot2grid((3,3),(1,0),rowspan = 2, colspan = 2)
a3.plot(x, np.log(x))
a3.set_title(‘log’)
plt.tight_layout(); plt.suptitle("subplot2grid")
plt.show()
图的保存
plt.savefig() #函数plt.show()之前调用,否则空白
将输出图形存储为文件,默认
PNG
格式,可以通过
dpi
修改输出质量。
支持格式:
eps, pdf, pgf, png, ps, raw, rgba, svg, svgz
x = np.arange(1, 11)
a=plt.plot(x,2*x,x,3*x)
plt.legend(['a','b'])
plt.savefig('text.eps',dpi=600)
plt.show()
基础图标函数
散点图
散点图也叫
X-Y
图,它将
所有的数据以点的形式展
现在直角坐标系 上,以显
示变量之间的相互影响程
度,点的位置由变量的数
值决定。
通过观察散点图上数据点
的分布情 况,我们可以推
断出变量间的相关性。
plt.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None,vmin=None, vmax=None, alpha=None, linewidths=None,verts=None,edgecolors=None, hold=None, data=None, **kwargs)
•
x
,
y
:输入数据,
array_like
,
shape
(n,)
•
s
:点的大小
,
标量或
array_like
,
shape
(n,),可选大小以点数
^ 2
。
•
c
:点的颜色
•
marker
:点的形状
cmap
:
cmap
仅在
c
是浮点数组时使用。如果没有,默认为
rcimage.cmap
。
norm
:实例用于缩放亮度数据为
0,1
。
norm
只有在
c
是一个数组时才被使用 彩车。alpha
:标量, 可选,默认值:无
alpha
混合值,介于
0
(透明)和
1
(不透明)之间, linewidths
:标量或
array_like
,可选,默认值:无 如果无,则默认为 (lines.linewidth
,)。
verts
:(x,
y
)的序列,可选 如果
marker
为
None
,这些顶点将用于构建标记。标记的中心位于 在(0,0
)为标准化单位。整体标记重新调整 由
s
完成。
•
edgecolors
:颜色或颜色顺序。
scatter(x, y, s=None, c=None, marker=None, alpha=None)
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(222)
x=np.random.rand(20)
y=np.random.rand(20)
s = np.array(range(10,110,5))
c = np.array(range(0,20))
plt.scatter(x, y,s=s, c=c)
plt.colorbar()
plt.show()
plt.colorbar
颜色条是从标量值到颜色的映射的可视化。在
Matplotlib
中,被绘制到专用轴。matplotlib的
pyplot
模块中的
colorbar()
函数将色条添加到指示色标的图
plt.colorbar(mappable=None, cax=None, ax=None, **kwarg)
•
cax:
指定颜色条绘制的轴
•
ax:
此参数是可选参数,它包含轴或轴列表。
•
** kwarg(
关键字参数
)
:此参数是可选参数,有两种:
colorbar
properties:extend:{‘neither’, ‘both’
,‘
min’, ‘max’}
的尖头超出范围值。
label:
彩条的长轴上的标签。刻度:没有或没有刻度或定位器列表。返 回值:colorbar
是
“
matplotlib.colorbar.Colorbar”
类的实例
import matplotlib.pyplot as plt
fig, axes = plt.subplots(nrows=2, ncols=2)
for ax in axes.flat:
im = ax.imshow(np.random.random((10, 10)), vmin=0, vmax=1)
plt.colorbar(im, ax=axes.ravel().tolist())
plt.show()
柱状图和直方图
柱状图=条形图
1. 柱状图一般用于描述离散型分类数据的对比
2. 每根柱子宽度固定,柱子之间会有间距
3. 横轴变量可以任意排序
直方图
1. 直方图一般用于描述连续型数据的分布关系
2. 每根柱子宽度可以不一样,且一般没有间距
3. 横轴变量有一定顺序规则
柱状图
基础柱状图,使用垂直或水平的柱子显示类别之间的数值比较。其中一个轴表示
需要对比的分类维度,另一个轴代表相应的数值。
适合应用到分类数据对比
分类太多不适合使用
纵向柱状图
不适合表示趋势
柱状图plt.bar
plt.bar(left, height, width=0.8, bottom=None, hold=None, data=None, **kwargs)
柱状图实例
import matplotlib.pyplot as plt
import numpy as np
data_X = ['l1', 'l2', 'l3', 'l4', 'l5']
data_Y = [0.96332673, 0.41957767, 0.28530194, 0.66399872, 0.39162668]
data_Y1 = [0.95827706, 0.570968, 0.1820442, 0.6373498, 0.3974183]
x = np.arange(len(data_X)) # 设定步长
width = 0.4 # 设置数据条宽度
fig, ax = plt.subplots()
p1 = ax.bar(x - width / 2, data_Y, width)
p2 = ax.bar(x + width / 2, data_Y1, width)
ax.set_xticks(x)
ax.set_xticklabels(data_X)
plt.show()
堆叠柱状图实例
import matplotlib.pyplot as plt
import numpy as np
data_X = ['l1', 'l2', 'l3', 'l4', 'l5']
data_Y = [0.96332673, 0.41957767, 0.28530194, 0.66399872, 0.39162668]
data_Y1 = [0.95827706, 0.570968, 0.1820442, 0.6373498, 0.3974183]
data_Y2 = [0.52999985, 0.54202189, 0.6418166, 0.69023167, 0.90743048]
x = np.arange(len(data_X)) # 设定步长
p1 = plt.bar(x, data_Y )
p2 = plt.bar(x, data_Y1, bottom=data_Y)#bottom 为数据条距坐标轴的距离
p3 = plt.bar(x, data_Y2, bottom=[data_Y1[i]+data_Y[i] for i in range(min(len(data_Y1),len(data_Y)))])
plt.xticks(x, data_X)
plt.show()
双向柱状图
import matplotlib.pyplot as plt
import numpy as np
data_X = ['l1', 'l2', 'l3', 'l4', 'l5']
data_Y = [0.96332673, 0.41957767, 0.28530194, 0.66399872, 0.39162668]
data_Y1 = [0.95827706, 0.570968, 0.1820442, 0.6373498, 0.3974183]
data_Y2 = [0.52999985, 0.54202189, 0.6418166, 0.69023167, 0.90743048]
x = np.arange(len(data_X)) # 设定步长
p1 = plt.bar(x, data_Y)
p2 = plt.bar(x, [-data_Y1[i] for i in range(len(data_Y1))])#将数据取成负数
plt.xticks(x, data_X)
plt.show()
柱状图和直方图:柱状图实例
rects1 = ax.bar(index, means_men, bar_width,
alpha=opacity, color='b',
yerr=std_men, error_kw=error_config,
label='Men')
rects2 = ax.bar(index + bar_width, means_women, bar_width,
alpha=opacity, color='r',
yerr=std_women, error_kw=error_config,
label='Women')
水平柱状图
plt.barh(y, width, height=0.8, left=None, *, align=’center’, **kwargs)
水平柱状图实例
import numpy as np
import matplotlib.pyplot as plt
data_X = ['l1', 'l2', 'l3', 'l4', 'l5']
data_Y = [0.96332673, 0.41957767, 0.28530194, 0.66399872, 0.39162668]
plt.barh(data_X, data_Y)
plt.show()
直方图
直方图牵涉统计学的概念,首先要对数据进行分组,然后统计每个分组内数据元的数量。 在平面直角坐标系中,横轴标出每个组的端点,纵轴表示频数,每个矩形的高代表对应的频数,频数乘以组距的计算过程得出每个分组的数量,同一个直方图的组距是一个固定不变的值,所以如果直接用纵轴表示数量,每个矩形的高代表对应的数据元数量,既能保持分布状态不变,又能直观的看出每个分组的数量。
plt.hist
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)
•x
:指定要绘制直方图的数据;输入值,这需要一个数组或者一个序列,不需要长度相同的数组。
•bins
:指定直方图条形的个数;
•range
:指定直方图数据的上下界,默认包含绘图数据的最大值和最小值;
•density
:布尔
,
可选。如果
"True"
,返回元组的第一个元素将会将计数标准化以形成一个概率密度, 也就是说,直方图下的面积(或积分)总和为1
。这是通过将计数除以数字的数量来实现的观察乘以箱子的宽度而不是除以总数数量的观察。如果叠加也是“真实”的,那么柱状图被规范化为1。
(
替代normed)
•
weights
:该参数可为每一个数据点设置权重;
•
cumulative
:是否需要计算累计频数或频率;
•
bottom
:可以为直方图的每个条形添加基准线,默认为
0
;
•
histtype
:指定直方图的类型,默认为
bar
,除此还有’
barstacked’, ‘step’, ‘stepfilled’
;
•
align
:设置条形边界值的对其方式,默认为
mid
,除此还有’
left’
和’
right’
;
•
orientation
:设置直方图的摆放方向,默认为垂直方向;
•
rwidth
:设置直方图条形宽度的百分比;
•
log
:是否需要对绘图数据进行
log
变换;
•
color
:设置直方图的填充色;
直方图实例
import matplotlib.pyplot as plt
# matplotlib.axes.Axes.hist() 方法的接口
n, bins, patches = plt.hist(x=d, bins='auto', color='#0504aa',
alpha=0.7, rwidth=0.85)
plt.grid(axis='y', alpha=0.75)
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('My Very Own Histogram')
plt.text(23, 45, r'$\mu=15, b=3$')
maxfreq = n.max()
# 设置y轴的上限
plt.ylim(ymax=np.ceil(maxfreq / 10) * 10 if maxfreq % 10 else maxfreq + 10)
饼图
饼图广泛得应用在各个领域,用于表示不同分类的占比情况,通过弧度大小来对比各种分类。饼图通过将一个圆饼按照分类的占比划分成多个区块,整个圆饼代表数据的总量,每个区块(圆弧)表示该分类占总体的比例大小,所有区块(圆 弧)的加和等于 100%。
饼图不适用于多分类的数据,原则上一张饼图不可多于 9 个分类。
相比于具备同样功能的其他图表(比如百分比柱状图、环图), 饼图需要占据更大的画布空间。
很难进行多个饼图之间的数值比较。
plt.pie
plt.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6,shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True,wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, *,normalize=None, data=None)
•
x
:各个饼块的尺寸。类
1
维数组结构。
•
explode
:每个饼块相对于饼圆半径的偏移距离,取值为小数。类
1
维数组结构。
labels
:每个饼块
的标签。字符串列表。
•
colors
:每个块的颜色。类数组结构。
autopct
:饼块内标签。
None
或字符串或可调用对象。
pctdistance
:饼块内标签与圆心的距离。浮点数。
•
shadow
:饼图下是否有阴影。布尔值。默认值为
False
。
•
labeldistance
:饼块外标签与圆心的距离。浮点值或
None
。默认值为
1.1
。如果设置为
None
,标签
不会显示, 但是图例可以使用标签。
startangle
:饼块起始角度。浮点数。默认值为
0
,即从
x
轴开
始。角度逆时针旋转。
•
radius
:饼图半径。浮点数。默认值为
1.counterclock
:角度是否逆时针旋转。布尔值。默认值为
True
。
•
wedgeprops
:饼块属性。字典。默认值为
None
。
饼图实例
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
labels = 'A','B','C','D'
explode = (0,0,0.1,0) #将第三块分离出来
sizes = [10,10,10,70]
colors = ['r','g','y','b']
plt.pie(sizes,explode=explode,labels=labels,colors=colors,autopct='%1.2f%%',
pctdistance=0.4,shadow=True,labeldistance=0.8,startangle=30,radius=1.3,
counterclock=False,textprops={'fontsize':20,'color':'black'})
plt.title("饼图详解示例")
plt.text(1,-1.2,'By:Biyoulin')
plt.legend(loc="upper right",fontsize=10,bbox_to_anchor=(1.1,1.05),borderaxespad=0.3)
plt.show()
误差图
matplotlib errorbar正误差棒
plt.errorbar(x, y, yerr=None, xerr=None, fmt=u'', ecolor=None, elinewidth=None,capsize=None, barsabove=False, lolims=False, uplims=False, xlolims=False,xuplims=False, errorevery=1, capthick=None, hold=None, data=None, **kwargs)
•
x,y :
标量或数组矩阵形式
•
xerr/yerr :
标量或数组矩阵形式,若为数组或矩阵形式时,可以是
1
×
N维(1
行
N
列) 矩阵或
2
×
N
维 (2行
N
列)矩阵。
•
ecolor :
误差条的颜色
•
elinewidth : 标量,可选,误差条的线的宽度
•
capsize :
标量,每点的误差条的上下横线的长度
•
capthick :
标量,可选, 每点的误差条的上下横线的厚度
•
lolims / uplims / xlolims / xuplims : bool
(布尔)类型,参数被用来表明图像仅提供上限或者下限
.
误差图实例
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [1, 2, 1, 2, 1]
y_errormin = [0, 0, 0, 0, 0]
y_errormax = [0.2, 0.4, 0.6, 0.4, 0.2]
x_error = 0.5
y_error = [y_errormin, y_errormax]
plt.bar(x, y)
plt.errorbar(x, y,yerr=y_error,capsize = 8,fmt='o', color="r")
plt.show()
中午乱码问题
原则上
matplotlib
是支持中文的,只是在配置信息里没有中文字体的相关信息。
准备工作:
•
1
、获取
matplotlib
包所在的配置文件的路径
import matplotlib
print(matplotlib.matplotlib_fname())#
输出
matplotlib
包所在的配置文件的
D:\Anaconda3\lib\site-packages\matplotlib\mpl-data\matplotlibrc
•
2
、根据上面的路径打开文件夹(根据自己实际的输出路径去
D:\Anaconda3\lib\site-packages\matplotlib\mpl-data\fonts\ttf
•
3
、加入中文字体
把中文字体文件放到文件夹里
解决坐标轴负号显示问题、中文乱码问题(一次性使用)
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']
# Matplotlib中设置字体-黑体,解决Matplotlib中文乱码问题
plt.rcParams['axes.unicode_minus'] = False
# 解决Matplotlib坐标轴负号'-'显示为方块的问题
sns.set(font='SimHei')
# Seaborn中设置字体-黑体,解决Seaborn中文乱码问题
永久更改方法
1
、根据上面准备工作获取matplotlib包所在的配置文件的路径,打开matplotlibrc
文件( 以记事本方式或其他编辑器方式打开)
2.
找到
#font.sans-serif
,去掉前 面的#
,并在:后面写上在准备工作加入的中文字体的名称 SimHei
3.
找到
#axes.unicode_minus
,去掉前面的#
,并在:改为False
C:\Users\Alice\.matplotlib
,打开该路径下的文件夹,删除tex.cache
文件和
fontList.json
文件