目录
- 1 基础准备
- 1.1简介
- 1.2安装
- 1.3 绘图基础知识
- 1.4 查询matplotlib系统中文字体
- 2 绘图流程
- 2.1 简单绘图
- 2.2 标准绘图
- 2.3 绘制子图
- 2.3.1 add_subplot方法
- 两行一列子图 plt1.add_subplot(2,1,*)
- 一行两列子图 plt1.add_subplot(1,2,*)
- 2.3.2 plt.subplot()方法
- 2.4 添加文字说明或注释
- 3 常用图表
- 3.1 散点图
- 3.2 饼图
- 3.3 柱状图
- 3.4 条形图
- 3.5 直方图
- 3.6 箱线图
1 基础准备
1.1简介
Matplotlib是Python最著名的绘图库,它提供了一套和matlab相似的命令API,十分适合交互式地进行绘图,而且可以方便地将它作为绘图控件,嵌入GUI应用程序中。
官方文档:https://matplotlib.org/
1.2安装
pip install matplotlib # 使用pip包管理器安装
1.3 绘图基础知识
- figure,画纸Sublpot画质,可多图绘画
- title,标题,用来给图形起名字
- Axis,坐标轴.横轴叫x坐标轴(xlabel),纵轴叫y坐标轴(ylabel)
- Legend,图例,代表图形里的内容
- Grid,网格,图形中的虚线,True显示网格
- Markers,点 ,表示点的形状。
1.4 查询matplotlib系统中文字体
# 查询matplotlib系统中文字体
from matplotlib.font_manager import fontManager
import os
#fontManager 是一个字体管理器对象,ttflist 是该对象的一个属性,表示已安装的字体列表。
#st_size>1e6:选出文件大小大于1MB(1e6字节)的字体文件
fonts = [font.name for font in fontManager.ttflist if
os.path.exists(font.fname) and os.stat(font.fname).st_size>1e6]
for font in fonts:
print(font)
2 绘图流程
2.1 简单绘图
简单绘图可以不创建绘图对象直接调用plot函数绘图,会自动创建一个绘图对象
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus'] = False #解决坐标轴刻度负号乱码
plt.rcParams['font.sans-serif'] = ['Simhei'] #设置中文显示,字体为黑体
#绘制一个y=x^2曲线
x =np.arange(1,100,0.25)
plt.plot(x,x**2) #划线,连线
plt.show() #显示
2.2 标准绘图
#绘图数据
x = np.linspace(-2,10,100)#等差数组
y = np.sin(x)
z = np.cos(x)
#绘图设置
plt.figure(figsize=(6,4),dpi = 100) #设置画布,figsize=(6,4)画布尺寸:宽度和高度,dpi 每英寸像素
plt.title("正弦", color = 'r', fontsize = 20, rotation = 0, alpha = 1) #添加标题,rotation角度
plt.xlabel("x",fontsize = 15,color = 'r',rotation = 0 ) #添加x轴名称
plt.ylabel("y")#设置y轴名称
plt.xlim(-2,11) #显示出来的x轴的取值范围
plt.ylim(-1.5,1.5)
# plt.xticks([]) #不显示刻度
plt.xticks(np.arange(-2,12,2),fontsize = 15,rotation = -30) #规定x轴刻度
plt.yticks([-1.5,-1,-0.5,0,0.5,1,1.5]) #规定y轴刻度
#绘图
plt.plot(x,y,color = 'red',linewidth = 2,label = "$sin(x)$") #划线,latex形式(论文公式形式)
plt.plot(x,z,'m--',label = "$cos(x^2)$")
#plt.legend(["$sin(x)$","$cos(x^2)$"],loc=3) #若是前面绘图时,label中没有信息,可以将图例信息写到列表中,注意顺序
plt.legend(loc=3) #显示图例,设置图例位置
plt.savefig("one.jpg",dpi = 500,bbox_inches = "tight") #保存
plt.show() #显示
2.3 绘制子图
- 一个绘图对象可以包含多个轴,在Matplotlib中用轴表示一个绘图区域,可以将其理解为子图。
- 可以调用fig对象的add_subplot方法和plt.subplot()绘制有多个轴的图表
add_subplo方法:
将整个绘图区域等分为设定好的行和列个子区域,从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域编号为1。如果numRows,numCols和plotNum这三个数都小于10的话,可以将它们缩写为一个整数,例如add_subplot(232)和add_subplot(2,3,2)是相同的。add_subplot在plotNum指定的区域中创建一个轴对象。如果新创建的轴和之前创建的轴重叠的话,之前的轴将被删除。
2.3.1 add_subplot方法
两行一列子图 plt1.add_subplot(2,1,*)
#绘图数据
x = np.linspace(-2,10,100)#等差数组
y = np.sin(x)
z = np.cos(x)
#绘图设置
p1 = plt.figure(figsize=(6,4),dpi = 100) #设置画布,figsize=(6,4)画布尺寸:宽度和高度,dpi 每英寸像素
#通过画布对象调用添加子图的方法
#第一幅子图
p1.add_subplot(2,1,1) #创建一个2行1列的子图,并开始绘制第一个子图
plt.title("正弦") #添加标题,rotation角度
plt.xlabel("x") #添加x轴名称
plt.ylabel("y")#设置y轴名称
plt.xlim(-2,11) #显示出来的x轴的取值范围
plt.ylim(-1.5,1.5)
plt.xticks(np.arange(-2,12,2),fontsize = 15,rotation = -30) #规定x轴刻度
plt.yticks([-1.5,-1,-0.5,0,0.5,1,1.5]) #规定y轴刻度
plt.plot(x,y,label = "$sin(x)$",color = 'red',linewidth = 2) #划线,latex形式
plt.legend(loc='lower left') #显示图例
plt.subplots_adjust(wspace = 0,hspace = 0.5) #调整子图之间的距离
#第二幅子图
p1.add_subplot(2,1,2) #创建一个2行1列的子图,并开始绘制第2个子图
plt.title("余弦") #添加标题,rotation角度
plt.xlabel("x") #添加x轴名称
plt.ylabel("y")#设置y轴名称
plt.xlim(-2,11) #显示出来的x轴的取值范围
plt.ylim(-1.5,1.5)
plt.xticks(np.arange(-2,12,2),fontsize = 15) #规定x轴刻度
plt.yticks([-1.5,-1,-0.5,0,0.5,1,1.5]) #规定y轴刻度
plt.plot(x,z,'m--',label = "$cos(x)$",linewidth = 2) #划线,latex形式
plt.legend(loc='lower left') #显示图例
plt.show()
一行两列子图 plt1.add_subplot(1,2,*)
#绘图数据
x = np.linspace(-2,10,1000)#等差数组
y = np.sin(x)
z = np.cos(x)
#绘图设置
p1 = plt.figure(figsize=(6,4),dpi = 100) #设置画布,figsize=(6,4)画布尺寸:宽度和高度,dpi 每英寸像素
p1.add_subplot(1,2,1) #创建一个2行1列的子图,并开始绘制第一个子图
plt.title("PyPlot First Example 正弦") #添加标题,rotation角度
plt.xlabel("x") #添加x轴名称
plt.ylabel("y")#设置y轴名称
plt.xlim(0,11) #显示出来的x轴的取值范围
plt.ylim(-1.5,1.5)
plt.xticks(np.arange(0,12,2),fontsize = 15) #规定x轴刻度
plt.yticks([-1.5,-1,-0.5,0,0.5,1,1.5]) #规定y轴刻度
plt.plot(x,y,label = "$sin(x)$",color = 'red',linewidth = 2) #划线,latex形式
plt.legend(loc='lower left') #显示图例
plt.subplots_adjust(wspace = 1,hspace = 0) #调整子图之间的距离
p1.add_subplot(1,2,2) #创建一个1行2列的子图,并开始绘制第2个子图
plt.title("PyPlot Second Example 余弦") #添加标题,rotation角度
plt.xlabel("x") #添加x轴名称
plt.ylabel("y")#设置y轴名称
plt.xlim(-2,11) #显示出来的x轴的取值范围
plt.ylim(-1.5,1.5)
plt.xticks(np.arange(-2,12,2),fontsize = 15) #规定x轴刻度
plt.yticks([-1.5,-1,-0.5,0,0.5,1,1.5]) #规定y轴刻度
plt.plot(x,z,'m--',label = "$cos(x)$",linewidth = 2) #划线,latex形式
plt.legend(loc='lower left') #显示图例
plt.show()
2.3.2 plt.subplot()方法
将上述语句中的 p1.add_subplot(1,2,1) 改为 plt.subplot(1,2,1)
#绘图数据
x = np.linspace(-2,10,1000)#等差数组
y = np.sin(x)
z = np.cos(x)
#绘图设置
p1 = plt.figure(figsize=(6,4),dpi = 100) #设置画布,figsize=(6,4)画布尺寸:宽度和高度,dpi 每英寸像素
plt.subplot(1,2,1) #创建一个2行1列的子图,并开始绘制第一个子图 ———————————————————————————————————————————变化的地方
plt.title("PyPlot First Example 正弦") #添加标题,rotation角度
plt.xlabel("x") #添加x轴名称
plt.ylabel("y")#设置y轴名称
plt.xlim(0,11) #显示出来的x轴的取值范围
plt.ylim(-1.5,1.5)
plt.xticks(np.arange(0,12,2),fontsize = 15) #规定x轴刻度
plt.yticks([-1.5,-1,-0.5,0,0.5,1,1.5]) #规定y轴刻度
plt.plot(x,y,label = "$sin(x)$",color = 'red',linewidth = 2) #划线,latex形式
plt.legend(loc='lower left') #显示图例
plt.subplots_adjust(wspace = 1,hspace = 0) #调整子图之间的距离
plt.subplot(1,2,2) #创建一个1行2列的子图,并开始绘制第2个子图 ———————————————————————————————————————————变化的地方
plt.title("PyPlot Second Example 余弦") #添加标题,rotation角度
plt.xlabel("x") #添加x轴名称
plt.ylabel("y")#设置y轴名称
plt.xlim(-2,11) #显示出来的x轴的取值范围
plt.ylim(-1.5,1.5)
plt.xticks(np.arange(-2,12,2),fontsize = 15) #规定x轴刻度
plt.yticks([-1.5,-1,-0.5,0,0.5,1,1.5]) #规定y轴刻度
plt.plot(x,z,'m--',label = "$cos(x)$",linewidth = 2) #划线,latex形式
plt.legend(loc='lower left') #显示图例
plt.show()
2.4 添加文字说明或注释
plt.annotate 中 xy 点坐标,xytext 注释坐标,arrowprops 箭头形状
#绘图数据
x = np.linspace(0,10,1000)#等差数组
y = np.sin(x)
z = np.cos(x)
#绘图设置
plt.figure(figsize=(8,4),dpi = 100) #设置画布,figsize=(8,4)画布尺寸:宽度和高度,分辨率100*8
plt.title("正弦") #添加标题,rotation角度
plt.xlabel("x") #添加x轴名称
plt.ylabel("y")#设置y轴名称
plt.xlim(-1,11) #显示出来的x轴的取值范围
plt.ylim(-1.2,1.2)
plt.xticks([0,2,4,6,8,10]) #规定x轴刻度
plt.yticks([-1.5,-1,-0.5,0,0.5,1,1.5]) #规定y轴刻度
plt.plot(x,y,label = "$sin(x)$",color = 'red',linewidth = 2) #划线,latex形式
plt.plot(x,z,'b--',label = "$cos(x)$")
plt.legend(loc='lower left') #显示图例
plt.text(0,0,'零点',color = 'b',fontsize = 10,rotation = 0) #增加文字说明
plt.annotate('最大值',color = 'r',xy = (1.5,1),xytext = (2,1.5),arrowprops = dict(facecolor = 'r',edgecolor = 'b',width = 1,shrink = 0.02,headlength = 10))
plt.show()
3 常用图表
这里只讲解部分参数,全部参数含义及使用办法
可参考菜鸟教程https://www.runoob.com/matplotlib/matplotlib-tutorial.html
3.1 散点图
matplotlib.pyplot.scatter(x, y, marker=None, c=None, s=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs)
参数说明:
x,y:长度相同的数组,也就是我们即将绘制散点图的数据点,输入数据。
marker:点的样式,默认小圆圈 ‘o’。
c:点的颜色,默认蓝色 ‘b’,也可以是个 RGB 或 RGBA 二维行数组。
s:点的大小,默认 20,也可以是个数组,数组每个参数为对应点的大小。
alpha::透明度设置,0-1 之间,默认 None,即不透明。
edgecolors::颜色或颜色序列,默认为 ‘face’,可选值有 ‘face’, ‘none’, None。
#绘图数据
x = np.linspace(0,10,100)#等差数组
y = np.sin(x)
#绘图设置
plt.figure(figsize=(8,4),dpi = 100) #设置画布,figsize=(6,4)画布尺寸:宽度和高度,分辨率100*8
plt.title("正弦") #添加标题,rotation角度
plt.xlabel("x") #添加x轴名称
plt.ylabel("y")#设置y轴名称
plt.xlim(-1,11) #显示出来的x轴的取值范围
plt.ylim(-1.2,1.2)
plt.xticks([0,2,4,6,8,10]) #规定x轴刻度
plt.yticks([-1.5,-1,-0.5,0,0.5,1,1.5]) #规定y轴刻度
plt.scatter(x,y,color = 'red',marker = '+',s = 30) #散点
plt.show() #显示
3.2 饼图
matplotlib.pyplot.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, hold=None, data=None)
参数说明:
x:浮点型数组,表示每个扇形的面积。
explode:数组,表示各个扇形之间的间隔,默认值为0。
labels:列表,各个扇形的标签,默认值为 None。
colors:数组,表示各个扇形的颜色,默认值为 None。
autopct:设置饼图内各个扇形百分比显示格式,%d%% 整数百分比,%0.1f 一位小数, %0.1f%% 一位小数百分比, %0.2f%% 两位小数百分比。
textprops :字典类型,默认值为:None。传递给 text 对象的字典参数,用于设置标签(labels)和比例文字的格式。
shadow::布尔值 True 或 False,设置饼图的阴影,默认为 False,不设置阴影。
plt.figure(figsize=(6,6))
plt.pie(df_mean.loc["第10小学","语文":"英语"]
,labels=["语文","数学","英语"] #各个扇形的标签
,autopct="%.2f%%" #设置饼图内各个扇形百分比显示格式
,shadow=True #设置饼图的阴影
,explode=[0.02,0.02,0.05] #各扇形之间的间隔
, colors = ['r','y','b'] #各扇形的颜色
,textprops={'fontsize':14}#设置饼图上字体的大小
)
plt.title("第十小学学科成绩占比",fontsize=17);
#tilte\label\tickts,有字体大小的参数
plt.show()
3.3 柱状图
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', color=None,edgecolor = None, **kwargs)
参数说明:
x:浮点型数组,柱形图的 x 轴数据,可以是一个标量或一个数组。
height:浮点型数组,柱形图的高度,可以是一个标量或一个数组。
width:浮点型数组,柱形图的宽度。
bottom:浮点型数组,底座的 y 坐标,默认 0。
align:柱形图与 x 坐标的对齐方式,‘center’ 以 x 位置为中心,这是默认值。 ‘edge’:将柱形图的左边缘与 x 位置对齐。要对齐右边缘的条形,可以传递负数的宽度值及 align=‘edge’。
color:表示柱的填充颜色,可以是一个颜色名称(如 ‘red’、‘blue’)或一个颜色列表。
edgecolor: 边框颜色。
**kwargs::其他参数。
plt.figure(figsize = (6,6),dpi = 100)
X = ['USA','China','India','Japan','Germany']
Y= [15094025,11999967,12399976,4443211,3456789]
plt.bar(X,Y,color = "pink",width = 0.5)
plt.title("测试")
plt.xlabel('counter')
plt.ylabel('GDP')
plt.show()
3.4 条形图
条形图用长条形表示每一个类别,长条形的长度表示类别的频数,宽度表示类别
3.5 直方图
直方图是一种统计报告图,形式上也是一个个的长条形,但是直方图用长条形的面积表示频数或者概率,宽度表示组距,高度表示频数/组距。当宽度相同时,一般就用长条形长度表示频数。
matplotlib.pyplot.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, **kwargs)
参数说明:
x:表示要绘制直方图的数据,可以是一个一维数组或列表。
bins:可选参数,表示直方图的箱数。默认为10。
density:可选参数,表示是否将直方图归一化。默认为False,即直方图的高度为每个箱子内的样本数,而不是频率或概率密度。
color:可选参数,表示直方图的颜色。
条形图与直方图区别
区别 | 直方图 | 条形图 |
---|---|---|
横轴数据 | 连续的,是一个范围 | 孤立的,是一个类别 |
长条形之间 | 没有空隙 | 有空隙 |
横轴数据 | 一般用长条形面积表示,当宽度相同时用长度表示 | 长条形的长度 |
plt.figure(figsize = (6,4),dpi = 100)
data = np.random.randn(1000) #随机生成(1000,),服从正态分布的数据
plt.hist(data,bins= 100,density = False,facecolor = "blue",color = "black",alpha = 0.7)
plt.xlabel("区间")
plt.ylabel("频率")
plt.title("直方图")
plt.show()
3.6 箱线图
用于显示一组数据分散情况的统计图
由上边缘、下边缘、中位数、上四分位数、下四分位数、异常值构成;
data = np.random.randn(1000)
plt.boxplot(data,1,'r*',1) #第一个表示中间是否打开,第二个1表示是横向还是竖向箱线图
plt.show()