matplotlib中imshow的颜色值是什么?

8
我希望在使用matplotlib的imshow()函数时,能够知道我所点击的点的颜色值。是否有一种方法可以通过matplotlib中的事件处理程序来获取这些信息(就像你单击时x,y坐标可用一样)?如果没有,我该如何获取这些信息?
具体而言,我考虑的情况是这样的:
imshow(np.random.rand(10,10)*255, interpolation='nearest')

谢谢! --Erin

4个回答

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
谢谢,保罗!这正是我在寻找的。我添加了一些从这个问题中搜集来的代码:https://dev59.com/dXVC5IYBdhLWcg3wsTRi,现在我可以打印RGB十六进制值了 :) - user671110

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数组的索引。

1
以上解决方案仅适用于单个图像。如果您在同一脚本中绘制两个或更多图像,则“inaxes”事件将无法区分两个轴。您永远不会知道您点击的是哪个轴,因此您将不知道应显示哪个图像值。

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')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接