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

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

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

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

Qt

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

Python

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

Q&A

解決済

1回答

4492閲覧

PyQt5:プロットする領域を拡大・縮小したい

Ykkykk

総合スコア140

Python 3.x

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

Qt

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

Python

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

0グッド

0クリップ

投稿2018/09/10 07:39

PyQt5を使用してグラフ上に点をプロットしたいと思っております。
PyQtを使用して作成したウィンドウ上に、描画用の領域を作成し、その上に点を打ちたいと思っております。
現在、描画用の領域は作成できており、その上に罫線と点を打つことはできています。

しかし、点を打つために使用しているデータが非常に細かい小数点の値であり、かつとても近い値同士であるため、drawPointメソッドを使用して点を打つと、それが複数打てているのか一つしか打てていないのかもわかりません。非常に小さな点が一つだけ見ている状態です。

そこで、座標平面の縮尺を変更して、複数の点が見えるようにすることはできないのでしょうか?

質問自体がわかりにくいかと思いますが、ご教示くださいますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

drawPoint は点の大きさの指定等はできないので難しいです。

QGraphicsSceneQGraphicsView を使うのはどうでしょうか?

  • QGraphicsView の scale() 関数で倍率を指定すると、QGraphicsScene に描画されているアイテムが自動でスケールされて表示されます。
  • イベントを拾えば、マウスホイールで倍率をグリグリ変えたりできます。
  • 点の描画は addPoint() のような関数はないので、addEllipse() で行います。

サンプルコード

PyQt の環境がないためC++ のコードになりますが、Qt の API は基本同じだと思います。

cpp

1#include "mainwindow.h" 2#include "ui_mainwindow.h" 3 4#include <random> 5 6#include <QGraphicsScale> 7 8MainWindow::MainWindow(QWidget *parent) 9 : QMainWindow(parent), ui(new Ui::MainWindow) 10{ 11 ui->setupUi(this); 12 // シーンを作成する。 13 QGraphicsScene *scene = new QGraphicsScene(); 14 // シーンを QGraphcsView に設定する。 15 ui->graphicsView->setScene(scene); 16 17 // アンチエイリアス設定 18 ui->graphicsView->setRenderHints( 19 QPainter::Antialiasing | QPainter::SmoothPixmapTransform 20 | QPainter::HighQualityAntialiasing); 21 22 // [0, 100] の一様分布に従う点 (x, y) を 100 個描画する。 23 std::random_device device; 24 std::mt19937 engine(device()); 25 std::uniform_real_distribution<> dist(0, 100); 26 27 for (int i = 0; i < 100; i++) { 28 double x = dist(engine); 29 double y = dist(engine); 30 scene->addEllipse(x, y, 1, 1, QPen(Qt::blue), QBrush(Qt::blue)); 31 } 32} 33 34MainWindow::~MainWindow() 35{ 36 delete ui; 37} 38 39void MainWindow::on_doublePushButton_clicked() 40{ 41 // スケール変更 42 ui->graphicsView->resetMatrix() 43 ui->graphicsView->scale(2, 2); 44} 45 46void MainWindow::on_halfPushButton_clicked() 47{ 48 // スケール変更 49 ui->graphicsView->resetMatrix() 50 ui->graphicsView->scale(0.5, 0.5); 51} 52 53void MainWindow::on_DefaultPushButton_clicked() 54{ 55 // スケール変更 56 ui->graphicsView->resetMatrix() 57}

cpp

1#ifndef MAINWINDOW_H 2#define MAINWINDOW_H 3 4#include <QMainWindow> 5 6namespace Ui 7{ 8class MainWindow; 9} 10 11class MainWindow : public QMainWindow 12{ 13 Q_OBJECT 14 15 public: 16 explicit MainWindow(QWidget *parent = 0); 17 ~MainWindow(); 18 19 private slots: 20 void on_doublePushButton_clicked(); 21 void on_halfPushButton_clicked(); 22 void on_DefaultPushButton_clicked(); 23 24 private: 25 Ui::MainWindow *ui; 26}; 27 28#endif // MAINWINDOW_H

イメージ説明

イメージ説明

投稿2018/09/11 08:19

編集2018/09/19 02:21
tiitoi

総合スコア21956

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

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

Ykkykk

2018/09/12 03:04

ご回答いただきありがとうございます。 こんなに丁寧にまた詳細にコードまでご提示いただき本当に感謝しております。 こちらのコードを参考にもう少し考えてみたいと思います。
Ykkykk

2018/09/19 01:02

何度も申し訳ないのですが、ご覧になられておりましたらご回答下されば幸いです。 ご提示いただきましたコードの中に「x1」をする部分がありますが、これは等倍する(最初の縮尺に戻す)という処理なのでしょうか? 仮に2倍に拡大してから1倍にしても2倍のまま変わらないのではないかと思ったのですが、いかがでしょうか? PyQtの環境でscale(1,1)を指定しても変わらなかったので、等倍する方法をお教え頂ければ、と思い、再度コメントいたしました。
tiitoi

2018/09/19 02:20

ドキュメントを確認したところ、今現在のスケールを (sx, sy) 倍する意味だったので、これでは等倍にならないですね。 ``` void QGraphicsView::scale(qreal sx, qreal sy) ``` Scales the current view transformation by (sx, sy). 元のスケールから 0.5倍、等倍、2倍したい場合は、変換行列を単位行列に戻す (つまり、なにも変換してない状態) resetMatrix() があるので、これを使うといいでしょう。 回答を修正しました。
Ykkykk

2018/09/20 06:50 編集

再度ご回答いただきありがとうございます。 こちらのresetMatrix()なのですが、 'QGraphicsView' object has no attribute 'resetMatrix' というAttributeErrorが返されてしまいます。 環境の問題なのでしょうか?
Ykkykk

2018/09/20 07:03

resetMatrix()ではAttributeErrorが出ますが、resetTransform()を使用すると等倍することができました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問