matplotlib
1. plt.和ax.区别
1. plt.
fig=plt.figure(num=1,figsize=(4,4))
plt.plot([1,2,3,4],[1,2,3,4])
plt.show()
2. ax.
fig=plt.figure(num=1,figsize=(4,4))
ax=fig.add_subplot(111)
ax.plot([1,2,3,4],[1,2,3,4])
plt.show()
可以看到上面两种画图方式可视化结果相同;
plt是先生成一个画布,然后在这个画布上隐式的生成一个画图区域来进行画图,
ax是先生成一个画布,然后,在此画布上选定一个子区域画一个子图。
2. 相关函数简介
matplotlib.pyplot是一个命令型函数集合,它可以让人们像使用matlab一样使用matplotlib。在matplotlib.pypylot库中有plt子库,该子库提供了7个用于读取和显示的函数,17个用于绘制基础图表的函数,3个区域填充函数,9个坐标轴设置函数,11个标签与文本设置函数。
plt库中的读取和显示函数:
plt库中的基础图表函数:
区域填充函数:
坐标轴设置函数:
标签与文本设置函数:
3. 一些常用的基础API
3.1 解决中文乱码,防止方块化
plt.rcParams["font.sans-serif"]="SimHei"
3.2 解决负号不能正常显示的问题
plt.rcParams["axes.unicode_minus"]=False
3.3 在jupyter notebook上面显示图片
%matplotlib inline
3.4 作图使用svg格式显示更为清洗
%config InlineBackend.figure_format="svg"
3.5 设置画布
# 创建一个全局绘图区域
figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
num: 设置图像编号
figsize: 设置图像的宽度和高度,单位未英寸
facecolor: 设置图像的背景颜色
dpi: 设置图像的边框颜色
edgecplor: 设置图像的边框颜色
3.6 创建子图
3.6.1 矩阵式布局
将一个窗口等分的划成相等的几个区域,规定行,列数即可。
语法:plt.subplot(行数, 列数, 序号)或plt.subplot(行数列数序号)
#导入模块
import numpy as np
from matplotlib import pyplot as plt
#设置中文字体
plt.rcParams["font.sans-serif"]="SimHei"
#创建图形窗口,设置图形窗口名字
plt.figure('Subplot',facecolor='lightgray')
#设置两行两列序号为1的矩阵子图
plt.subplot(221)
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,'你好',ha='center',va='center',size=56,alpha=0.5)
#设置两行两列序号为2的矩阵子图
plt.subplot(222)
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,'中国',ha='center',va='center',size=56,alpha=0.5)
#设置两行两列序号为3的矩阵子图
plt.subplot(223)
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,'你好',ha='center',va='center',size=56,alpha=0.5)
#设置两行两列序号为4的矩阵子图
plt.subplot(224)
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,'世界',ha='center',va='center',size=56,alpha=0.5)
#设置紧凑式布局
plt.tight_layout()
3.6.2 网格式布局
网格式布局的话,可以让我们灵活的进行排版,相对来说,更方便我们进行展示。
但是,我们需要用到另一种方法,需要重新导入:
from matplotlib import gridspec as mg
语法:
gs=mg.GridSpec(行数, 列数)
plt.subplot(gs[占行, 占列])
分析:代码mg.GridSpec(行数, 列数) 其实就是已经将图形窗口划分为相等的几行几列,但是,他是不可见的,也就是说,我们一会儿分配位置的时候,还是根据的行、列来进行划分的。
#导入模块
from matplotlib import pyplot as plt
from matplotlib import gridspec as mg
#创建图形窗口
plt.figure("Grid",facecolor="lightgray")
#设置行列数
gs = mg.GridSpec(3,3)
#创建网格1
plt.subplot(gs[0,:2])
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,"1",ha="center",va="center",size=36,alpha=0.5)
#创建网格2
plt.subplot(gs[1:,0])
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,"2",ha="center",va="center",size=36,alpha=0.5)
#创建网格3
plt.subplot(gs[2,1:])
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,"3",ha="center",va="center",size=36,alpha=0.5)
#创建网格4
plt.subplot(gs[:2,2])
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,"4",ha="center",va="center",size=36,alpha=0.5)
#创建网格5
plt.subplot(gs[1,1])
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,"5",ha="center",va="center",size=36,alpha=0.5)
#紧凑布局
plt.tight_layout()
#保存
plt.savefig("路径")
3.6.3 自由式布局
自由式布局主要应用于,当某个场景需要一个大图里面欠小图
自由式布局就不再需要import导入其他的了,但是需要用到axes方法
语法:plt.axes([左坐标, 底坐标, 宽, 高])
这里我们会提过一个左坐标,一个底坐标,一个宽一个高。
注意:这里设置的左坐标和底坐标,宽、高,不是写死的具体坐标轴的信息,而是相对于坐标轴的比例
从而通过这四个比例来达到自由式布局的效果
from matplotlib import pyplot as plt
plt.figure("Axes",facecolor='lightgray',)
plt.axes([0.03,0.038,0.94,0.924])
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,'1',ha="center",va="center",size=36,alpha=0.5,color="red")
plt.axes([0.63,0.076,0.31,0.308])
plt.xticks(())
plt.yticks(())
plt.text(0.5,0.5,'2',ha="center",va="center",size=36,alpha=0.5,color="orange")
plt.savefig("路径")
4. 绘图3步
5. 几种常用图表
5.1 柱状图
bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
5.1.1 垂直柱状图
import numpy as np
import matplotlib.pyplot as plt
size = 5
a = np.random.random(size)
b = np.random.random(size)
c = np.random.random(size)
d = np.random.random(size)
x = np.arange(size)
total_width, n = 0.8, 3 # 有多少个类型,只需更改n即可
width = total_width / n
x = x - (total_width - width) / 2
plt.bar(x, a, width=width, label='a')
plt.bar(x + width, b, width=width, label='b')
plt.bar(x + 2 * width, c, width=width, label='c')
plt.legend()
plt.show()
5.1.2 水平条形图
1. 使用plt.bar()
参数orientation默认是’vertical’垂直,改为"horizontal"(水平)。
注:
(1)x的起始位置,水平条底部,以及长度的取值变化
(2)添加标签的时候enumerate()函数遍历出的结果(自动加序号),以及text()函数的参数。
import numpy as np
import matplotlib.pyplot as plt
size = 5
a = np.random.random(size)
b = np.random.random(size)
c = np.random.random(size)
d = np.random.random(size)
x = np.arange(size)
total_width, n = 0.8, 3 # 有多少个类型,只需更改n即可
width = total_width / n
x = x - (total_width - width) / 2
plt.bar(0,bottom=x,height=width,width=a, label='a',orientation="horizontal")
plt.bar(0,bottom=x+width,height=width,width=b,label='b',orientation="horizontal")
plt.bar(0,bottom=x+2*width,height=width,width=c,label='c',orientation="horizontal")
plt.legend()
plt.show()
2. 使用plt.barh()
语法:
barh(y, width, height=0.8, left=None, *, align='center', **kwargs)
import numpy as np
import matplotlib.pyplot as plt
size = 5
a = np.random.random(size)
b = np.random.random(size)
c = np.random.random(size)
d = np.random.random(size)
x = np.arange(size)
total_width, n = 0.8, 3 # 有多少个类型,只需更改n即可
width = total_width / n
x = x - (total_width - width) / 2
plt.barh(x, left=0,height=width,width=a,orientation="horizontal",alpha = 0.8)
plt.barh(x+width, left=0,height=width,width=b,orientation="horizontal",alpha = 0.8)
plt.barh(x+2*width, left=0,height=width,width=c,orientation="horizontal",alpha = 0.8)
plt.legend()
plt.show()
5.2 折线图
plt.plot(x,y,linestyle,linewidth,color,marker,markersize,markeredgecolor,markerfactcolor,label,alpha)
参数:
x,y:指定折线图的x轴/y轴的数据;
linestyle:指定折线的类型,可以是实线、虚线、点虚线等,默认文实线;
linewidth:指定折线的宽度
marker:设置点的形状
markersize:设置点的大小
markeredgecolor:设置点的边框色
markerfactcolor:设置点的填充色
label:为折线图添加标签
常用的marker风格:
“+”:十字 “O”:圆圈 “*”:星型 “s”:正方形 “p”:五边形 “h”:六边形 “d”:小菱形 “D”:钻石
常用的color风格:
“b”:blue蓝色 “g”:green绿色
“k”:黑色 “w”:white白色
“r”:red红色 “y”:yellow黄色
“c”:cyan青色 “m”:magenta品红
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(10,6))
x = np.arange(-2*np.pi,2*np.pi,0.01)
#x = np.arange(-2*np.pi,2*np.pi,0.01)
x1 = np.arange(-2*np.pi,2*np.pi,0.2)
y1 = np.sin(3*x1)/x1
y2 = np.sin(2*x)/x
y3 = np.sin(x)/x
plt.plot(x1,y1,c='b',linestyle='--',marker='^',label="y1=sin(3*x1)/x1")#linestyle设置线的风格,marker设置点的风格
plt.plot(x,y2,c='r',linestyle='-.',label="y2=sin(2*x)/x")
plt.plot(x,y3,c='g',label="y3=sin(x)/x")
plt.legend()
plt.show()
5.3 饼图
pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False, *, data=None)
参数:
x:指定绘图的数据;
explode:指定饼图某些部分的突出显示,即呈现爆炸式;
labels:为饼图添加标签说明,类似于图例说明;
colors:指定饼图的填充色;
autopct:自动添加百分比显示,可以采用格式化的方法显示;
pctdistance:设置百分比标签与圆心的距离;
shadow:是否添加饼图的阴影效果;
labeldistance:设置各扇形标签(图例)与圆心的距离;
startangle:设置饼图的初始摆放角度;
radius:设置饼图的半径大小;
counterclock:是否让饼图按逆时针顺序呈现;
wedgeprops:设置饼图内外边界的属性,如边界线的粗细、颜色等;
textprops:设置饼图中文本的属性,如字体大小、颜色等;
center:指定饼图的中心点位置,默认为原点
frame:是否要显示饼图背后的图框,如果设置为True的话,需要同时控制图框x轴、y轴的范围和饼图的中心位置;
例:
import matplotlib.pyplot as plt
labels = 'A', 'B', 'C', 'D'
fracs = [15, 30.55, 44.44, 10]
color = 'blue','red','yellow','green'
explode = [0, 0.1, 0, 0] # 0.1 凸出这部分,
plt.pie(x=fracs,explode=explode, # 突出分裂的部分
labels=labels, # 添加分类标签
colors=color, # 设置饼图的自定义填充色
autopct='%.1f%%', # 设置百分比的格式,这里保留一位小数
pctdistance=0.6, # 设置百分比标签与圆心的距离
labeldistance = 1.15, # 设置各标签与圆心的距离
startangle = 180, # 设置饼图的初始角度
radius = 1, # 设置饼图的半径
counterclock = False, # 是否逆时针,这里设置为顺时针方向
wedgeprops = {'linewidth': 1.3, 'edgecolor':'green'},# 设置饼图内外边界的属性值
textprops = {'fontsize':15, 'color':'k'}, # 设置文本标签的属性值
center = (0.5,0.5), # 设置饼图的原点
frame = 0 )# 是否显示饼图的图框,这里设置显示
plt.show()
5.4 散点图
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, *, data=None, **kwargs)
参数:
x,y:表示即将绘制散点图的数据点
s:是一个可选的参数。
c:表示的是颜色,也是一个可选项。
marker:表示的是标记的样式,默认的是'o'。
alpha:实数,0-1之间。
#导入必要的模块
import numpy as np
import matplotlib.pyplot as plt
#产生测试数据
x = np.arange(1,10)
y = x
fig = plt.figure()
ax1 = fig.add_subplot(111)
#设置标题
ax1.set_title('Scatter Plot')
#设置X轴标签
plt.xlabel('X')
#设置Y轴标签
plt.ylabel('Y')
#画散点图
ax1.scatter(x,y,c = 'r',marker = 'o')
#设置图标
plt.legend('x1')
#显示所画的图
plt.show()