blu*_*e10 14 python plot matplotlib scatter-plot
受此示例的启发,我正在尝试编写一个小的matplotlib程序,该程序允许用户动态地在散点图中拖放数据点.与使用条形图(因此允许拖动矩形)的示例相比,我的目标是与其他补丁实现相同,例如圆形(任何与矩形相比更具散射图兼容性的补丁) ).但是我仍然坚持更新我的补丁的位置.虽然a Rectangle提供了一个功能,但set_xy我找不到直接模拟Cirlce或Ellipse.获得圆的位置对于矩形也不那么简单,但是可以通过获得边界框来实现.现在缺少的部分是找到一种方法来更新补丁的位置.任何关于如何实现这一点的提示都会很棒!当前最小的工作示例如下所示:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
class DraggablePatch:
def __init__(self, patch):
self.patch = patch
self.storedPosition = None
self.connect()
def getPosOfPatch(self, marker):
ext = marker.get_extents().get_points()
x0 = ext[0,0]
y0 = ext[0,1]
x1 = ext[1,0]
y1 = ext[1,1]
return 0.5*(x0+x1), 0.5*(y0+y1)
def connect(self):
'connect to all the events we need'
self.cidpress = self.patch.figure.canvas.mpl_connect('button_press_event', self.onPress)
self.cidmotion = self.patch.figure.canvas.mpl_connect('motion_notify_event', self.onMove)
def onPress(self, event):
'on button press we will see if the mouse is over us and store some data'
contains, attrd = self.patch.contains(event)
if contains:
self.storedPosition = self.getPosOfPatch(self.patch), event.xdata, event.ydata
def onMove(self, event):
'how to update an circle?!'
contains, attrd = self.patch.contains(event)
if contains and self.storedPosition is not None:
oldPos, oldEventXData, oldEventYData = self.storedPosition
dx = event.xdata - oldEventXData
dy = event.ydata - oldEventYData
newX = oldPos[0] + dx
newY = oldPos[1] + dy
print "now I would like to move my patch to", newX, newY
def myPatch(x,y):
return patches.Circle((x,y), radius=.05, alpha=0.5)
N = 10
x = np.random.random(N)
y = np.random.random(N)
patches = [myPatch(x[i], y[i]) for i in range(N)]
fig = plt.figure()
ax = fig.add_subplot(111)
drs = []
for patch in patches:
ax.add_patch(patch)
dr = DraggablePatch(patch)
drs.append(dr)
plt.show()
Run Code Online (Sandbox Code Playgroud)
Joe*_*ton 18
它有点恼人,它不一致,但更新圆的位置,设置circ.center = new_x, new_y.
作为一个简单的(不可拖动的)示例:
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
class InteractiveCircle(object):
def __init__(self):
self.fig, self.ax = plt.subplots()
self.ax.axis('equal')
self.circ = Circle((0.5, 0.5), 0.1)
self.ax.add_artist(self.circ)
self.ax.set_title('Click to move the circle')
self.fig.canvas.mpl_connect('button_press_event', self.on_click)
def on_click(self, event):
if event.inaxes is None:
return
self.circ.center = event.xdata, event.ydata
self.fig.canvas.draw()
def show(self):
plt.show()
InteractiveCircle().show()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10393 次 |
| 最近记录: |