当我在matplotlib中使用imshow()时,我想知道我点击的点的颜色值。有没有办法通过matplotlib中的事件处理程序找到这些信息(与点击的x,y坐标相同)?如果没有,我将如何找到这些信息?
具体来说,我正在考虑这样的案例:
imshow(np.random.rand(10,10)*255, interpolation='nearest')
谢谢! --Erin
答案 0 :(得分:10)
这是一个可以通过的解决方案。它仅适用于interpolation = 'nearest'
。我仍在寻找一种更清晰的方法来从图像中检索插值(而不是舍入拾取的x,y并从原始数组中选择。)无论如何:
from matplotlib import pyplot as plt
import numpy as np
im = plt.imshow(np.random.rand(10,10)*255, interpolation='nearest')
fig = plt.gcf()
ax = plt.gca()
class EventHandler:
def __init__(self):
fig.canvas.mpl_connect('button_press_event', self.onpress)
def onpress(self, event):
if event.inaxes!=ax:
return
xi, yi = (int(round(n)) for n in (event.xdata, event.ydata))
value = im.get_array()[xi,yi]
color = im.cmap(im.norm(value))
print xi,yi,value,color
handler = EventHandler()
plt.show()
答案 1 :(得分:1)
上述解决方案仅适用于单个图像。如果您在同一个脚本中绘制两个或多个图像,则“inaxes”事件不会在两个轴之间产生差异。你永远不会知道你在哪个轴上点击,所以你不知道应该显示哪个图像值。
答案 2 :(得分:1)
如果按'颜色值'表示数组在图表上单击点处的值,则这很有用。
from matplotlib import pyplot as plt
import numpy as np
class collect_points():
omega = []
def __init__(self,array):
self.array = array
def onclick(self,event):
self.omega.append((int(round(event.ydata)), int(round(event.xdata))))
def indices(self):
plot = plt.imshow(self.array, cmap = plt.cm.hot, interpolation = 'nearest', origin= 'upper')
fig = plt.gcf()
ax = plt.gca()
zeta = fig.canvas.mpl_connect('button_press_event', self.onclick)
plt.colorbar()
plt.show()
return self.omega
用法如下:
from collect_points import collect_points
import numpy as np
array = np.random.rand(10,10)*255
indices = collect_points(array).indices()
应该出现一个绘图窗口,点击点,然后返回numpy数组的索引。
答案 3 :(得分:0)
您可以尝试以下内容:
x, y = len(df.columns.values), len(df.index.values)
# subplot etc
# Set values for x/y ticks/labels
ax.set_xticks(np.linspace(0, x-1, x))
ax.set_xticklabels(ranges_df.columns)
ax.set_yticks(np.linspace(0, y-1, y))
ax.set_yticklabels(ranges_df.index)
for i, j in product(range(y), range(x)):
ax.text(j, i, '{0:.0f}'.format(ranges_df.iloc[i, j]),
size='small', ha='center', va='center')