matplotlib库是python中绘制二维,三维图表的数据可视化工具,在2D绘图领域使用最广。
matplotlib绘图的主要功能是绘制x,y坐标图,其特点是:
使用简单绘图语句实现复杂绘图效果;
以交互操作实现渐趋精细的图像效果;
使用嵌入式的LaTeX输出具有印刷级别的图表,科学表达式和符号文本;
对图标的组成元素实现精细化控制。
使用matplotlib本质上有两种方法:
显式创建图形和轴,并在其上调用方法(面向对象(oo)样式);
依靠pyplot自动创建和管理图形和轴,并使用pyplot函数进行绘图。
pyplot限制为交互式绘图,模块虽然用法简单,但不适合在较大的应用程序中使用。
OO样式进行非交互式绘图,但用于较大项目的一部分重复使用的函数和脚本中。
本文主要讲解交互式绘图。
如果想深入学习更多绘图技能可参考matplotlib官网:matplotlib官网
由于大部分绘图功能是在matplotlib.pyplot中,且使用时经常要与Nnmpy组件搭配使用,常用导入命令:
import matplotlib.pyplot as pyt
import numpy as np
一,常用函数及其参数
plt.title() 图形标题
plt.xlabel() x坐标标题
plt.ylabel() yz坐标标题
plt.xlim(mix,max) 设置x坐标范围
plt.ylim(min,max) 设置y坐标范围
plt.legend(loc="lower left") 显示图示,图中表示每条曲线的标签和样式的矩形区域(图例的位置)
plt.show() 显示绘图窗口
plt.savefig("file.png",dpi=120) 保存文件并设置其分辨率
plt.grid(linestyle=":",color="r") 绘制刻度的网格线
plt.axhline(y=0.0,c="r",ls="--",lw=2) 绘制平行x轴的水平参考线
plt.axvline(x=4.0,c="b",ls="--",lw=2) 绘制平行y轴的水平参考线
plt.axhspan(xmin=1.0,xmax=2.0,facecolor="y",alpha=0.3)
绘制垂直于y轴的参考区域(起始值,中止值,区域颜色,透明度)
plt.axvspan(xmin=1.0,xmax=2.0,facecolor="y",alpha=0.3)
绘制垂直于x轴的参考区域
annatate() 添加图形内容细节的指向型注释文本
plt.annotate(string,xy=(np.pi/2,1.0),xytext=((np.pi/2)+0.15,1.5),weight="blod",
color="b",arrowprops=dict(arrowstyle="->",connectionstyle="arc3",color="b"))
string:图形内容的注释文本
xy:被注释图形内容的位置坐标
xytext:注释文本的位置坐标
weight:注释文本的字体粗细风格
color:注释文本的字体颜色
arrowprops:指示被注释内容的箭头的属性字典
text() 添加图形内容细节的无指向性注释文本
plt.text(x,y,string,weight="bold",color="r")
(注释横坐标,注释纵坐标,注释内容,注释字体风格,字体颜色)
样例:
import matplotlib.pyplot as plt
import numpy as np
from pylab import * #导入模块设置中文参数。
rcParams['font.sans-serif'] = ['SimHei'] #指定中文字体
rcParams['axes.unicode_minus'] = False #解决图像中负号显示为方块的问题
x = np.linspace(1,10,50)
y = np.sin(x)
plt.plot(x,y,label="曲线图",color="red",lw=1.0,ls="--")
plt.legend(loc="upper left")
plt.xlim(2,9) #设置x,y轴的数值范围
plt.ylim(-1,1)
plt.xlabel("x数轴") #设置x,y轴的标签文本
plt.ylabel("y数轴")
plt.grid(linestyle=":",color="r") #绘制网格线
plt.axvline(x=4.6,c="g",ls="--",lw=2) #绘制参考线
plt.axhline(y=0.0,c="g",ls="--",lw=2)
plt.axvspan(xmin=4.0,xmax=6.0,facecolor="y",alpha=0.2) #绘制参考区域
plt.axhspan(ymin=-0.5,ymax=0.5,facecolor="y",alpha=0.2)
plt.annotate("最大值",xy=(7.8,1.0),xytext=(6.2,0.8),
weight="bold",color="m",arrowprops=dict(arrowstyle="->",
connectionstyle="arc3",color="b",lw=2)) #指向型注释
plt.text(6.5,0.1,"方程式y=sin(x)",weight="bold",color="b") #无指向型注释
plt.title("方程式y=sin(x)曲线图") #图形标题
plt.show()
需要显示中文的另一种方法:
找到matplotlib\mpl-data文件夹下的matplotlibrc文件。
找到文本行 #font.sans-serif: …
修改为 #font.sans-serif: SimHei,…
二,图形绘制
1,plot() 曲线图 展现变量的趋势变化
plt.plot(x,y,ls="-",lw=2,label="plot figure")
参数及说明(参数用逗号隔开,除必选项,其他参数位置可变)
x or y:x或y轴上的数值(必选项);
color:线条颜色,默认为蓝色。
linestyle or ls:线条样式,可选值有"-"(实线),"--"(虚线),"-."(虚点线)及":"(点线),默认为"-";
linewidth or lw:线条宽度,默认为1.0;
label:图片名称,需要搭配legend方法使用才有效果;
注意:所有程序在交互模式下输入可能无法实现
import matplotlib.pyplot as plt
listx = [1,5,7,9,13,16]
listy = [15,50,80,40,70,50]
plt.plot(listx,listy,label="food",color="red",lw=5.0,ls="--")
plt.legend()
plt.show()
同时绘制多个曲线图形
import matplotlib.pyplot as plt
listx1 = [1,5,7,9,13,16]
listy2 = [15,50,80,40,70,50]
plt.plot(listx1,listy2,color="red",lw=4.0,ls="--",label="style1")
listx2 = [2,6,8,11,14,16]
listy2 = [10,40,30,50,80,60]
plt.plot(listx2,listy2,lw=2.0,ls="-.",color="green",label="style2")
plt.legend()
plt.show()
2,scatter() 散点图 寻找变量之间的关系
plt.scatter(x,y,c="b",label="scatter figure")
c:散点图中标记的颜色
颜色简称
别名/颜色
b 蓝色
g 绿色
r 红色
y 黄色
c 青色
k 黑色
m 洋红色
w 白色
其他描述方式:
1,使用HTML十六进制字符串 color=’#123456’ 使用合法的HTML颜色名字(’red’,’chartreuse’等);
2,可以传入一个归一化到[0,1]的RGB元祖。 color=(0.3,0.3,0.4).
import matplotlib.pyplot as plt
import numpy as np
from pylab import * #导入模块设置中文参数。
rcParams['font.sans-serif'] = ['SimHei']
x = np.linspace(1,8,200)
y = np.random.rand(200)
plt.scatter(x,y,c="c",label="散点图")
plt.legend()
plt.show()
3,bar() 柱状图
plt.bar(x,y)
在x轴上绘制定性数据的分布特征
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams['font.sans-serif'] = ['SimHei'] #指定中文字体
mpl.rcParams['axes.unicode_minus'] = False #解决图像中负号显示为方块的问题
a = [20,40,60,80,100]
b = [78,85,60,90,40]
plt.bar(a,b,align="center",color="c",tick_label=["语文","数学","英语","体育","音乐"],width=10.0,hatch="/")
plt.xlabel("各科成绩")
plt.ylabel("成绩等级")
plt.legend()
plt.show()
4,barh() 条型图
plt.barh(x,y)
在y轴上绘制定性数据的分布特征
与柱状图绘制相同,仅将函数替换即可。
5,hist() 直方图
hist(x)
与柱状图的区别是:直方图仅提供x轴的一组数据(必选项)。
import matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
np.random.seed(19680801)
mu = 100
sigma = 15
x = mu + sigma * np.random.randn(437)
num_bins = 60
fig, ax = plt.subplots()
n, bins, patches = plt.hist(x, num_bins, density=True,facecolor="g",alpha=0.8)
plt.xlabel('聪明度')
plt.ylabel('概率分布')
plt.title(r'智商直方图: $\mu=100$, $\sigma=15$')
plt.show()
6,pie() 披萨图
plt.poe(x)
绘制定性数据的不同类别百分比
import matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
x = [90,80,60,50,70]
country_name=["中国","美国","德国","日本","其他"]
plt.pie(x,labels=country_name)
plt.title("世界各国得分占比")
plt.show()
7,polar() 极坐标图
plt.polar(theta,r) 在极坐标轴上绘制折线图
theta:每个标记所在射线与极径的夹角
r:每个标记到原点的距离
import numpy as np
import matplotlib.pyplot as plt
a = 12
theta = np.linspace(0.0,5,a,endpoint=False)
r = 30*np.random.rand(a)
plt.polar(theta,r)
plt.show()
8,scatter() 气泡图
plt.scatter(x,y)
利用气泡大小展示三维数据
import matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
a = np.random.randn(50)
b = np.random.randn(50)
plt.scatter(a,b,s=np.power(5*a+10*b,2),c=np.random.rand(50),cmap=mpl.cm.RdYlBu,marker="o")
plt.show()