matplotlib库绘图基础
matplotlib库画图基础
文章目录
1.matplotlib简介
Matplotlib 是一个非常强大的 Python 画图工具,如果用过MATLAB的话,学这个学起来十分简单,因为Matplotlib的画图跟MATLAB里面的函数差不多。
2.绘图操作
2.1导入画图库
import matplotlib.pyplot as plt
import numpy as np
2.2画第一个图
以下操作都在jupyter notebook中画制,如果是在pycharm等其他编译器,会弹出figure组件,供用户调整画像。
x = np.linspace(-1,1,50)
y1 = 2*x + 1
y2 = x**2
#画图使用plot
plt.plot(x,y1,x,y2)
plt.show()
基础知识点:每个画图都会使用一个figure,figure可以认为是一个画板,如果不特别声明,所以画图和曲线将在一个默认figure中展示
2.3创建figure
在jupyter notebook中画制是没有figure组件弹出的,所以所有的绘图都会输出到notebook中
x = np.linspace(-1,1,50)
y1 = 2*x + 1
y2 = x**2
#figure1(独立的画板)
plt.figure(1)
plt.plot(x,y1)
#figure2(独立的画板)
plt.figure(2)
plt.plot(x,y1)
plt.plot(x,y2)
plt.show()
因为在jupyter notebook上画的图,直接显示在页面上,无法看到figure组件。用pycharm就没事了。
2.4控制线条风格
可以通过color控制线条颜色,linewidth控制线条宽度,linestyle控制线条风格
x = np.linspace(-1,1,50)
y1 = 2*x + 1
y2 = x**2
#figure1
plt.figure(1)
plt.plot(x,y1)
#figure2
plt.figure(2)
plt.plot(x,y1,color='r',linewidth=1.5,linestyle='dotted')
plt.plot(x,y2,color='g',linewidth=1.5,linestyle='--')
plt.show()
2.5坐标轴控制
对画图的x,y轴的坐标进行控制可以通过xlim和xlabel,ylim和ylabel进行控制
x = np.linspace(-1,1,50)
y1 = 2*x + 1
y2 = x**2
plt.plot(x,y1,color='r',linewidth=1.5,linestyle='dotted')
plt.plot(x,y2,color='g',linewidth=1.5,linestyle='--')
#控制X坐标显示范围
plt.xlim((-2,2))
#给X和Y轴起轴标签名
plt.xlabel('Xlabel')
plt.ylabel('Ylabel')
#控制X轴的度标,ticks标度位置,labels标度名
plt.xticks(np.linspace(-2,2,4))
plt.yticks(ticks=[-0.5,1,2.5],labels=['bad','good','very good'])
#曲线对照框
plt.legend(('label1', 'label2'))
plt.show()
2.6绘制坐标轴
将坐标轴移动到画图中心。
x = np.linspace(-1,1,50)
y1 = 2*x + 1
y2 = x**2
plt.plot(x,y1,color='r',linewidth=1.5,linestyle='dotted')
plt.plot(x,y2,color='g',linewidth=1.5,linestyle='--')
plt.xlim((-2,2))
plt.xlabel('X')
plt.ylabel('Y')
plt.xticks(np.linspace(-2,2,4))
plt.yticks(ticks=[-0.5,1,2.5],labels=['bad','good','very good'])
ax = plt.gca() # get current axis 获得坐标轴对象
ax.spines['right'].set_color('none') # 将右边 边沿线颜色设置为空 其实就相当于抹掉这条边
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
# 设置中心的为(0,0)的坐标轴
ax.spines['bottom'].set_position(('data', 0)) # 指定 data 设置的bottom(也就是指定的x轴)绑定到y轴的0这个点上
ax.spines['left'].set_position(('data', 0))
plt.show()
2.7绘制标注
主要是在画图中标注信息,起主要使用函数annotate()来实现
x = np.linspace(-1,1,50)
y = 2*x + 1
x0 = 0.5
y0=2*x0+1
plt.scatter(x0,y0)
plt.plot([x0,x0],[y0,-1],'--',lw=2.5)
plt.plot(x,y)
#xy控制箭头的点,xytext控制标签的位置,arrowprops用来设置箭头的风格
#r'$2x+1=%s$'%y0 是要打印的文本内容,这里r代表字符串中字符不转义(不好说明,如果看不懂直接写自己要打印的内容即可)
plt.annotate(r'$2x+1=%s$'%y0,xy=(x0,y0),xytext=(0.6,1.5),
arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2'))
plt.show()
2.8绘制散点图
绘制散点图使用函数scatter,该函数主要用作绘制散点图
x = np.linspace(-1,1,50)
y = 2*x + 1
r = np.random.normal(0,0.3,50)
y1= y+r
plt.scatter(x,y1,color='b',linewidths=1)
plt.plot(x,y,color='r',linewidth=2.5)
plt.show()
2.9绘制条形图
x = np.linspace(0,5,6)
y = 2*x + 10
r = np.random.normal(0,2,6)
y1= y+r
#画柱状图
plt.bar(x,y1,edgecolor='white')
plt.bar(x,-y,color='orange',edgecolor='white')
#标注值
for X,Y in zip(x,y1):
plt.text(X,Y+0.1,'%.2f'%Y,ha='center',va='bottom')
for X,Y in zip(x,y):
plt.text(X,-Y-2.2,'%.2f'%Y,ha='center',va='bottom')
plt.show()
2.10绘制等高图
# 计算x,y坐标对应的高度值
def f(x, y):
return (1-x/2+x**5+y**3) * np.exp(-x**2-y**2)
# 生成x,y的数据
n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
# 把x,y数据生成mesh网格状的数据
#等高线的显示是在网格的基础上添加上高度值
X, Y = np.meshgrid(x, y)
# 填充等高图
Cs=plt.contourf(X, Y, f(X, Y),8,alpha=0.7,cmap=plt.cm.hot)
#等高线
C=plt.contour(X, Y, f(X, Y),8,colors='black')
#增加标签
plt.clabel(C,inline=True,fontsize=8)
#设置颜色条
plt.colorbar(Cs)
# 显示图表
plt.show()
2.11绘制三维图
画三维图,需要使用Axes3D模块,所有要先进行导入:
from mpl_toolkits.mplot3d import Axes3D
构建三维坐标:
figure = plt.figure()
ax = Axes3D(figure)
#也可以这样
fig = plt.figure()
ax = fig.gca(projection='3d')
绘制:
# X, Y 的值
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
# x,y 平面的网格,其实就是对X,Y进行广播操作
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X ** 2 + Y ** 2)
# Z 的值
Z = np.sin(R)
# rstride:网格之间的行跨度
# cstride:网格之间的列跨度
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))
# zdir : 等高线图('z' | 'x' | 'y')
# offset : 表示等高线图投射到指定页面的某个刻度
ax.contourf(X,Y,Z,zdir='z',offset=-2)p
# z轴的显示范围
ax.set_zlim(-2,2)
plt.show()
这里的刻度没负号是因为在jupyter里面画的图,matplotlib对jupyter notebook多少有点不兼容。
在jupyter notebook中因为没办弹出figure组件,输出的结果直接是显示在网页中的。这导致一些显示会出问题。在pycharm编译器基本不会出现这种显示的错误。
2.12在figure中绘制多个子图
使用subplot,在一个figure中绘制多个图
fig=plt.figure()
plt.subplot(2,2,1)
#绘制图1
plt.subplot(2,2,2)
#绘制图2
plt.subplot(2,2,3)
#绘制图3
plt.subplot(2,2,4)
#绘制图4
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)