0

マウスをその上に置いたときに、ヒートマップの特定の要素の値を表示したいと思います。

ヒートマップの値を表示するようにしましたが、必要のない情報も表示され、最初にプログラムを実行すると、多くのエラーが発生し、理由がわかりません。

オンラインで見た値を表示するさまざまな方法を試しましdatacursor(hover=True)mplcursors.cursor(hover=True)が、「機能する」のはこれだけです。

import tkinter as tk                                                    
from tkinter import ttk
from tkinter import messagebox
import numpy as np
from math import pi
import random
import matplotlib.pyplot as plt

from mpldatacursor import datacursor
import mplcursors

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg


import pandas as pd
from openpyxl import load_workbook
from tkinter import filedialog

root = tk.Tk()                                                          
root.title("Stage 2 GUI")                                               
root.geometry("1270x590")  

mapArr = np.zeros([2,2],dtype=float)

mapArr=([113,62,31,63],
        [50,101,72,47],
        [92,10,40,12],
        [83,21,128,16])

xy=(['A','B','C','D','E','F'])


figure, axis = plt.subplots(figsize=(8,7))                              
heatmap = axis.imshow(
    mapArr,cmap="gray",interpolation='nearest',vmin=0, vmax=128)        

heatmap.axes.get_xaxis().set_visible(False)                             
heatmap.axes.get_yaxis().set_visible(False)

cb = figure.colorbar(heatmap)                                           

canvas = FigureCanvasTkAgg(figure, root)                                
canvas.get_tk_widget().place(x=-60,y=-60)                               

mplcursors.cursor(hover=True)

plt.show()

x 座標と y 座標ではなく、ヒートマップ要素の値を表示したいのですが、表示された情報を削除/カスタマイズする方法がわかりません。プログラムを実行するたびにエラーが発生しなければ (たとえ技術的には機能します)。

4

3 に答える 3

2

pyplot を使用するか、tk に埋め込まれた matplotlib を使用するかを決定する必要があります。以下は、埋め込みたいと仮定しています (その場合、pyplot を使用しないでください!!)。

mplcursor の使用

mplcursorsのドキュメントでは、出力をカスタマイズする方法について説明しています。基本的に、 と呼ばれるイベントに接続することで構成され"add"ます。

import numpy as np
import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import tkinter as tk
import mplcursors

root = tk.Tk()
root.geometry("1270x590")  

mapArr=np.array(([113,62,31,63],
                 [50,101,72,47],
                 [92,10,40,12],
                 [83,21,128,16]))

xy=(['A','B','C','D','E','F'])


fig = matplotlib.figure.Figure() 
ax = fig.add_subplot()

heatmap = ax.imshow(mapArr,cmap="gray",interpolation='nearest',vmin=0, vmax=128)        

cb = fig.colorbar(heatmap)                                           

canvas = FigureCanvasTkAgg(fig, root)                                
canvas.get_tk_widget().place(x=60,y=60)                               

cursor = mplcursors.cursor(heatmap, hover=True)

@cursor.connect("add")
def on_add(sel):
    i,j = sel.target.index
    sel.annotation.set_text(mapArr[i,j])

tk.mainloop()

ホバー ボックスを手動でクレートする

mplcursors を使用しなくても、上記と同じことができます。これは、注釈を作成し、マウスの位置に応じてその位置とテキストを変更することによって行われます。

import numpy as np
import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import tkinter as tk

root = tk.Tk()
root.geometry("1270x590")  

mapArr=np.array(([113,62,31,63],
                 [50,101,72,47],
                 [92,10,40,12],
                 [83,21,128,16]))

xy=(['A','B','C','D','E','F'])


fig = matplotlib.figure.Figure() 
ax = fig.add_subplot()

heatmap = ax.imshow(mapArr,cmap="gray",interpolation='nearest',vmin=0, vmax=128)        

cb = fig.colorbar(heatmap)                                           

canvas = FigureCanvasTkAgg(fig, root)                                
canvas.get_tk_widget().place(x=60,y=60)                               

annot = ax.annotate("", xy=(0,0), xytext=(20,20), textcoords="offset points",
                    arrowprops=dict(arrowstyle="->"), visible=False,
                    bbox=dict(boxstyle="round", fc="w"))

def hover(event):
    if event.inaxes == ax:
        x,y = event.xdata, event.ydata
        j,i = np.round(np.array((x,y))).astype(int)
        annot.xy = (x,y)
        annot.set_text(str(mapArr[i,j]))
        annot.set_visible(True)
    else:
        annot.set_visible(False)
    fig.canvas.draw_idle()

canvas.mpl_connect("motion_notify_event", hover)

tk.mainloop()
于 2019-07-19T14:01:40.057 に答える