matplotlib散点图传奇单击以切换可见性
我正在尝试制作一个可以切换的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_()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
更多
发布评论
评论(1)
您有一个错误:
self.scatter
没有任何称为picked_legend
的属性,另一方面,您必须调用画布的抽奖方法,以便刷新绘画。You have an error:
self.scatter
does not have any attribute calledpicked_legend
, on the other hand you must call the draw method of the canvas so that the painting is refreshed.