QGraphicsViewは、matplotlibによって描画されたヒストグラムを表示します
1.図の各部分の紹介
matplotlibの公式ウェブサイトには、図の各部分の紹介があります
https://matplotlib.org/faq/usage_faq.html#what-is-a-backend
図は紙を描いています。すべての軸、アーティスト、キャンバスを保存してください。図形は1つ以上の軸を持つことができます。
Figure
全体 図。フィギュアは、すべての子供Axes
、「特別な」アーティスト(タイトル、フィギュアの伝説など)、およびキャンバスを追跡 し ます。(キャンバスについてはあまり心配しないでください。実際に描画を行ってプロットを取得するのはオブジェクトであるため重要ですが、ユーザーとしては多かれ少なかれ見えません)。図形には任意の数をAxes
含めることができますが 、役立つようにするには少なくとも1つ必要です。
新しいフィギュアを作成する最も簡単な方法は、pyplotを使用することです。
fig = plt.figure() # an empty figure with no axes
fig, ax_lst = plt.subplots(2, 2) # a figure with a 2x2 grid of Axes
軸は描画軸であり、図の指定された領域です。図形は複数の軸を持つことができますが、軸は1つの図形にのみ属することができます。
軸には2(2D)または3(3D)の軸が含まれ、画像のサイズを制限します。
各軸にはタイトルとX軸座標xラベル、Y軸座標yラベルがあります
Axes
これはあなたが「プロット」と考えるものであり、データスペース(内側の青いボックスとしてマークされている)のある画像の領域です。特定のFigureには多くの軸を含めることができますが、特定のAxes
オブジェクトは1つにしか含める ことができません Figure
。Axesには、データ制限を処理する2つ(3Dの場合は3つ)のAxis
オブジェクトが含まれてい ます(Axes と Axisの違いに注意してください )(データ制限は、set_xlim()
and メソッドを介してsetを介して制御することもでき ます)。それぞれ に、タイトル(を介して設定 )、xラベル(を介して設定 )、およびyラベルをを介して設定され ます。set_ylim()
Axes
Axes
set_title()
set_xlabel()
set_ylabel()
Axes
クラスとそれのメンバ関数は、オブジェクト指向のインターフェイスでの作業への主エントリポイントです。
axisは座標軸であり、座標スケールを設定します。スケールの位置はによって決定されますLocator决定,刻度显示格式由
Formatter决定。
Axis
これらは数直線のようなオブジェクトです(緑色の丸で囲まれています)。グラフの制限を設定し、目盛り(軸上のマーク)と目盛りラベル(目盛りにラベルを付ける文字列)を生成します。ティックの位置はLocator
オブジェクトによって決定され、ティック ラベル文字列はFormatter
。によってフォーマットされます 。正しいLocator
と の組み合わせにより、 Formatter
目盛りの位置とラベルを非常に細かく制御できます。
軸、軸、線、テキストなど、基本的に図に表示されるすべてのものはアーティストです。フィギュアがレンダリングされた後、すべてのアーティストがキャンバスに描かれます。ほとんどのアーティストは特定の軸に属しています。
Artist
基本的には図に見ることができるすべてのものは、アーティスト(さえある Figure
、 Axes
と Axis
オブジェクト)。これにはText
、Line2D
オブジェクト、collection
オブジェクト、 オブジェクト、オブジェクトが 含まれ ます Patch
...(あなたは考えを理解します)。フィギュアがレンダリングされると、すべてのアーティストがキャンバスに描画され ます。ほとんどのアーティストは斧に縛られています。このようなアーティストは、複数の軸で共有したり、ある軸から別の軸に移動したりすることはできません。
2つ目は、QGraphicsViewがmatplotlibによって描画されたヒストグラムを表示することです。
QtDesignerを使用してインターフェイスを設定した後、ヒストグラムを表示する必要があるインターフェイスがあります。チェックされたPyqt5は、matplotlibを介してヒストグラムを描画できます。次のドキュメントを参照して描画します。
https://www.cnblogs.com/laoniubile/p/5904817.html
図、軸、軸の紹介は次のとおりです。
https://matplotlib.org/api/_as_gen/matplotlib.figure.Figure.html
https://matplotlib.org/api/axis_api.html
https://matplotlib.org/api/axes_api.html
https://matplotlib.org/api/artist_api.html
最初のステップは、matplotlib.backends.backend_qt5aggクラスを介してPyQt5に接続することです。これには、バックエンドの概念が含まれます。
バックエンドの公式ウェブサイトの紹介:https://matplotlib.org/faq/usage_faq.html#what-is-a-backend
matplotlibは、インタラクティブプログラミング用のpythonシェルでよく使用され、wxpythonやpygtkなどのグラフィカルインターフェイスとしても使用されます。また、Webアプリケーションサーバーで動的に画像を提供するためにも使用されます。したがって、これらすべての要件を含めることができるようにするために、matplotlibはさまざまな出力を指すバックエンドを提供し、対応するフロントエンドはユーザーが作成して使用するコードインターフェイスです。バックエンドには2つのタイプがあります。1つはユーザーインターフェイスバックエンド(pygtk、wxpython、tkinter、qt4、macosxなどのインタラクティブバックエンドに使用)、もう1つはハードコピーバックエンド(主にPNG、SVG、PDFに使用)です。 、PSそのような写真はレンダリングされて保存されます)。
import matplotlib
matplotlib.use("Qt5Agg")
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
from matplotlib.figure import Figure
from matplotlib import pyplot
pyplot.rcParams['font.sans-serif'] = ['SimHei']
pyplot.rcParams['axes.unicode_minus'] = False
ステップ2:特定のグラフィックコードの実装重要なのは、各描画の後にself.fig.canvas.draw()でキャンバスを更新することです。最初はそのような文はなく、最初の写真しか表示できません。後で軸を使用して画像を再描画した後、表示は更新されなくなります。問題の原因を見つけるために、再描画された画像をself.fig.savefig(filename)で保存して、それが描画または表示の理由であるかどうかを確認します。savefigを追加した後、表示も正常であり、保存された画像も正常であることがわかります。
表示を更新するためにsavefigはどのような操作を行いましたか?self.canvas.print_figure(fname、** kwargs)が実行されていることが図のソースファイルで確認できます。
このステップを実行した後に更新できるのはなぜですか?print_figureのソースコードを見つけるために、print_figureの実行を失敗させるエラーパラメーターが渡されました。
最後に、backend_qt5agg.pyで定義されているprint_figureメソッドが見つかりました。また、キャンバスを更新するためのdraw()メソッドがあります。
class FigureCanvasQTAgg(FigureCanvasAgg, FigureCanvasQT):
def print_figure(self, *args, **kwargs):
super().print_figure(*args, **kwargs)
self.draw()
class Figure_Bar(FigureCanvasQTAgg):
def __init__(self, width ,height , parent = None):
self.fig = pyplot.figure(figsize=(width, height), facecolor='#666666', dpi= 100, edgecolor='#0000FF')
FigureCanvasQTAgg.__init__(self, self.fig )
self.setParent(parent)
self.myAxes = self.fig.add_subplot(111)
self.x = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9 ]
def ShowImage(self, axisX, axisY ):
filename = os.getcwd() + "/" + datetime.datetime.now().strftime('%H-%M-%S.%f') + ".png"
#由于图片需要反复绘制,所以每次绘制前清空,然后绘图,最后刷新显示。
self.myAxes.clear()
self.myAxes.bar(self.x, axisY, width = 0.02, color = 'blue', align = 'center', tick_label = axisX )
# 刷新画布,否则不刷新显示
self.fig.canvas.draw()
3番目のステップは、GUIのQGraphicsViewコントロールを介してmatplotlibによって描画されたグラフィックを表示することです。
#获取graphicsView的长和宽单位为像素,Figure的单位是inches,在DPI为100时,除以100转换为inches
width = self.graphicsView.width()
height = self.graphicsView.height()
self.myImage = Figure_Bar(width/100, height/100)
self.myGraphyScene = QGraphicsScene()
#取消水平和垂直滚动条
self.graphicsView.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.graphicsView.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.myQGraphicsProxyWidget = self.myGraphyScene.addWidget(self.myImage)
self.graphicsView.setScene(self.myGraphyScene)
#每次显示不同图像,只需调用ShowImage方法
self.myImage.ShowImage(self.axisXcontent, self.axisYcontent)