前言----Matplotlib绘制图形
Matplotlib是一个用于创建静态动画的综合库,以及Python中的交互式可视化。
引入matplotlib.pyplot,matplotlib.pyplot是Matplotlib的基于状态的接口
import matplotlib.pyplot as plt
部分常用功能:
axes | 将轴添加到当前图形并使其成为当前轴。 |
axis | 获取或设置某些轴属性的方便方法。 |
bar | 绘制条形图。 |
cla | 清除当前轴。 |
clf | 清除当前数字。 |
close | 关闭图形窗口。 |
colorbar | 在绘图中添加颜色条。 |
contour | 绘制等高线。 |
contourf | 绘制等高线。 |
delaxes | 删除 Axes (默认为当前轴)。 |
draw | 重新绘制当前图形。 |
figtext | 将文本添加到图中。 |
figure | 创建新地物或激活现有地物。 |
fill | 绘制填充多边形。 |
fill_between | 填充两条水平曲线之间的区域。 |
hist | 绘制柱状图。 |
ion | 打开交互模式。 |
isinteractive | 返回pyplot是否处于“交互模式”。 |
legend | 在轴上放置图例。 |
pie | 绘制饼图。 |
plot | 绘制Y和X作为直线和/或标记。 |
plot_date | 包含日期的绘图数据。 |
polar | 绘制极坐标图。 |
rcdefaults | 恢复 rcParams 来自Matplotlib的内部默认样式。 |
rgrids | 获取或设置当前极坐标图上的径向网格线。 |
savefig | 保存当前图形。 |
scatter | 绘制散点图 |
show | 显示所有打开的图形。 |
stackplot | 绘制堆积面积图。 |
stem | 创建一个茎图。 |
step | 绘制一个步进图。 |
streamplot | 绘制矢量流的流线。 |
subplot | 在当前图形中添加子批次。 |
subplots | 创建一个数字和一组子批次。 |
text | 将文本添加到轴。 |
title | 为轴设置标题。 |
xlabel | 设置X轴的标签。 |
xlim | 获取或设置当前轴的X限制。 |
xscale | 设置X轴比例。 |
xticks | 获取或设置X轴的当前刻度位置和标签。 |
ylabel | 设置Y轴的标签。 |
ylim | 获取或设置当前轴的Y限制。 |
yscale | 设置Y轴比例。 |
yticks | 获取或设置Y轴的当前刻度位置和标签。 |
引入numpy,准备数据
import numpy as np
x = np.linspace(0,10,1000)
y1 = np.sin(x)
绘制图形并显示
plt.plot(x,y)
plt.show()
效果展示,在区间[0,10]的函数图像(plot()方法是绘制直线或者点,所以这个函数图像也只是直线近似得到的,将1000改为小一点的数字,如10,可以得到10个点所连的折线,这个数字越大,“曲线”就越光滑)
那么如何将画布(图形)嵌入到PyQt中呢?
----------------------------------------------------分割线--------------------------------------------------------------------
设置一个Matplotlib画布(canvas)FigureCanvasQTAgg,这个画布对象也是一个QWidget,因此可以像任何组件一样直接嵌入到应用程序里,效果如下:
直接上代码:
import sys
import numpy as np
from PyQt5 import QtWidgets
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from matplotlib.figure import Figure
#创建一个matplotlib图形绘制类
class MyCanvas(FigureCanvasQTAgg):
def __init__(self, parent=None, width=8, height=8, dpi=120):
#画布显示中文(微软雅黑)
plt.rcParams['font.family'] = ['Microsoft YaHei']
#坐标轴显示负‘-’号
plt.rcParams['axes.unicode_minus'] = False
#第一步:创建一个创建Figure
fig = Figure(figsize=(width, height), dpi=dpi)
#第二步:创建一个子图,用于绘制图形用,111表示子图编号,类似matlab的subplot(1,1,1),111也可省略
self.axes = fig.add_subplot(111)
#第三步:在父类中激活Figure窗口
super(MyCanvas, self).__init__(fig)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
# 实例化
F = MyCanvas(self)
# 标题
F.axes.set_title("图像展示",fontsize=15)
# 坐标轴设置
F.axes.set_xlabel("X轴",size=13,loc='right',c='k',labelpad=0)
F.axes.set_ylabel("Y轴",size=13,loc='top',c='k',labelpad=0)
F.axes.set_xticks(np.arange(0,5,0.5),minor=True)
F.axes.set_yticks(np.arange(0,5,0.5),minor=True)
F.axes.set_xlim(0,5)
F.axes.set_ylim(0,5)
F.axes.grid(True,'major','both',color='k',linestyle=':',linewidth=0.8)
# 准备数据
x= np.linspace(0,5,1000)
y2=(x)**2
y3=x**0.5
y4=(x**3+7)/(2*x**2+0.5)
y5=x
# 画图
F.axes.plot(x,y2,label=r'$y=x^{2}$')
F.axes.plot(x,y3,label=r'$y=x^{0.5}$')
F.axes.plot(x,y4,label=r'$y=\frac{x^3+7}{2x^2+0.5}$')
F.axes.plot(x,y5,'r-',label=r'$y={x}$')
# 图例
F.axes.legend()
# 嵌入画布
self.setCentralWidget(F)
# 显示
self.show()
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
app.exec_()
图例格式采用LaTex,调用F.axes.legend()来显示图例,图例的设置还有其他方法,比如:
line1,=F.axes.plot(x,y2)
label1=r'$y=x^{2}$'
line2,=F.axes.plot(x,y3)
label2=r'$y=x^{0.5}$'
line3,=F.axes.plot(x,y4)
label3=r'$y=\frac{x^3+7}{2x^2+0.5}$'
line4,=F.axes.plot(x,y5,'r-')
label4=r'$y={x}$'
# 图例
F.axes.legend([line1,line2,line3,line4],[label1,label2,label3,label4],frameon=True)
这样就可以简单实现将matplotlib嵌入到PyQt中,但是发现没有默认工具栏
后续将添加此工具栏。