本篇内容会在后期不定时更新
什么是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()
效果: