質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2585閲覧

Pyqt5にmatplotlib埋め込みで画像表示する時の余白埋め

ookura

総合スコア27

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/01/14 01:27

下記サイトのコードを参考に画像ビューアを作成しています。
参考サイト

表示させるときのビューア上の余白が気になり、
余白が少ない状態(画像をビューアの表示部分いっぱいまで拡大)にできないか
調べているのですが、いい方法がわかりません。

イメージ説明
そもそも構成上、そういったことは不可なのでしょうか。
お詳しい方ご教示いただけますと幸いです。

python

1import sys 2import os 3 4import numpy as np 5import matplotlib.pyplot as plt 6 7from PyQt5 import QtWidgets 8from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas 9 10import glob 11from PIL import Image 12 13class Application(QtWidgets.QWidget): 14 def __init__(self): 15 super().__init__() 16 # UIの初期化 17 self.initUI() 18 19 # rootディレクトリ 20 self.root = './Image/' 21 # 拡張子 22 self.ext = 'bmp' 23 24 # ファイルを配置 25 self.set_FileList() 26 27 # 画像 28 self.FileName = self.FileList.item(0).text() 29 30 # 画像を読み込む 31 self.load_ImageFile() 32 33 # Figureの初期化 34 self.initFigure() 35 36 # ファイルを変更した時のイベント 37 self.FileList.itemSelectionChanged.connect(self.FileList_Changed) 38 39 # UIの初期化 40 def initUI(self): 41 # Figure用のWidget 42 self.FigureWidget = QtWidgets.QWidget(self) 43 # FigureWidgetにLayoutを追加 44 self.FigureLayout = QtWidgets.QVBoxLayout(self.FigureWidget) 45 # Marginを消す 46 self.FigureLayout.setContentsMargins(0,0,0,0) 47 48 # ファイルのリスト 49 self.FileList = QtWidgets.QListWidget(self) 50 51 # 配置 52 self.setGeometry(0,0,900,600) 53 self.FigureWidget.setGeometry(200,0,700,600) 54 self.FileList.setGeometry(0,0,200,600) 55 56 # Figureの初期化 57 def initFigure(self): 58 # Figureを作成 59 self.Figure = plt.figure() 60 # FigureをFigureCanvasに追加 61 self.FigureCanvas = FigureCanvas(self.Figure) 62 # LayoutにFigureCanvasを追加 63 self.FigureLayout.addWidget(self.FigureCanvas) 64 65 self.axis = self.Figure.add_subplot(1,1,1) 66 self.axis_image = self.axis.imshow(self.image, cmap='gray') 67 plt.axis('off') 68 69 # ファイルを配置 70 def set_FileList(self): 71 # ファイルの読み込み 72 Files = glob.glob(self.root+'*.'+self.ext) 73 # ソート 74 self.Files = sorted(Files) 75 76 # ファイルリストに追加 77 for file in self.Files: 78 self.FileList.addItem(os.path.basename(file)) 79 80 # ファイルを変更した時の関数 81 def FileList_Changed(self): 82 # 選択しているファイルの名前を取得 83 self.FileName = self.FileList.selectedItems()[0].text() 84 # 画像を読み込み 85 self.load_ImageFile() 86 # Figureを更新 87 self.update_Figure() 88 89 # 画像ファイルを読み込む 90 def load_ImageFile(self): 91 # 画像を開く 92 image = Image.open(self.root + self.FileName) 93 # numpy.ndarrayに 94 self.image = np.asarray(image) 95 96 # Figureを更新 97 def update_Figure(self): 98 self.axis_image.set_data(self.image) 99 self.FigureCanvas.draw() 100 101QApp = QtWidgets.QApplication(sys.argv) 102app = Application() 103app.show() 104sys.exit(QApp.exec_())

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下の stackoverflow の質問と回答が参考になるかもしれません。
https://stackoverflow.com/questions/44345962/how-to-adjust-the-size-of-a-plot-in-pyqt

上記 stackoverflow の質問に対する回答を参考にいろいろと試してみました。
例えば次のような initFigure の実装はいかがでしょうか。
キーポイントとなるのは「self.Figure.tight_layout()を追加する」です。これにより pyplot.Figure のサイズが が表示領域(おそらく FigureCanvas)に対してできるだけ広がるように調整されるようです。

また、imshow のキーワード引数 aspect="auto" を指定することで、表示する画像のアスペクト比をキャンバスサイズの比に合わせて自動で調整するようになります。
ただし、キャンバスサイズと画像のサイズのアスペクト比が異なると、画像が伸長したりするので注意が必要です。
(この点についてはおそらく何かしらの解決策がありますが、ご質問の内容とは別枠の内容と考えられるので今回は保留とします。)

python

1 # Figureの初期化 2 def initFigure(self): 3 # Figureを作成 4 self.Figure = plt.figure() 5 # FigureをFigureCanvasに追加 6 self.FigureCanvas = FigureCanvas(self.Figure) 7 FigureCanvas.updateGeometry(self) 8 # LayoutにFigureCanvasを追加 9 self.FigureLayout.addWidget(self.FigureCanvas) 10 11 self.axis = self.Figure.add_subplot(1, 1, 1) 12 self.axis_image = self.axis.imshow(self.image, cmap='gray', aspect="auto") # <- オプションでココを変更 13 self.axis.set_axis_off() # <- ココは問題解決と関係ないが、axis のメソッドを利用して plt.axis("off") と同等の操作が可能。 14 self.Figure.tight_layout() # <- この行を追加

投稿2021/01/14 13:08

Surpris

総合スコア106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ookura

2021/01/18 23:07

反応が遅れまして申し訳ありません。 丁寧にご説明いただいて、非常に勉強になりました。 一度ご教示いただいた方法で試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問