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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值