gpt4 book ai didi

python - 使用 matplotlib 更新散点图中的标记样式

转载 作者:太空狗 更新时间:2023-10-30 02:21:34 31 4
gpt4 key购买 nike

我正在开发一个交互式绘图应用程序,它要求用户从 matplotlib 散点图中选择数据点。为清楚起见,我希望能够在单击(或以任何方式选择)时更改绘制点的颜色和形状。

因为 matplotlib.collections.PathCollection 类有一个 set_facecolors 方法,所以改变点的颜色相对简单。但是,我看不到更新标记形状的类似方法。

有办法吗?

问题的简要说明:

import numpy as np
import matplotlib.pyplot as plt

x = np.random.normal(0,1.0,100)
y = np.random.normal(0,1.0,100)

scatter_plot = plt.scatter(x, y, facecolor="b", marker="o")

#update the colour
new_facecolors = ["r","g"]*50
scatter_plot.set_facecolors(new_facecolors)

#update the marker?
#new_marker = ["o","s"]*50
#scatter_plot.???(new_marker) #<--how do I access the marker shapes?

plt.show()

有什么想法吗?

最佳答案

如果您真正想要的是突出显示用户选择的点,那么您可以在所选点的顶部叠加另一个点(dot = ax.scatter(...)) .稍后,为了响应用户点击,您可以使用 dot.set_offsets((x, y)) 更改点的位置。

Joe Kington 写了一篇 wonderful example (DataCursor)了解如何在用户单击艺术家时添加显示数据坐标的注释(例如散点图)。

这是一个衍生示例 (FollowDotCursor),当用户将鼠标悬停在某个点上时,它会突出显示和注释数据点。

对于 DataCursor,显示的数据坐标是用户点击的位置——这可能与基础数据的坐标不完全相同。

使用 FollowDotCursor 显示的数据坐标始终是基础数据中距离鼠标最近的一个点。


import numpy as np
import matplotlib.pyplot as plt
import scipy.spatial as spatial

def fmt(x, y):
return 'x: {x:0.2f}\ny: {y:0.2f}'.format(x=x, y=y)

class FollowDotCursor(object):
"""Display the x,y location of the nearest data point.
"""
def __init__(self, ax, x, y, tolerance=5, formatter=fmt, offsets=(-20, 20)):
try:
x = np.asarray(x, dtype='float')
except (TypeError, ValueError):
x = np.asarray(mdates.date2num(x), dtype='float')
y = np.asarray(y, dtype='float')
self._points = np.column_stack((x, y))
self.offsets = offsets
self.scale = x.ptp()
self.scale = y.ptp() / self.scale if self.scale else 1
self.tree = spatial.cKDTree(self.scaled(self._points))
self.formatter = formatter
self.tolerance = tolerance
self.ax = ax
self.fig = ax.figure
self.ax.xaxis.set_label_position('top')
self.dot = ax.scatter(
[x.min()], [y.min()], s=130, color='green', alpha=0.7)
self.annotation = self.setup_annotation()
plt.connect('motion_notify_event', self)

def scaled(self, points):
points = np.asarray(points)
return points * (self.scale, 1)

def __call__(self, event):
ax = self.ax
# event.inaxes is always the current axis. If you use twinx, ax could be
# a different axis.
if event.inaxes == ax:
x, y = event.xdata, event.ydata
elif event.inaxes is None:
return
else:
inv = ax.transData.inverted()
x, y = inv.transform([(event.x, event.y)]).ravel()
annotation = self.annotation
x, y = self.snap(x, y)
annotation.xy = x, y
annotation.set_text(self.formatter(x, y))
self.dot.set_offsets((x, y))
bbox = ax.viewLim
event.canvas.draw()

def setup_annotation(self):
"""Draw and hide the annotation box."""
annotation = self.ax.annotate(
'', xy=(0, 0), ha = 'right',
xytext = self.offsets, textcoords = 'offset points', va = 'bottom',
bbox = dict(
boxstyle='round,pad=0.5', fc='yellow', alpha=0.75),
arrowprops = dict(
arrowstyle='->', connectionstyle='arc3,rad=0'))
return annotation

def snap(self, x, y):
"""Return the value in self.tree closest to x, y."""
dist, idx = self.tree.query(self.scaled((x, y)), k=1, p=1)
try:
return self._points[idx]
except IndexError:
# IndexError: index out of bounds
return self._points[0]

x = np.random.normal(0,1.0,100)
y = np.random.normal(0,1.0,100)
fig, ax = plt.subplots()

cursor = FollowDotCursor(ax, x, y, formatter=fmt, tolerance=20)
scatter_plot = plt.scatter(x, y, facecolor="b", marker="o")

#update the colour
new_facecolors = ["r","g"]*50
scatter_plot.set_facecolors(new_facecolors)

plt.show()

enter image description here

关于python - 使用 matplotlib 更新散点图中的标记样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15452405/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com