wxpython使用matplot_在wxpython面板中使用matplotlib组合键和鼠标按钮事件

该博客主要探讨了一个使用matplotlib库实现图形交互的示例,通过LassoManager类来管理图形选择。代码展示了如何在用户按下shift或alt键时改变数据点的颜色,以及在鼠标拖动时创建套索选择。当释放鼠标时,根据所按下的键,更新对应数据点的颜色。此功能有助于进行数据可视化和交互式分析。
摘要由CSDN通过智能技术生成

我不完全确定你做错了什么,因为你的代码看起来不完整。我认为您的总体想法是正确的,但是您似乎混淆了类并试图从错误的类或其他东西访问属性shift_is_held。在

我使用matplotlib示例中的lasso_example.py代码编写了这个简单的示例。我在尝试使用控制键时确实遇到了一些并发症。当我尝试使用控制键用鼠标拖动时,套索管理器变得无响应(包括matplotlib中的原始代码)。我不知道为什么,所以我在当前代码中使用了shift和alt键作为修饰符。在

您将看到,在LassoManager.callback()中执行的逻辑取决于释放套索时按下的键import logging

import matplotlib

from matplotlib.widgets import Lasso

from matplotlib.colors import colorConverter

from matplotlib.collections import RegularPolyCollection

from matplotlib import path

import matplotlib.pyplot as plt

from numpy.random import rand

logger = logging.getLogger()

logger.setLevel(logging.DEBUG)

class Datum(object):

colorin = colorConverter.to_rgba('red')

colorShift = colorConverter.to_rgba('cyan')

colorCtrl = colorConverter.to_rgba('pink')

colorout = colorConverter.to_rgba('blue')

def __init__(self, x, y, include=False):

self.x = x

self.y = y

if include:

self.color = self.colorin

else:

self.color = self.colorout

class LassoManager(object):

def __init__(self, ax, data):

self.axes = ax

self.canvas = ax.figure.canvas

self.data = data

self.Nxy = len(data)

facecolors = [d.color for d in data]

self.xys = [(d.x, d.y) for d in data]

fig = ax.figure

self.collection = RegularPolyCollection(

fig.dpi, 6, sizes=(100,),

facecolors=facecolors,

offsets = self.xys,

transOffset = ax.transData)

ax.add_collection(self.collection)

self.cid = self.canvas.mpl_connect('button_press_event', self.onpress)

self.keyPress = self.canvas.mpl_connect('key_press_event', self.onKeyPress)

self.keyRelease = self.canvas.mpl_connect('key_release_event', self.onKeyRelease)

self.lasso = None

self.shiftKey = False

self.ctrlKey = False

def callback(self, verts):

logging.debug('in LassoManager.callback(). Shift: %s, Ctrl: %s' % (self.shiftKey, self.ctrlKey))

facecolors = self.collection.get_facecolors()

p = path.Path(verts)

ind = p.contains_points(self.xys)

for i in range(len(self.xys)):

if ind[i]:

if self.shiftKey:

facecolors[i] = Datum.colorShift

elif self.ctrlKey:

facecolors[i] = Datum.colorCtrl

else:

facecolors[i] = Datum.colorin

else:

facecolors[i] = Datum.colorout

self.canvas.draw_idle()

self.canvas.widgetlock.release(self.lasso)

del self.lasso

def onpress(self, event):

if self.canvas.widgetlock.locked():

return

if event.inaxes is None:

return

self.lasso = Lasso(event.inaxes, (event.xdata, event.ydata), self.callback)

# acquire a lock on the widget drawing

self.canvas.widgetlock(self.lasso)

def onKeyPress(self, event):

logging.debug('in LassoManager.onKeyPress(). Event received: %s (key: %s)' % (event, event.key))

if event.key == 'alt+alt':

self.ctrlKey = True

if event.key == 'shift':

self.shiftKey = True

def onKeyRelease(self, event):

logging.debug('in LassoManager.onKeyRelease(). Event received: %s (key: %s)' % (event, event.key))

if event.key == 'alt':

self.ctrlKey = False

if event.key == 'shift':

self.shiftKey = False

if __name__ == '__main__':

data = [Datum(*xy) for xy in rand(100, 2)]

ax = plt.axes(xlim=(0,1), ylim=(0,1), autoscale_on=False)

lman = LassoManager(ax, data)

plt.show()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值