本篇内容会在后期不定时更新
什么是matplotlib
matplotlib是最流行的python底层绘图库,主要做数据可视化图表。
为什么要学习matplotlib
能将数据进行可视化,更直观的呈现
使数据更加客观,更具有说服力
二维图绘制
matplotlib库的基本使用之折线图
导入matplotlib库
from
matplotlib
import
pyplot
as
plt
x
=
range
(
1
,
10
,
2
)
y
=
[
2
,
4
,
6
,
8
,
10
]
plt
.
plot
(
x
,
y
)
# 传入x y ,通过plot绘制折线图
plt
.
show
(
)
# 展示图形
展示结果:
matplotlib还可以设置输出图片的一些格式,如下:
设置图片的大小,像素
保存到本地
描述信息,比如x y轴所要表达的内容
调整x y轴的间距
线条的样式
标记出特殊的点
给图片添加水印
设置图片的大小
fig
=
plt
.
figure
(
figsize
=
(
20
,
8
)
,
dpi
=
80
)
输出的样式就会发生改变:
保存图片
plt
.
savefig
(
"example.png"
)
一保存到本地
调整x y轴的刻度
x
=
range
(
1
,
20
,
2
)
y
=
[
2
,
4
,
6
,
8
,
10
,
12
,
14
,
16
,
18
,
20
]
plt
.
xticks
(
x
)
# 修改x轴的刻度
plt
.
yticks
(
y
)
# 修改y轴的刻度
修改后的图像:
修改步长
当x轴的刻度太密集时,可采用修改步长的方法达到疏一点的刻度,当然y轴同样。
plt
.
xticks
(
x
[
:
:
2
]
)
结果如下:
设置显示中文
from
pylab
import
mpl
# 设置显示中文
mpl
.
rcParams
[
'font.sans-serif'
]
=
[
'FangSong'
]
设置x y轴及标题的标签
plt
.
xlabel
(
"奇数"
)
# 设置x轴的标签
plt
.
ylabel
(
"偶数"
)
# 设置y轴的标签
plt
.
title
(
"示例"
)
# 设置标题的标签
输出结果如下:
绘制网格
绘制网格可以更加明确的看出数据之间的关系,当然网格也可以调节透明度来更加易于观查数据,
透明度的数值为0-1之间,0表示完全透明,1表示完全不透明。
plt
.
grid
(
)
# 采用默认的透明度
plt
.
grid
(
alpha
=
0.5
)
# 透明度为0.5时的网格
输出结果:
设置图标
ax
.
plot
(
z_1
,
label
=
"curb"
)
#立方数据线
ax
.
plot
(
Y_1
,
label
=
"quer"
,
linewidth
=
5
)
#平方数据线
ax
.
plot
(
x
,
x
,
label
=
"liner"
,
linewidth
=
5
)
#直线
ax
.
legend
(
loc
=
'best'
)
#添加图标
效果:
散点图的绘制
散点图的绘制方法
散点图绘制采用scatter()函数,只需传入x和y的值即可,代码如下:
import
matplotlib
.
pyplot
as
plt
# 导入库
fig
,
ax
=
plt
.
subplots
(
)
# 调用subplots
ax
.
scatter
(
X
,
Y
)
# 传入x和有
fig
.
show
(
)
# 展示数据
还是上面的例子做展示,改为散点图。代码如下:
版本一:
import
matplotlib
.
pyplot
as
plt
fig
,
ax
=
plt
.
subplots
(
)
x
=
[
i
for
i
in
range
(
10
)
]
# 设置x轴数据
Y_1
=
[
i
**
2
for
i
in
range
(
10
)
]
# 设置y轴平方数据
z_1
=
[
i
**
3
for
i
in
range
(
10
)
]
# 设置y轴立方数据
ax
.
scatter
(
x
,
z_1
,
label
=
"curb"
)
# 立方数据线
ax
.
scatter
(
x
,
Y_1
,
label
=
"quer"
,
linewidth
=
5
)
# 平方数据线
ax
.
scatter
(
x
,
x
,
label
=
"liner"
,
linewidth
=
5
)
# 直线
ax
.
legend
(
loc
=
'best'
)
#设置图标
plt
.
savefig
(
"data.png"
)
# 保存图片
fig
.
show
(
)
# 展示图片
版本二:
import
matplotlib
.
pyplot
as
plt
x
=
[
i
for
i
in
range
(
10
)
]
# 设置x轴数据
Y_1
=
[
i
**
2
for
i
in
range
(
10
)
]
# 设置y轴平方数据
z_1
=
[
i
**
3
for
i
in
range
(
10
)
]
# 设置y轴立方数据
plt
.
scatter
(
x
,
z_1
,
label
=
"curb"
)
# 立方数据线
plt
.
scatter
(
x
,
Y_1
,
label
=
"quer"
,
linewidth
=
5
)
# 平方数据线
plt
.
scatter
(
x
,
x
,
label
=
"liner"
,
linewidth
=
5
)
# 直线
plt
.
legend
(
loc
=
'best'
)
#设置图标
plt
.
savefig
(
"散点图.png"
)
# 保存图片
plt
.
show
(
)
# 展示图片
效果:
柱图绘制
柱状图的绘制方法为bar和barh方法,bar绘制垂直柱状图,barh绘制水平柱状图。
bar柱状图绘制:
from
matplotlib
import
pyplot
as
plt
from
pylab
import
mpl
figure
=
plt
.
figure
(
figsize
=
(
20
,
15
)
)
# 设置图像大小
# 设置字体
mpl
.
rcParams
[
'font.sans-serif'
]
=
[
'FangSong'
]
# 电影名称
title
=
[
'误杀'
,
'流浪地球'
,
'寻梦环游记'
,
'战狼2'
,
'美人鱼'
,
'湄公河行动'
,
'叶问4'
,
'何以为家'
,
'比悲伤更悲\n伤的故事'
,
'中国合伙人'
]
# 电影票房
data
=
[
11.97
,
46.18
,
12.02
,
56.39
,
33.9
,
11.73
,
11.72
,
3.7
,
9.46
,
5.39
]
# 绘制柱状图,传入x和y
plt
.
bar
(
title
,
data
)
# 设置x轴刻度字体的大小
plt
.
xticks
(
fontsize
=
30
)
# 设置y轴刻度字体的大小
plt
.
yticks
(
fontsize
=
30
)
# 设置x轴的标签名称
plt
.
xlabel
(
"票房/亿"
,
fontsize
=
30
)
# 设置y轴的标签名称
plt
.
ylabel
(
"电影"
,
fontsize
=
30
)
# 绘制网格
plt
.
grid
(
alpha
=
0.5
)
# 保存图片
plt
.
savefig
(
"柱状图.png"
)
# 展示图片
figure
.
show
(
)
效果:
barh水平柱状图的绘制。
barh方法:
from
matplotlib
import
pyplot
as
plt
from
pylab
import
mpl
figure
=
plt
.
figure
(
figsize
=
(
20
,
15
)
)
# 设置图像大小
# 设置字体
mpl
.
rcParams
[
'font.sans-serif'
]
=
[
'FangSong'
]
# 电影名称
title
=
[
'误杀'
,
'流浪地球'
,
'寻梦环游记'
,
'战狼2'
,
'美人鱼'
,
'湄公河行动'
,
'叶问4'
,
'何以为家'
,
'比悲伤更悲\n伤的故事'
,
'中国合伙人'
]
# 电影票房
data
=
[
11.97
,
46.18
,
12.02
,
56.39
,
33.9
,
11.73
,
11.72
,
3.7
,
9.46
,
5.39
]
# 绘制柱状图,传入x和y
plt
.
bar
(
title
,
data
)
# 设置x轴刻度字体的大小
plt
.
xticks
(
fontsize
=
30
)
# 设置y轴刻度字体的大小
plt
.
yticks
(
fontsize
=
30
)
# 设置x轴的标签名称
plt
.
xlabel
(
"票房/亿"
,
fontsize
=
30
)
# 设置y轴的标签名称
plt
.
ylabel
(
"电影"
,
fontsize
=
30
)
# 绘制网格
plt
.
grid
(
alpha
=
0.5
)
# 保存图片
plt
.
savefig
(
"柱状图.png"
)
# 展示图片
figure
.
show
(
)
效果:
间隔柱状图绘制
有时需要将多组数据绘制到同一个图表上,这时就需要间隔各个图表的内容,详情见代码。
from
matplotlib
import
pyplot
as
plt
import
numpy
as
np
from
pylab
import
mpl
mpl
.
rcParams
[
'font.sans-serif'
]
=
[
'FangSong'
]
movie_name
=
[
"千与千寻"
,
"玩具总动员"
,
"黑衣人"
]
# 三天内票房
num1
=
[
7548
,
4013
,
1673
]
num2
=
[
5453
,
1840
,
1080
]
num3
=
[
4383
,
2345
,
1890
]
x
=
np
.
arange
(
len
(
movie_name
)
)
# 设置柱宽
width
=
0.2
# 绘制柱状图,alpha设置透明度,width设置柱宽,label设置图标
plt
.
bar
(
x
,
num1
,
alpha
=
0.5
,
width
=
width
,
label
=
movie_name
[
0
]
)
# num2图加上一个柱宽
plt
.
bar
(
[
i
+
width
for
i
in
x
]
,
num2
,
alpha
=
0.5
,
width
=
width
,
label
=
movie_name
[
1
]
)
# num3图加上两个柱宽
plt
.
bar
(
[
i
+
2
*
width
for
i
in
x
]
,
num3
,
alpha
=
0.5
,
width
=
width
,
label
=
movie_name
[
2
]
)
# 设置x轴的值
x_label
=
[
"第{}天"
.
format
(
i
+
1
)
for
i
in
x
]
# 偏移x轴的值
plt
.
xticks
(
[
i
+
width
for
i
in
x
]
,
x_label
)
# 设置x,y轴的标签,fontsize设置字体的大小
plt
.
ylabel
(
"票房"
,
fontsize
=
15
)
plt
.
xlabel
(
"天数"
,
fontsize
=
15
)
# 设置图标,loc设置图标位置
plt
.
legend
(
loc
=
"best"
)
# 保存图片
plt
.
savefig
(
"间隔柱状图.png"
)
# 展示图表
plt
.
show
(
)
效果:
饼状图绘制
饼状图的绘制含函数为pie(),传入相应比例即可,具体参数见代码。
代码如下:
from
matplotlib
import
pyplot
as
plt
from
pylab
import
mpl
# 设置显示中文
mpl
.
rcParams
[
'font.sans-serif'
]
=
[
'FangSong'
]
# 男生人数
man
=
72351
# 女生人数
woman
=
81345
# 人妖人数
mid_person
=
2300
# 计算男生比例
man_perc
=
man
/
(
man
+
woman
+
mid_person
)
# 计算女生比例
woman_perc
=
woman
/
(
man
+
woman
+
mid_person
)
# 计算人妖比例
mid_perc
=
mid_person
/
(
man
+
woman
+
mid_person
)
# 添加名称
labels
=
[
'男'
,
'女'
,
"人妖"
]
# 修改颜色
colors
=
[
'blue'
,
'orange'
,
'red'
]
# 绘制饼状图,传入的为列表。explode为饼状图添加分裂效果,传入参数为元组,第一个参数为可为0,第二个参数分割距离。autopct为饼状图添加显示比例。
paches
,
texts
,
autotexts
=
plt
.
pie
(
[
man_perc
,
woman_perc
,
mid_perc
]
,
colors
=
colors
,
labels
=
labels
,
explode
=
(
0
,
0
,
0.02
)
,
autopct
=
'%0.1f%%'
)
# 修改字体颜色
for
text
in
texts
+
autotexts
:
text
.
set_color
(
"black"
)
# 设置字体大小
for
text
in
texts
+
autotexts
:
text
.
set_fontsize
(
15
)
plt
.
savefig
(
"饼状图.png"
)
# 展示图像
plt
.
show
(
)
效果:
直方图绘制
随机正太分布直方图
直方图的绘制的函数为hist(),传入相应的正太值即可。详细见代码。
代码如下:
from
matplotlib
import
pyplot
as
plt
import
numpy
as
np
# 生成1000个标志的正太分布随机
x
=
np
.
random
.
randn
(
1000
)
# 修改柱的宽度,使用bins,值越小,图像越宽。
plt
.
hist
(
x
,
bins
=
100
)
plt
.
savefig
(
"随机正太分布直方图.png"
)
plt
.
show
(
)
效果:
指定期望与均值的直方图
调用numpy库中的np.random.normal()即可指定期望与均值,详情见代码。
代码如下:
from
matplotlib
import
pyplot
as
plt
import
numpy
as
np
# 使用np.random.normal()指定期望与均值的正太分布,0为期望,0.8为均值,1000为生成的个数。
# 绘制三个指定期望与均值的正太分布
x
=
np
.
random
.
normal
(
0
,
0.8
,
1000
)
y
=
np
.
random
.
normal
(
0
,
0.5
,
1000
)
z
=
np
.
random
.
normal
(
0
,
0.7
,
1000
)
# 传入关键字参数,为字典形式。**kwargs为包裹关键字参数
kwargs
=
dict
(
bins
=
100
,
alpha
=
0.5
)
# 绘制直方图
plt
.
hist
(
x
,
**
kwargs
)
plt
.
hist
(
y
,
**
kwargs
)
plt
.
hist
(
z
,
**
kwargs
)
# 保存图片
plt
.
savefig
(
"指定期望与均值直方图.png"
)
# 展示图片
plt
.
show
(
)
效果: