Значения цветов в imshow для matplotlib? - PullRequest
8 голосов
/ 29 апреля 2011

Мне бы хотелось узнать значение цвета точки, на которую я нажимаю, когда использую imshow () в matplotlib.Есть ли способ найти эту информацию через обработчик событий в matplotlib (так же, как доступны координаты x, y вашего клика)?Если нет, то как мне найти эту информацию?

В частности, я думаю о случае, подобном этому:

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

Спасибо!--Erin

Ответы [ 4 ]

10 голосов
/ 30 апреля 2011

Вот сносное решение. Это работает только для 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 голос
/ 23 апреля 2015

Если под «значением цвета» вы подразумеваете значение массива в точке щелчка на графике, то это полезно.

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

Должно появиться окно черчения, вы нажимаете на точки, и возвращаются индексы массива.

1 голос
/ 23 апреля 2012

Приведенное выше решение работает только для одного изображения.Если вы построите два или более изображения в одном и том же сценарии, событие «inaxes» не будет иметь значения для обеих осей.Вы никогда не будете знать, по какой оси нажимаете, поэтому вы не будете знать, какое значение изображения должно отображаться.

0 голосов
/ 18 августа 2016

Вы можете попробовать что-то вроде следующего:

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...