0
votes

Comment afficher la valeur d'un élément de chaleur en volant le curseur dessus?

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 commentaires

Si vous couplez MapLotlib et Tkinter, utilisez matplotlib.figure au lieu de pyplot . Il devrait se débarrasser de certaines erreurs inutiles.


Existe-t-il un moyen de désactiver le mplcucursors.cursor ? 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 qui basculera le mplecursor 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.


3 Réponses :


-1
votes

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/


0 commentaires

0
votes

Vous pouvez vous connecter à la fonction code> COURSOR code> qui changera de texte dans l'annotation xxx pré>

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()


1 commentaires

J'ai ajouté exemple avec Checkboutton



2
votes

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 !!).

Utilisation de mplecurseurs h3>

Le Mplecursors Documentation explique comment personnaliser la sortie. Essentiellement, il consiste à se connecter à un événement appelé "ajouter" code>. P> xxx pré>

grimace manuellement la boîte de navigation h2>

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>

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()


4 commentaires

Y a-t-il un moyen de désactiver la vitrine une fois créée? Par exemple, si un tk.Checkbutton est utilisé? J'ai essayé d'ajouter si checkbuttonvariable == 0: dans la ligne si event.inaxex == hache: en les anding, mais cela n'a pas fonctionné. J'ai ensuite essayé de définir annot.set_vishable (false) mais cela n'a pas non pas fonctionné. Peut-il être fait?


@MRB in Hover Utilisez Imprimer (CheckButtonVariable) et Imprimer (Type (CheckButtonVariable)) Pour voir ce que vous obtenez. Peut-être que vous obtenez une chaîne "0" , pas entier 0


@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] à [i, j] et que vous obtenez des valeurs correctes.