Python Code Notes

Information by python engineer

【matplotlib】凡例を設定する方法【Python】

凡例表示

matplotlibでグラフを作成する際、苦労することが多い凡例の表示位置設定方法を整理しました。

グラフをPythonの標準GUIツールであるTkinter内に表示させる例となっており、matplotlibとnumpyがインストールされていれば利用できます。matplotlibのグラフをTkinter内に表示させる方法については、こちらをご覧ください。


【スポンサーリンク】


凡例の表示方法

Axesオブジェクトに対して、legendメソッドを実行することで凡例を表示させることができます。

ax.legend()

実行するとグラフの線種・マーカーとラベルが表示された凡例が出現し、表示位置を指定しない場合はグラフとの重なりが最も少ない位置に自動調整されます。legendメソッド実行時には様々な凡例に関するパラメータを設定可能です。また、生成されるlegendオブジェクトを用いて、後から表示設定を変更することも可能です。

[↑ 目次へ]


【スポンサーリンク】


凡例の表示位置設定方法

legendメソッド実行時にlocパラメータを設定することで、凡例の表示位置を設定することができます。初期値はbestとなっており、グラフとの重なりが最も少ない位置に自動配置されます。

以下、グラフの左上に凡例を表示させる例となります。

ax.legend(loc="upper left")

legendオブジェクト生成後に位置設定したい場合は、set_locメソッドが使用可能です。

legend = ax.legend()
legend.set_loc("upper left")

またはsetメソッドでパラメータを再設定することも可能です。

legend = ax.legend()
legend.set(loc="upper left")

設定できるlocパラメータは以下の通りです。指定の文字列または数字コードを使用することが可能です。

文字列 数字コード
best 0
upper right 1
upper left 2
lower left 3
lower right 4
right 5
center left 6
center right 7
lower center 8
upper center 9
center 10

[↑ 目次へ]


【スポンサーリンク】


グラフ領域の外側に凡例を表示させる場合

bbox_to_anchorを設定することで、グラフ領域の外側に凡例を表示させることが可能です。

bbox_to_anchorは凡例ボックスの固定位置(座標)を設定するためのパラメータです。グラフ領域の中央部が(0,0)で、右上が(1,1)、左下が(-1,-1)となります。この座標に対して、凡例ボックスのlocパラメータで設定した位置が固定されることになります。

locパラメータはグラフ領域内の凡例表示位置設定しかできませんでしたが、bbox_to_anchorでグラフ領域の座標(1以上の座標)を設定することで、グラフ領域の外側に凡例を表示させることが可能となります。

legend = ax.legend(bbox_to_anchor=(1,1))

以下の例ではbbox_to_anchorを(1, 1)、locを"Upper Left"に設定しています。凡例ボックスの左上がグラフ領域の右上端に固定されることになります。

グラフ領域外に凡例を表示

[↑ 目次へ]


【スポンサーリンク】


凡例表示位置設定ウィンドウ

凡例の位置設定方法の具体例として、凡例の表示/非表示切り替え、固定位置指定、ドラッグ移動可否設定を行うための別ウィンドウを作成しました。

matplotlib legend setting example

実行するとグラフ画面とは別に凡例位置を設定するためのウィンドウが現れ、選択した内容に応じてグラフ画面が更新されて凡例の設定が変化します。

25行目の self.fig = legend.parent.get_figure() で、legendオブジェクトの親オブジェクト(Axesオブジェクト)を取得し、さらにget_figureメソッドを用いてFigureオブジェクトを取得しています。ここで取得したFigureオブジェクトに対して、64行目でself.fig.canvas.draw()を実行して画面の更新を行っています。

凡例位置設定ウィンドウ

[↑ 目次へ]


【スポンサーリンク】


オプション一覧

使用頻度の高いlegendオブジェクトのメソッド、パラメータを以下に示します。

オプション 説明
loc 凡例の固定位置の設定。デフォルトでbest
bbox_to_anchor 凡例を固定するグラフ領域上の座標の設定。(1,1)でグラフ領域右上(外側)。グラフ領域外に凡例を表示される際に便利。
ncols 凡例の列設定。デフォルトで1。
draggable 凡例のドラッグ移動可否設定。デフォルトでFalse。Trueにすると凡例のドラッグ移動が可能となる。
.set 各種パラメータを再設定するためのメソッド

[↑ 目次へ]


【スポンサーリンク】


【tkinter】解像度を調整する方法【Python】

tkinterでアプリを作成した際に、PCシステムとtkinter画面の解像度と一致していないと文字がつぶれてしまいます。 表示をクリアにするために、Python側でシステムの改造度を取得・設定する方法を示します。


【スポンサーリンク】


解像度の設定方法

標準モジュールである「ctypes」モジュールを用いて、PCシステムの解像度を取得・設定することができます。 tkinterの画面を生成する前に、以下のコードを実行して解像度を設定することで、tkinter画面の表示がクリアになります。

ctypes.windll.shcore.SetProcessDpiAwareness(1)

コード例

[how to set system's DPI to tkinter window](https://gist.github.com/vigilantPotato/0df26edf1df969ebdf46968e1da7201b)

解像度設定前後の表示の違い

解像度設定前後

デスクトップ上ショートカットアプリの紹介【Python】

Pythonで作成したデスクトップショートカットツールを紹介します。知り合いに提供したところ評判が非常に良く、デスクトップ画面がすっきりして、日々の業務効率が非常に向上したと報告をもらっています。


【スポンサーリンク】


準備・注意事項

1.Python3のインストール

pyファイルでの提供になります。Python3がインストールされていることが必要です。 標準モジュールのみで動作するため、手動でのモジュール追加は不要です。

2.スクリプトファイル

以下のリンクから入手ください。必要なファイルは、main.pyとinput_dialog.pyのみです。 両者を同じフォルダ内に保存し、main.pyを実行すると起動します。

https://github.com/vigilantPotato/desktop_shortcut_app

main.pyの拡張子をpywに修正すると、コンソール画面なしで直接実行できるのでお勧めします。また、そのmain.pywのショートカットファイルをスタートアップフォルダに保存しておけば、PC起動時に自動で実行されます。

3.注意事項

個人の使用は無制限ですが、法人内で使用する際は一報ください。


【スポンサーリンク】


機能紹介

1.ショートカットボタンの作成

ボタンのみで構成される、非常にシンプルなショートカットアプリになります。 実行するとモニターの右上端に画面が表示され、"create new"ボタンが生成されます。

create newボタン

create newボタンを押すとショートカットボタン内容を設定するためのダイアログが表示され、ボタンタイトル、ショートカット先のurl、ボタンの背景色、ボタンタイトルの色を設定することができます。

ショートカットボタン内容の設定

以下、例としてGoogleのホームを開く設定にしました。

ショートカットボタン設定例

OKボタンを押すと設定したボタンが表示され、クリックすると登録されたリンクをデフォルトのブラウザやエクスプローラーで開きます。また、アプリも登録できます。

ショートカットボタン

続けてボタンを作成すると、下側にショートカットボタンが追加されていきます。

ショートカットボタンを追加

2.ショートカットボタンの並び替え

作成したボタンは、ドラッグにより順番を並び替えることが可能です。

ドラッグで並び替え後

3.ショートカットボタンの削除

ボタンをドラッグで画面の左側に移動させると、ボタンは削除されます。(削除前に以下の確認のダイアログが表示されます。)

ボタン削除時の警告

4.ショートカットボタンの修正

ボタンをドラッグで画面の右側に移動させると、ボタンの情報を更新することができます。

ボタン情報修正画面

5.サブウィンドウの作成

以下の様にリンク先(url)を空欄にしてボタンを作成すると、サブウィンドウを表示するボタンになります。

サブウィンドウ表示用ボタン設定(urlを空欄にする)

作成したボタンをクリックすると、メイン画面の左側にサブウィンドウが表示されます。

サブウィンドウの表示

サブウィンドウ中にもショートカットボタンを作成することができます。 ボタン数が多くなる場合は、適切にサブウィンドウを使用するとより画面がすっきりします。 ただし、サブウィンドウ内でサブウィンドウ用ボタンを作成することはできません。

サブウィンドウにショートカットボタンを作成


【スポンサーリンク】


【tkinter】アプリ起動時に画面を指定位置に移動させる方法【Python】

tkinterでアプリを作成すると、起動時に画面が出現する位置を指定したいケースがある。ここでは、ウィジェット出現時に発生するMapイベントを利用してアプリ起動時の画面位置を設定する方法を示す。


【スポンサーリンク】


以下の例では、Mapイベント(ウィジェットが出現したときに発生するイベント)を利用してメイン画面の位置を変更している。アプリを起動してボタンが生成された時にMapイベントが発生し、move_button関数が実行されることで画面位置をモニターの右上隅に移動させている。

tkinter <Map> event example (move main window w…

【tkinter】画面をモニター端に自動で移動させる方法【Python】

以下の記事では、既知のサイズのtkinterメイン画面をモニター端に移動させる方法を示した。今回は、メイン画面のサイズによらずに自動でモニター端に移動させる方法を示す。

また、アプリ起動時に画面を移動させる方法は以下の記事を参照。


【スポンサーリンク】


以下の例では、ボタンクリック時にtkinter画面とモニターのサイズ(幅)を取得し、geometry関数を使用してtkinter画面を移動させている。

how to move the tkinter main window to the corner…

表示されたボタンをクリックすると、tkinter画面がモニター右上隅に移動する。

tkinter画面サイズを変えたのちにクリックしても、画面サイズを読み取って隅に移動させる。

上の例では、実際にはtkinterの画面右側が、ややモニター外に位置してしまっている。これは、tkinterメイン画面には見えない枠があることが原因である。tkinter画面端とモニター端ピッタリ合わせるためには、その枠分だけ座標をシフトさせる必要がある。枠の幅は、以下の方法で取得可能である。実装方法は、上記例の"move_position2関数"を参照。

frame = self.master.winfo_rootx() - self.master.winfo_x()   #invisible frame width

【tkinter】ウィジェットをドラッグで移動させる方法【Python】

ウィジェットをドラッグで移動させる処理の例を示す。


【スポンサーリンク】


以下の例では、B1-Motionイベント(ウィジェットをマウス左ボタンでドラッグしたときに発生するイベント)を利用してボタンウィジェットの位置を変更している。

gist5a5f3b0d3ccb775b0148be66d5d390e7

以下のB1-Motionイベント発生時に実行する関数(move_button関数)では、ウィジェットの座標とマウスポインタの座標を取得し、placeメソッドでウィジェットの座標を更新することでウィジェットをドラッグ移動させている。

def move_button(self, event):
    x = self.winfo_x() + event.x
    y = self.winfo_y() + event.y
    self.place(x=x, y=y)

上記例ではマウスポインタ部にウィジェット左上端が位置する。ウィジェット中央が来るようにする例は以下の通り。

def move_button2(self, event):        
        x = self.winfo_x() + event.x - self.winfo_width() / 2
        y = self.winfo_y() + event.y - self.winfo_height() / 2
        self.place(x=x, y=y)

【tkinter】マウスポインタをウィジェットに重ねたときに処理を実行する方法【Python】

マウスのポインタがウィジェット上に位置した際に特定の処理を実行する例を示す。


【スポンサーリンク】


以下の例では、Motionイベント(マウスがウィジェット上に位置したときに発生するイベント)とLeaveイベント(マウスがウィジェット外に移動したときに発生するイベント)を利用してボタンウィジェットの色を変更している。

how to change tkinter's widget color on hover

How to change a tkinter's widget color on or off hover

You can change widget color when on or off hover by binding "Motion" and "Leave"event to color change functions.

This is an example using button widget.

how to change tkinter's widget color on hover


off hover

on hover

How to create a simple dialog by yourself

If you want users to input something, you can use the tkinter.simpledialog module. But if you want to create a more complex or well-designed dialog, you can easily create one yourself.

example

example of a simple input dialog

How to "Just fit" tkinter main window to your display

Summarized how to just fit tkinter main window to the display edge. Normally the tkinter window is positioned slightly to the right of the position set using geometry method. You should take care if you want to just fit the window to your display.

example

how to just fit tkinter main window to the edge o…