J'aimerais afficher la valeur d'un élément particulier d'une chaleur lorsque je tiers la souris sur elle.
Je l'ai obtenu pour afficher la valeur de la chaleur, mais elle affiche des informations que je ne veux pas aussi bien et Lorsque je gère le programme d'abord, il y a beaucoup d'erreurs et je ne peux pas comprendre pourquoi. p>
J'ai essayé diverses méthodes d'affichage de la valeur que j'ai vue en ligne, telle que Datacursor (Hover = True) code> mais
mplcucursors.cursor (Hover = true) code> est le seul qui "fonctionne". P>
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()
3 Réponses :
Vous pouvez toujours utiliser des boutons de manchette et traitant, je crois qu'ils ont cette fonctionnalité déjà intégrée: https: //plot.ly/ipython-notebooks/cufflinks/ p>
Vous pouvez vous connecter à la fonction code> COURSOR code> qui changera de texte dans l'annotation pour obtenir la valeur dont il a besoin nomméTuple le code> (je l'ai trouvé Dans le code source du curseur) P>
import tkinter as tk
import matplotlib.pyplot as plt
import mplcursors
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
# --- data ---
mapArr = (
[113, 62, 31, 63],
[50, 101, 72, 47],
[92, 10, 40, 12],
[83, 21, 128, 16]
)
xy = ('A','B','C','D','E','F')
# --- functions ---
def on_mouse_move(event):
if checkbuttonvariable.get() == 0:
return
if event.inaxes == axis:
annotation.xy = (event.xdata, event.ydata)
row = int(round(event.ydata))
col = int(round(event.xdata))
value = mapArr[row][col]
annotation.set_text(str(value))
annotation.set_visible(True)
else:
annotation.set_visible(False)
canvas.draw()
# --- main ---
root = tk.Tk()
figure, axis = plt.subplots(figsize=(8, 7))
canvas = FigureCanvasTkAgg(figure, root)
canvas.get_tk_widget().pack(fill='both', expand=True)
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)
colorbar = figure.colorbar(heatmap)
# ---
annotation = axis.annotate("", xy=(0,0), xytext=(20,20), textcoords="offset points",
arrowprops=dict(arrowstyle="->"), visible=False,
bbox=dict(boxstyle="round", fc="w"))
canvas.mpl_connect('motion_notify_event', on_mouse_move)
# ---
checkbuttonvariable = tk.IntVar(value=1)
button = tk.Checkbutton(root, text='visible', variable=checkbuttonvariable)
button.pack()
root.mainloop()
J'ai ajouté exemple avec Checkboutton code>
Vous devez décider si vous souhaitez utiliser Pyplot ou Embedd Matplotlib dans TK. Ce qui suit suppose que vous souhaitez intégrer (dans ce cas, n'utilisez pas de pyplot !!).
Le Mplecursors Documentation explique comment personnaliser la sortie. Essentiellement, il consiste à se connecter à un événement appelé vous pouvez faire la même chose que ci-dessus sans l'utilisation de mplucurseurs. Cela se ferait en créant une annotation et en modifiant sa position et son texte en fonction de la position de la souris. P> "ajouter" code>. P>
grimace manuellement la boîte de navigation h2>
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()
Y a-t-il un moyen de désactiver la vitrine une fois créée? Par exemple, si un tk.Checkbutton code> est utilisé? J'ai essayé d'ajouter
si checkbuttonvariable == 0: code> dans la ligne
si event.inaxex == hache: code> en les anding, mais cela n'a pas fonctionné. J'ai ensuite essayé de définir
annot.set_vishable (false) code> mais cela n'a pas non pas fonctionné. Peut-il être fait?
@MRB in Hover code> Utilisez
Imprimer (CheckButtonVariable) Code> et
Imprimer (Type (CheckButtonVariable)) Code> Pour voir ce que vous obtenez. Peut-être que vous obtenez une chaîne
"0" code>, pas entier
0 code>
@ImportuceObeingernest J'ai remarqué lorsque vous essayez le code que vous avez suggéré que les valeurs HeatMap sont inversées et ne correspondent pas à la matrice d'origine? C'est comme si elles ont été retournées de haut à droite en bas à gauche?
@MBR change [j, i] code> à
[i, j] code> et que vous obtenez des valeurs correctes.
Si vous couplez MapLotlib et Tkinter, utilisez
matplotlib.figure code> au lieu de
pyplot code>. Il devrait se débarrasser de certaines erreurs inutiles.
Existe-t-il un moyen de désactiver le
mplcucursors.cursor code>? J'ai essayé tout ce que je peux penser et je ne peux maintenant pas le désactiver. J'essaie d'avoir un
tk.button code> qui basculera le
mplecursor code> marche / arrêt.
J'ai un ensemble de documents PDF et je souhaite extraire certaines entités. J'ai une liste d'entités correctement étiquetées et mon ensemble d'étiquettes prédites. Je peux produire la matrice de confusion. Mais quand je vois qu'il y a une classification erronée, c'est-à-dire quoi que ce soit hors diagonal, je veux un moyen facile de voir ce qui ne va pas. Par exemple, je veux cliquer sur la cellule dans la matrice de confusion et afficherait automatiquement la marque vraie associée et ma prédiction incorrecte.