matplotlib散点图传奇单击以切换可见性

发布于 2025-02-10 13:50:04 字数 2583 浏览 2 评论 0原文

我正在尝试制作一个可以切换的matplotlib图,以选择可见性。 如果我单击某些传说,则应将单击传说褪色,相应的情节应该是看不见的。如果再次单击,它将恢复为原始状态。 但是,遵循代码不能很好地工作。如果我单击传奇“ 10”。可以感觉到此动作,但隐藏相关的数字行不通。请给出一些建议。

import sys
import pandas as pd
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QVBoxLayout, QWidget
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as canvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import matplotlib.colors as colors
import matplotlib.cm as cm
import numpy as np


class MplCanvas(canvas):
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
        super().__init__(fig)



class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        df = pd.DataFrame({
        "X" : [1,2,3,4,5], 
        "Y" : [1,2,3,4,5], 
        "pitch":[10,10,20,20,30],
        })
        layout_main = QVBoxLayout()

        # define scatterplot
        self.sc = MplCanvas(self, width=5, height=4, dpi=100)
        color = cm.jet
        u, div = np.unique(df.pitch.values, return_inverse=True)
        colorlist = [colors.rgb2hex(color(i)) for i in np.linspace(1, 0, len(u))]
        cmap = ListedColormap(colorlist)        
        
        self.scatter = self.sc.axes.scatter(df['X'], df['Y'] , c=div, cmap=cmap)
        legend = self.sc.axes.legend(self.scatter.legend_elements(prop='colors', num=len(colorlist))[0], u, loc=2)
        l1, l2, l3 = legend.get_lines()
        
        l1.set_picker(True)
        l1.set_pickradius(10)
        
        self.scatter.figure.canvas.mpl_connect('pick_event', self.on_pick)        
        
        toolbar = NavigationToolbar(self.sc, self)
        
        layout_main.addWidget(toolbar)
        layout_main.addWidget(self.sc)
        

        widget = QWidget()
        widget.setLayout(layout_main)
        self.setCentralWidget(widget)
     
            
    def on_pick(self, event):
        print('legend picked.')
        picked_legend = event.artist
        isVisible = picked_legend.get_visible()

        self.scatter.picked_legend.set_visible(not isVisible)
        

app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()

I'm trying to make a matplotlib plot which legend can be toggled to select visibility.
If I click certain legend, clicked legend should be faded and corresponding plot should be invisible. If clicked again, it will be restored to its original state.
But following code not work well. If I click legend '10'. This action can be sensed but hiding related figure don't work. Please give some advice.

import sys
import pandas as pd
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QVBoxLayout, QWidget
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as canvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import matplotlib.colors as colors
import matplotlib.cm as cm
import numpy as np


class MplCanvas(canvas):
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        fig = Figure(figsize=(width, height), dpi=dpi)
        self.axes = fig.add_subplot(111)
        super().__init__(fig)



class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        df = pd.DataFrame({
        "X" : [1,2,3,4,5], 
        "Y" : [1,2,3,4,5], 
        "pitch":[10,10,20,20,30],
        })
        layout_main = QVBoxLayout()

        # define scatterplot
        self.sc = MplCanvas(self, width=5, height=4, dpi=100)
        color = cm.jet
        u, div = np.unique(df.pitch.values, return_inverse=True)
        colorlist = [colors.rgb2hex(color(i)) for i in np.linspace(1, 0, len(u))]
        cmap = ListedColormap(colorlist)        
        
        self.scatter = self.sc.axes.scatter(df['X'], df['Y'] , c=div, cmap=cmap)
        legend = self.sc.axes.legend(self.scatter.legend_elements(prop='colors', num=len(colorlist))[0], u, loc=2)
        l1, l2, l3 = legend.get_lines()
        
        l1.set_picker(True)
        l1.set_pickradius(10)
        
        self.scatter.figure.canvas.mpl_connect('pick_event', self.on_pick)        
        
        toolbar = NavigationToolbar(self.sc, self)
        
        layout_main.addWidget(toolbar)
        layout_main.addWidget(self.sc)
        

        widget = QWidget()
        widget.setLayout(layout_main)
        self.setCentralWidget(widget)
     
            
    def on_pick(self, event):
        print('legend picked.')
        picked_legend = event.artist
        isVisible = picked_legend.get_visible()

        self.scatter.picked_legend.set_visible(not isVisible)
        

app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()

enter image description here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浮生面具三千个 2025-02-17 13:50:04

您有一个错误:self.scatter没有任何称为picked_legend的属性,另一方面,您必须调用画布的抽奖方法,以便刷新绘画。

def on_pick(self, event):
    picked_legend = event.artist
    is_visible = picked_legend.get_visible()
    picked_legend.set_visible(not is_visible)
    self.scatter.figure.canvas.draw()

You have an error: self.scatter does not have any attribute called picked_legend, on the other hand you must call the draw method of the canvas so that the painting is refreshed.

def on_pick(self, event):
    picked_legend = event.artist
    is_visible = picked_legend.get_visible()
    picked_legend.set_visible(not is_visible)
    self.scatter.figure.canvas.draw()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文