【问题标题】:Color values in imshow for matplotlib?matplotlib的imshow中的颜色值?
【发布时间】:2011-08-15 17:54:24
【问题描述】:

我想知道我在 matplotlib 中使用 imshow() 时单击的点的颜色值。有没有办法通过 matplotlib 中的事件处理程序找到此信息(与单击的 x,y 坐标相同的方式可用)?如果没有,我该如何找到这些信息?

具体来说,我正在考虑这样一个案例:

imshow(np.random.rand(10,10)*255, interpolation='nearest')

谢谢! --艾琳

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    这是一个可行的解决方案。它仅适用于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()
    

    【讨论】:

    【解决方案2】:

    上述解决方案仅适用于单个图像。如果您在同一个脚本中绘制两个或多个图像,“inaxes”事件不会在两个轴之间产生差异。您永远不会知道您在哪个轴上单击,因此您将不知道应该显示哪个图像值。

    【讨论】:

      【解决方案3】:

      如果“颜色值”是指图形上单击点处的数组值,那么这很有用。

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

      【讨论】:

        【解决方案4】:

        您可以尝试以下方法:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-10
          • 2014-04-03
          • 2021-08-16
          • 2014-04-02
          • 2016-07-08
          • 2021-04-21
          • 1970-01-01
          • 2012-03-31
          相关资源
          最近更新 更多