Python用QCustomPlotのバインド

こんにちは、habrozhiteli!



はじめに



暇なときに、彼はPyQt5でアプリケーションを書くことに興味を持ちました。 そして、5月末に、 MyWalletは、Pythonプラスからホームアカウンティングを実行するという長年のプロジェクトを書き直すことを決定しました。以前のバージョンでは、修正したい多くのアーキテクチャエラーが発生しました。 したがって、Fedora 21のソースからPyQt5を収集し、2週間でどこかに以前のすべての機能を実装しました。 そして今、月ごとの費用/収入に関するデータの視覚化において疑問が生じています。 QCustomPlotを使用してデータを視覚化した経験があるため、このライブラリを使用して視覚化を行いたいと思いました。 しかし、残念ながら、バインドは見つかりませんでした。



組立



PyQt5のソースを確認すると、バインドの生成がSIPを使用して実装されていることがわかりました。 SIPは、クラスメソッドの簡略化されたヘッダー(当然、いわゆる注釈付き)のようなものを受け取り、C ++コードを生成して既製のPythonモジュールを作成します。



したがって、Python用のQCustomPlotモジュールを構築するには、次のものが必要です。

  1. Qt5.x。
  2. SIPは最新バージョンです。
  3. PyQt5.x。
  4. ダイナミックリンクライブラリqcustomplotとしてアセンブルされ、Qt 5.xでアセンブルされます。
  5. ライブラリクラスインターフェイスの説明を含む特別な形式のファイル。




このlibの既製のインターフェースファイルを探してgithubを調べてみると、所有者がPyQt4の場合でもバインダーを収集しているqcustomplot-pythonリポジトリに出会いました 。 同様に、qcustomplot.sipインターフェイスファイルを取得します。



また、configure.pyは同じリポジトリにあります。これは、ご存じのとおり、Pythonモジュールの構築とインストールに必要です。 このファイルは、PyQtの新しいバージョンに適合させる必要がありました。



それでは、標準:



$ python3 configure.py build $ make $ sudo make install
      
      







すべてがうまくいったことを確認し、IPyを実行します。

 $ python3 >>> import qcustomplot >>> dir(qcustomplot) ['QCP', 'QCPAbstractItem', 'QCPAbstractLegendItem', 'QCPAbstractPlottable', 'QCPAxis', 'QCPAxisRect', 'QCPBarData', 'QCPBars', 'QCPBarsGroup', 'QCPColorGradient', 'QCPColorMap', 'QCPColorMapData', 'QCPColorScale', 'QCPColorScaleAxisRectPrivate', 'QCPCurve', 'QCPCurveData', 'QCPData', 'QCPFinancial', 'QCPFinancialData', 'QCPGraph', 'QCPGrid', 'QCPItemAnchor', 'QCPItemBracket', 'QCPItemCurve', 'QCPItemEllipse', 'QCPItemLine', 'QCPItemPixmap', 'QCPItemPosition', 'QCPItemRect', 'QCPItemStraightLine', 'QCPItemText', 'QCPItemTracer', 'QCPLayer', 'QCPLayerable', 'QCPLayout', 'QCPLayoutElement', 'QCPLayoutGrid', 'QCPLayoutInset', 'QCPLegend', 'QCPLineEnding', 'QCPMarginGroup', 'QCPPainter', 'QCPPlotTitle', 'QCPPlottableLegendItem', 'QCPRange', 'QCPScatterStyle', 'QCPStatisticalBox', 'QCustomPlot', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__'] >>>
      
      







さて、完全に美しくするために、 BarsDemoの例のコードを引用しています:

サンプルコード
 import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication from PyQt5.QtGui import QColor, QPen from qcustomplot import QCustomPlot, QCPBars, QCP if __name__ == '__main__': app = QApplication(sys.argv) w = QCustomPlot() regen = QCPBars(w.xAxis, w.yAxis) nuclear = QCPBars(w.xAxis, w.yAxis) fossil = QCPBars(w.xAxis, w.yAxis) w.addPlottable(regen) w.addPlottable(nuclear) w.addPlottable(fossil) pen = QPen() pen.setWidthF(1.2) fossil.setName('Fossil fuels') pen.setColor(QColor(255, 131, 0)) fossil.setPen(pen) fossil.setBrush(QColor(255, 131, 0, 50)) nuclear.setName('Nuclear') pen.setColor(QColor(1, 92, 192)) nuclear.setPen(pen) nuclear.setBrush(QColor(1, 92, 191, 50)) regen.setName('Regenerative') pen.setColor(QColor(150, 222, 0)) regen.setPen(pen) regen.setBrush(QColor(150, 222, 0, 70)) nuclear.moveAbove(fossil) regen.moveAbove(nuclear) ticks = [1, 2, 3, 4, 5, 6, 7] labels = ['USA', 'Japan', 'Germany', 'France', 'UK', 'Italy', 'Canada'] w.xAxis.setAutoTicks(False) w.xAxis.setAutoTickLabels(False) w.xAxis.setTickVector(ticks) w.xAxis.setTickVectorLabels(labels) w.xAxis.setTickLabelRotation(60) w.xAxis.setSubTickCount(0) w.xAxis.grid().setVisible(True) w.xAxis.setRange(0, 8) w.yAxis.setRange(0, 12.1) w.yAxis.setPadding(5) w.yAxis.setLabel('Power Consumption in\nKilowatts per Capita (2007)') w.yAxis.grid().setSubGridVisible(True) grid_pen = QPen() grid_pen.setStyle(Qt.SolidLine) grid_pen.setColor(QColor(0, 0, 0, 25)) w.yAxis.grid().setSubGridPen(grid_pen) fossil_data = [0.86 * 10.5, 0.83 * 5.5, 0.84 * 5.5, 0.52 * 5.8, 0.89 * 5.2, 0.90 * 4.2, 0.67 * 11.2] nuclear_data = [0.08 * 10.5, 0.12 * 5.5, 0.12 * 5.5, 0.40 * 5.8, 0.09 * 5.2, 0.00 * 4.2, 0.07 * 11.2] regen_data = [0.06 * 10.5, 0.05 * 5.5, 0.04 * 5.5, 0.06 * 5.8, 0.02 * 5.2, 0.07 * 4.2, 0.25 * 11.2] fossil.setData(ticks, fossil_data) nuclear.setData(ticks, nuclear_data) regen.setData(ticks, regen_data) w.legend.setVisible(True) w.axisRect().insetLayout().setInsetAlignment(0, Qt.AlignTop|Qt.AlignHCenter) w.legend.setBrush(QColor(255, 255, 255, 200)) legendPen = QPen() legendPen.setColor(QColor(130, 130, 130, 200)) w.legend.setBorderPen(legendPen) w.setInteractions(QCP.iRangeDrag or QCP.iRangeZoom) w.show() sys.exit(app.exec())
      
      







起こったことは次のとおりです。

結果
画像





PS



ソースリポジトリへのリンク: QCustomPlot-PyQt5 RPMSディレクトリのリポジトリには、Fedora21のSRPMとRPM(PyQt5、qcustomplot 1.3.1およびpython3-qcustomplot)が含まれています。



すべてのコメントと提案を歓迎します。 このモジュールが役に立つことを願っています。 ご清聴ありがとうございました!



All Articles