Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。 它也可以和图形工具包一起使用,如 PyQt 和 wxPython。
鉴于Matplotlib 可能是 Python 2D-绘图领域使用最广泛的套件。它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。这里将会探索 matplotlib 的常见用法。
matplotlib 官网 http://matplotlib.org/ 点击 docs 查阅参考文档和 API(方法和模块)
导入库模块:
import numpy as np
import matplatlib.pyplot as plt
定义图像定义域:
x = np.linspace(-np.pi, np.pi, 256, endpoint=True) #-pi和pi之间取256个点,并包含最后一个点
定义图像函数:
c, s = np.cos(x), np.sin(x)
绘图:
plt.figure(1) #制定为图1
plt.plot(x, c, color='blue', linewidth=1.0, linestyle='-', label="Cos", alpha=0.2) #自变量,因变量,线颜色,线宽,图像标签,透明度
plt.plot(x, s, "r*", label="Sin") #另一种制定方式, r代表red,*代表线型
# 设置横轴的上下限
plt.xlim(-4.0,4.0)
# 设置纵轴的上下限
plt.ylim(-1.0,1.0)
plt.title("Cos & Sin") #图像标题
plt.show()
ax = plt.gca() # gca就是轴的一个编辑器
ax.spines["right"].set_color("none") # spines 是四周的边线,none代表隐藏(右边)
ax.spines["top"].set_color("none") # spines 是四周的边线,none代表隐藏 (上面)
ax.spines["left"].set_position(("data", 0)) # 位置设置到数据域的 0 位置
ax.spines["bottom"].set_position(("data", 0)) #位置设置到数据域的 0 位置
plt.show()
ax.xaxis.set_ticks_position('bottom') #设置x轴的标注位于横轴的下面
ax.yaxis.set_ticks_position('left') #设置y轴的标注位于纵轴的左边
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],[r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$']) 注意这里使用了 LaTeX。
plt.yticks(np.linspace(-1,1,5,endpoint=True)) #纵轴设置5个记号
for label in ax.get_xticklabels() + ax.get_yticklabels(): #get获取记号,设置记号字体大小和颜色
label.set_fontsize(20)
label.set_bbox(dict(facecolor="white", edgecolor="None", alpha=0.2)) # facecolor背景颜色,edgecolor边缘颜色,alpha透明度
legend(loc='upper left') #图例,loc位置为上左
plt.grid() #显示网格线
plt.axis([-np.pi,-np.pi, -1, 1]) #指定图像显示范围,前两个是横轴,后两个是纵轴
plt.show()
plt.fill_between(x, np.abs(x) < 0.5, c, c > 0.5, color="green", alpha=0.25) # 在c>0.5的区域内填充函数y=np.abs(x)<0.5与c函数包围的区域 ,对于函数y=np.abs(x)<0.5是分段函数,-0.5-0.5为1,其余区间为0
t = 1 #在t等于1的位置注释
plt.plot([t, t], [0, np.cos(t)], "y", linewidth=3, linestyle="--") #(t,0)到(t,cos(t))添加注释(y代表黄色),线型为虚线
plt.annotate("cos(1)", xy=(t, np.cos(1)), xytest=(1.5,0.6),testcoords="offset points",
arrowprops=dict(arrow,facecolor="black",shrink=0.05,connection))
#annotate参数详解:
——“标注”
——xy=(横坐标,纵坐标) :箭头尖端
——xytext=(横坐标,纵坐标):文字的坐标,指的是最左边的坐标,
——arrowprops= {facecolor= '颜色',shrink = '数字' <1 收缩箭头 }
plt.show()
散点图(scatter):
import numpy as np
import matplotlib.pyplot as plt #导入库
fig=plt.figure() #创建画布
ax = fig.add_subpolt(3,3,1) #将画布分割成3行3列,图像画在从左到右从上到下的第1块,也可以是add_subplot(331)
n=128
X=np.random.normal(0,1,n) #0-1之间产生n个随机数
Y=np.random.normal(0,1,n) #0-1之间产生n个随机数
T=np.arctan2(Y,X) #arctan函数用于上色——渐变色
# plt.axes([0.025,0.025,0.95,0.95]) #子图显示范围,左下角(0.025,0.025),右上角为(0.95,0.95)
x.scatter(X,Y,s=75,c=T,alpha=.5) #scatter(x, y, 点的大小, 颜色,标记)
plt.xlim(-1.5,1.5),plt.xticks([]) #x轴范围,标签为空
plt.ylim(-1.5,1.5),plt.yticks([]) #y轴范围,标签为空
plt.axis() #坐标轴线
plt.title("scatter")
plt.xlabel("x") #标签
plt.ylable("y")
plt.show()
柱状图(bar):
fig.add_subplot(332)
n=10
X=np.arange(n)
Y1=(1-X/float(n)*np.random.uniform(0.5,1.0,n) #生成n个随机数,范围在0.5-1.0
Y2=(1-X/float(n)*np.random.uniform(0.5,1.0,n)
plt.bar(X,+Y1,facecolor='#9999ff',edgecolor='white') #颜色,裱框颜色
plt.bar(X,-Y2,facecolor='#ff9999',edgecolor='white')
for x,y in zip(X,Y1):
plt.text(x+0.4,y+0.05,'%2f'%y,ha='center',va='bottom') #柱状图添加text
for x,y in zip(X,Y2):
plt.text(x+0.4,-y-0.05,'%2f'%y,ha='center',va='top')
plot.show()
饼图(pie):
fig.add_subplot(333)
n = 20 #20个部分
Z = np.ones(n) #20个全为1
Z[- 1] *= 2 #最后一个改为2
plt.pie(Z, explode=Z * .05, colors=['%f' % (i / float(n)) for i in range(n)],labels=['%.2f' % (i / float(n)) for i in range(n)]) #扇形的值,扇形到中心的距离,颜色,标签
plt.gca().set_aspect('equal') #设置为正圆
plt.xticks(), plt.yticks([]) #坐标记号为空
极坐标图(polar):
fig.add_subplot(334, polar=True)
n = 20
theta = np.arange(0.0, 2 * np.pi, 2 * np.pi / n)
radii = 10 * np.random.rand(n)
# plt.plot(theta,radii)
plt.polar(theta, radii)
热图(heatmap):
fig.add_subplot(335)
from matplotlib import cm
data = np.random.rand(3, 3)
cmap = cm.Blues
map = plt.imshow(data, interpolation='nearest', cmap=cmap,
aspect='auto', vmin=0, vmax=1)
3D图:
from mpl_toolkits.mplot3d import Axes3D
ax = fig.add_subplot(336, projection="3d")
ax.scatter(1, 1, 3, s=100)
热力图(hot map):
fig.add_subplot(313) #3行1列第三个相当于3行3列第7,8,9个
def f(x, y):
return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)
n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
X, Y = np.meshgrid(x, y)
plt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=plt.cm.hot)
plt.savefig("./fig.png") #保存图
plt.show()