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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Python

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

Q&A

解決済

1回答

968閲覧

PyQt5で複数の座標をプロットしたい

Ykkykk

総合スコア140

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Python

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

0グッド

1クリップ

投稿2018/09/04 08:02

編集2018/09/05 08:39

前提・実現したいこと

PyQt5を使用して座標をプロットしてみたいと思っております。CSVファイルに格納された値を取り出し、それを座標として点々を打っていくイメージです。例えば、A列の値をX座標、B列の値をY座標とするような感じです。
PyQt5でCSVファイルをインポートし、Pandasで値を読み取り、プロットした結果をウィンドウに表示したいです。

発生している問題・エラーメッセージ

ウィジェットとして作成した表示領域の上に、どのように座標をプロットしていくのかがわかりません。
以下のコードですと、表示領域とボタンは表示できているのですが、罫線が表示されません。
また、CsvPlotterの中でreadCsv()関数を定義しPandasを使用しようとしているのですが、ここで使用すると、MapPlotの方でプロットする点を生成できなくなるような気もしています。一方で、CsvPlotterの方では、ファイルをインポートするためにreadCsv()関数を定義する必要があるようにも思い、どうしたらいいのかわかりません。

該当のソースコード

Python

1# - * - coding: utf-8 - * - 2 3import sys 4 5import pandas as pd 6 7from PyQt5.QtWidgets import * 8from PyQt5.QtGui import * 9from PyQt5.QtCore import * 10 11class CsvPlotter(QMainWindow): 12 def __init__(self): 13 super().__init__() 14 self.initUI() 15 16 def initUI(self): 17 18 maxWidth = self.maximumWidth() 19 maxHeight = self.maximumHeight() 20 21 self.setLayout() 22 self.statusBar() 23 24 self.setGeometry(0, 0, maxWidth, maxHeight) 25 self.setWindowTitle('Csv Plotter') 26 27 self.show() 28 29 def setLayout(self): 30 31 exitAction = QAction('&exit', self) 32 exitAction.setShortcut('Ctrl+Q') 33 exitAction.setStatusTip('Exit Application.') 34 exitAction.triggered.connect(qApp.quit) 35 36 readCsvAction = QAction('&Open CSV', self) 37 readCsvAction.setStatusTip('Open CSV File.') 38 readCsvAction.triggered.connect(self.readCsv) 39 40 menubar = self.menuBar() 41 fileMenu = menubar.addMenu('&File') 42 fileMenu.addAction(exitAction) 43 fileMenu.addAction(readCsvAction) 44 45 self.w = QWidget() 46 47 self.paint_area = QGraphicsView() 48 scene = QGraphicsScene(self.paint_area) 49 srect = self.paint_area.rect() 50 width = srect.width() 51 height = srect.height() 52 53 self.open_file_button = QPushButton('Open File', self) 54 self.open_file_button.clicked.connect(self.readCsv) 55 56 w_layout = QGridLayout() 57 58 w_layout.addWidget(self.paint_area, 0, 0, 36, 3) 59 60 w_layout.addWidget(self.open_file_button, 1, 11, 1,1) 61 self.w.setLayout(main_pane) 62 self.setCentralWidget(self.w) 63 64 65 def readCsv(self): 66 path = QFileDialog.getOpenFileName(self, 'Open a file.','~') 67 self.df = pd.read_csv(path, header=None) 68 69class MapPlot(QGraphicsItem): 70 71 def __init__(self, width=400, height=400): 72 super(MapPlot, self).__init__() 73 74 self.width = width 75 self.height = height 76 self.x_origin = width * 1 / 2 77 self.y_origin = height * 1 / 2 78 79 def paint(self, painter, option, widget): 80 painter.setPen(Qt.gray) 81 painter.drawLine(0, self.y_origin, self.width, self.y_origin) 82 painter.drawLine(self.x_origin, 0, self.x_origin, self.height) 83 84def main(): 85 app = QApplication(sys.argv) 86 gui = CsvPlotter() 87 sys.exit(app.exec_()) 88 89if __name__ == '__main__': 90 main()

質問自体がわかりにくいかと思いますが、ご助言いただけますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

グラフの描写

Qt 機能でも点を描画したりはできますが、それで体裁の整ったグラフを作成するのは大変です。
matplotlib などの Python のグラフ作成ライブラリでグラフを作成し、画像化して Qt 上に表示するのがよいかと思います。

グラフ作成の手順

  • 自分は pandas に詳しくないので、matplotlib でグラフを作成しました。
  • 画像を表示するだけなので、QLabel を使用しました。
  1. numpy で CSV を読み込む。
  2. matplotlib でグラフをレンダリングする。
  3. 作成した画像を QImage に変換する。

イメージ説明

サンプルコード

サンプルとして、以下の CSV を使いました。

csv

1X,Y 2-0.11904244125880663,0.38604683228846814 3-1.057116895394611,-1.637295904162237 4-1.6226321873996457,-0.8903071233344362 50.31579843377941075,-1.2160738373532796 6-1.6004130434344865,-0.011108237917387532 7-2.0392655019956885,1.1976755572381765 8-1.1269736514295516,-0.5372561852679467 91.2759382926636726,-0.20616965560956768 10-0.936968605825384,0.2800013518075348 110.8548796880555768,0.16609017856128488 120.14483257755905343,1.2362537405002108 13-0.38195509077267725,-1.2488842012333055 140.7061953129595218,-0.41066161883676366 15-1.8833232284258883,-0.2668120276323988 16-1.027057833849912,0.5221427636845989 171.123321837354084,1.4793126503521312 18-0.7427780969460384,0.14812511748813958 190.7513514254097702,-0.28033732779987636 20-2.1179155424676614,0.5668258470393494 21-0.48140251707086207,0.12088514237687714

python

1# - * - coding: utf-8 - * - 2 3import sys 4 5import matplotlib 6matplotlib.use('Agg') # Agg バックエンドを使用 7import matplotlib.pyplot as plt 8import numpy as np 9from matplotlib.backends.backend_agg import FigureCanvasAgg 10from PyQt5.QtWidgets import * 11from PyQt5.QtGui import * 12from PyQt5.QtCore import * 13 14 15class CsvPlotter(QMainWindow): 16 def __init__(self): 17 super().__init__() 18 self.initUI() 19 20 def initUI(self): 21 self.setLayout() 22 self.statusBar() 23 24 self.setGeometry(0, 0, 600, 600) 25 self.setWindowTitle('Csv Plotter') 26 27 def setLayout(self): 28 # 「アプリケーションを閉じる」アクションを作成する。 29 exitAction = QAction('&exit', self) 30 exitAction.setShortcut('Ctrl+Q') 31 exitAction.setStatusTip('Exit Application.') 32 exitAction.triggered.connect(qApp.quit) 33 34 # 「CSV ファイルを開く」アクションを作成する。 35 readCsvAction = QAction('&Open CSV', self) 36 readCsvAction.setStatusTip('Open CSV File.') 37 readCsvAction.triggered.connect(self.readCsv) 38 39 # メニューバーに設定する。 40 menubar = self.menuBar() 41 fileMenu = menubar.addMenu('&File') 42 fileMenu.addAction(exitAction) 43 fileMenu.addAction(readCsvAction) 44 45 # 「CSV ファイルを開く」ボタンを作成する。 46 open_file_button = QPushButton('Open File', self) 47 open_file_button.clicked.connect(self.readCsv) 48 49 self.view = QLabel() 50 # 画像に合わせて QLabel の大きさを変更する。 51 self.view.setScaledContents(True) 52 53 # レイアウトを設定する。 54 w_layout = QGridLayout() 55 w_layout.addWidget(self.view, 0, 0, 36, 3) 56 w_layout.addWidget(open_file_button, 1, 11, 1, 1) 57 self.w = QWidget() 58 self.w.setLayout(w_layout) 59 self.setCentralWidget(self.w) 60 61 def readCsv(self): 62 path = QFileDialog.getOpenFileName(self, 'Open a file.', '~') 63 if not path[0]: 64 return # ファイルが選択されていない場合 65 66 # CSV を読み込む。 67 data = np.loadtxt(path[0], delimiter=",", skiprows=1) 68 69 # グラフを作成する。 70 pixmap = self.create_graph(data) 71 72 # ラベルに画像を表示する。 73 self.view.setPixmap(pixmap) 74 75 def create_graph(self, data): 76 # 散布図を作成する。 77 fig, axes = plt.subplots(figsize=(5, 5)) 78 axes.scatter(data[:, 0], data[:, 1]) 79 80 # レンダリングする。 81 canvas = FigureCanvasAgg(fig) 82 canvas.draw() 83 84 # matplotlib がレンダリングした画像を QImage に変換する。 85 w, h = canvas.get_width_height() 86 image = QImage( 87 canvas.buffer_rgba(), w, h, QImage.Format_ARGB32) 88 return QPixmap(image) 89 90 91def main(): 92 app = QApplication(sys.argv) 93 gui = CsvPlotter() 94 gui.show() 95 sys.exit(app.exec_()) 96 97 98if __name__ == '__main__': 99 main()

投稿2018/09/11 15:18

tiitoi

総合スコア21956

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

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

Ykkykk

2018/09/12 03:07

ご回答いただきありがとうございます。 matplotlibを使用した方がグラフを書きやすいのですね。 ただ、質問が足りなかったのですが、CSVファイルに入っている座標は地理的な緯度経度の座標で、それを座標平面上にプロットしたいと考えております。特にグーグルマップのような地理的な図像は不要で、単純にX軸とY軸のある座標平面上に地理的な緯度経度の座標をプロットすることはできないかな、と考えています。 何はともあれ、ご回答いただきありがとうございました!!
Ykkykk

2018/09/12 03:31

そうなんですね!!!! 初めて知りました。参考にさせていただきます。本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問