2017-05-29 20 views
2

便利な機能を提供する標準のmatplotlibナビゲーションバーを含む、matplotlibが埋め込まれたQt GUIでスペースの使用を最大限にしようとしていますMatplotlibの透明ナビゲーションバー

残念ながら、NavigationBarは、プロットウィンドウに「ワイドスクリーン」の比率があると、多くのスペースを占有してしまいます(下記参照)。すべてのボタンは左側にありますが、NavigationBarは空白のバーも作成します。 enter image description here

私の意図したアプリケーションはQtのGUIでmatplotlibの図を埋め込むしている間、私はこれは、デフォルトのmatplotlibのをax.plot操作によって表示される標準の図に適用できる一般的な質問であると考えています。

このスペースを使用できますか?ここでテキストとマルチウィジェットを設定しようとしましたが、それらは常にナビゲーションバーの後ろに隠されています。おそらく、このバーの色を透明にする設定がありますか?

また、図にウィジェットとしてボタンを追加する簡単な方法があるので、NavigationBarは必要ありません。私はバーが提供するスタイルと機能が気に入っているので、手動でそれぞれを再実装する必要はありません。

ありがとうございました。

答えて

1

NavigationToolbarは、通常QWidgetです。これは、あなたがそれをレイアウト の変化するメニューへ

  • それを入れて、他のウィジェット
  • のレイアウトにそれを置く

    • 含めて、あなたはまた、他のウィジェットで行うことができるだろうということですべてを行うことができることを意味し絶対にGUI
    • などの内側に...

    質問はすべてのためのソリューションを提供するために少し広すぎる

  • 位置それら; PyQtのウィジェットの操作方法や配置方法については、十分なリソースがあります。

    以下は絶対配置されたNavigationToolbarの例です(デフォルトでは透明です)。ツールバーは軸の原点に配置され、図のサイズが変更されている場合はその位置にとどまります。これはどこかでよりコンパクトなGUIでナビゲーションバーを配置するためにうまく機能 -

    GUI with tranparent navigation toolbar

    import matplotlib.pyplot as plt 
    from PyQt4 import QtGui 
    from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 
    from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar 
    
    class Window(QtGui.QMainWindow): 
        def __init__(self, fig): 
         self.qapp = QtGui.QApplication([]) 
    
         QtGui.QMainWindow.__init__(self) 
         self.widget = QtGui.QWidget() 
         self.setCentralWidget(self.widget) 
         self.widget.setLayout(QtGui.QVBoxLayout()) 
         self.widget.layout().setContentsMargins(0,0,0,0) 
         self.widget.layout().setSpacing(0) 
    
         self.fig = fig 
         self.canvas = FigureCanvas(self.fig) 
         self.canvas.draw() 
         self.canvas.mpl_connect("resize_event", self.resize) 
    
         self.widget.layout().addWidget(self.canvas) 
    
         self.nav = NavigationToolbar(self.canvas, self.widget, coordinates=False) 
         self.nav.setMinimumWidth(300) 
         self.nav.setStyleSheet("QToolBar { border: 0px }") 
    
         self.show() 
         self.qapp.exec_() 
    
        def resize(self, event): 
         # on resize reposition the navigation toolbar to (0,0) of the axes. 
         x,y = self.fig.axes[0].transAxes.transform((0,0)) 
         figw, figh = self.fig.get_size_inches() 
         ynew = figh*self.fig.dpi-y - self.nav.frameGeometry().height() 
         self.nav.move(x,ynew) 
    
    # create a figure with a subplot 
    fig, ax = plt.subplots(figsize=(5,3)) 
    # colorize figure and axes to make transparency obvious 
    fig.set_facecolor("#e9c9ef") 
    ax.set_facecolor("#f7ecf9") 
    ax.plot([2,3,5,1], color="#ab39c1") 
    fig.tight_layout() 
    
    # pass the figure to the custom window 
    a = Window(fig) 
    
  • +0

    感謝。重要な点として、これを他のレイヤーの上にオーバーレイすることが可能です(理想的にはQtウィジェットを一般的にオーバーレイできます)。 – PhysLQ

    +1

    あなたはそれを試してみて、それがうまくいかない場合、あなたの質問を[mcve]と明確な問題の説明で更新してください。 – ImportanceOfBeingErnest

    +1

    私はこれを詳しく見て、更新された答えの完全な例を提供しました。 – ImportanceOfBeingErnest

    関連する問題