Подсказка в морском рассеянном рассеивании [дубликат]

Уже занятая тема, но из того, что я прочитал здесь, следующее помогло мне понять, как она работает внутри:

def bar(a=[]):
     print id(a)
     a = a + [1]
     print id(a)
     return a

>>> bar()
4484370232
4484524224
[1]
>>> bar()
4484370232
4484524152
[1]
>>> bar()
4484370232 # Never change, this is 'class property' of the function
4484523720 # Always a new object 
[1]
>>> id(bar.func_defaults[0])
4484370232
68
задан jdmcbr 26 October 2011 в 21:38
поделиться

6 ответов

25
ответ дан ImportanceOfBeingErnest 21 August 2018 в 04:32
поделиться

Из http://matplotlib.sourceforge.net/examples/event_handling/pick_event_demo.html :

from matplotlib.pyplot import figure, show
import numpy as npy
from numpy.random import rand


if 1: # picking on a scatter plot (matplotlib.collections.RegularPolyCollection)

    x, y, c, s = rand(4, 100)
    def onpick3(event):
        ind = event.ind
        print 'onpick3 scatter:', ind, npy.take(x, ind), npy.take(y, ind)

    fig = figure()
    ax1 = fig.add_subplot(111)
    col = ax1.scatter(x, y, 100*s, c, picker=True)
    #fig.savefig('pscoll.eps')
    fig.canvas.mpl_connect('pick_event', onpick3)

show()
33
ответ дан Community 21 August 2018 в 04:32
поделиться
  • 1
    Это делает то, что мне нужно, спасибо! В качестве бонуса, чтобы реализовать его, я переписал свою программу, чтобы вместо создания двух отдельных графиков разброса в разных цветах на одном рисунке для представления двух наборов данных я скопировал метод примера для назначения цвета точке. Это сделало мою программу немного проще для чтения и меньше кода. Теперь откройте, чтобы найти руководство по преобразованию цвета в число! – jdmcbr 27 October 2011 в 02:09
  • 2
    Это для участков рассеяния. Как насчет линейных сюжетов? Я пытался заставить их работать над ними, но это не так. Есть ли обходной путь? – Sohaib 28 August 2014 в 06:12
  • 3
    @Sohaib См. Мой ответ – texasflood 1 August 2015 в 17:14
  • 4
    У меня есть вопрос по этому поводу. Когда я разбросаю по моим точкам так: plt.scatter (X_reduced [y == i, 0], X_reduced [y == i, 1], c = c, label = target_name, picker = True) с zip для i, c и target_name, то порядок моих индексов испортился? И я не могу больше смотреть, к какому адресу он принадлежит? – Chris 5 November 2015 в 14:01
  • 5
    Это, похоже, не работает для ноутбуков jupyter 5 с ipython 5. Есть ли простой способ исправить это? Оператор print также должен использовать parens для совместимости с python 3 – nealmcb 30 April 2017 в 03:15

mplcursors работали для меня. mplcursors предоставляет интерактивную аннотацию для matplotlib. Он сильно вдохновлен mpldatacursor ( https://github.com/joferkington/mpldatacursor ) с гораздо упрощенным API

import matplotlib.pyplot as plt
import numpy as np
import mplcursors

data = np.outer(range(10), range(1, 5))

fig, ax = plt.subplots()
lines = ax.plot(data)
ax.set_title("Click somewhere on a line.\nRight-click to deselect.\n"
             "Annotations can be dragged.")

mplcursors.cursor(lines) # or just mplcursors.cursor()

plt.show()
0
ответ дан Enayat Rajabi 21 August 2018 в 04:32
поделиться

mpld3 решает это для меня. EDIT (CODE ADDED):

import matplotlib.pyplot as plt
import numpy as np
import mpld3

fig, ax = plt.subplots(subplot_kw=dict(axisbg='#EEEEEE'))
N = 100

scatter = ax.scatter(np.random.normal(size=N),
                 np.random.normal(size=N),
                 c=np.random.random(size=N),
                 s=1000 * np.random.random(size=N),
                 alpha=0.3,
                 cmap=plt.cm.jet)
ax.grid(color='white', linestyle='solid')

ax.set_title("Scatter Plot (with tooltips!)", size=20)

labels = ['point {0}'.format(i + 1) for i in range(N)]
tooltip = mpld3.plugins.PointLabelTooltip(scatter, labels=labels)
mpld3.plugins.connect(fig, tooltip)

mpld3.show()

Вы можете проверить пример

3
ответ дан Julian 21 August 2018 в 04:32
поделиться
  • 1
    Пожалуйста, укажите пример кода и не просто ссылку на внешние источники без контекста или информации. Дополнительную информацию см. В в Справочном центре . – Joseph Farah 9 June 2017 в 02:25
  • 2
    К сожалению, mpld3 больше не активно поддерживается по состоянию на июль 2017 года – Ben Lindsay 25 July 2017 в 02:27
  • 3
    Сбой кода с помощью TypeError: array([1.]) is not JSON serializable. – P-Gn 16 February 2018 в 10:31

Я знаю, что это старый вопрос, но я продолжал прибывать сюда, ища решение для зависания (не нажимать) строки.

import matplotlib.pyplot as plt

fig = plt.figure()
plot = fig.add_subplot(111)

# create some curves
for i in range(4):
    plot.plot(
        [i*1,i*2,i*3,i*4],
        gid=i)

def on_plot_hover(event):
    for curve in plot.get_lines():
        if curve.contains(event)[0]:
            print "over %s" % curve.get_gid()

fig.canvas.mpl_connect('motion_notify_event', on_plot_hover)           
plt.show()
57
ответ дан mbernasocchi 21 August 2018 в 04:32
поделиться
  • 1
    Это должен быть принятый ответ, так как вопрос требует, чтобы зависание не нажималось. – bluenote10 24 July 2016 в 10:06
  • 2
    Очень полезно + 1ед. Вероятно, вам нужно «отменить» это, потому что motion_notify_event будет повторяться для движения внутри области кривой. Просто проверка того, что объект кривой равна предыдущей кривой, кажется, работает. – bvanlew 5 December 2016 в 11:58
  • 3
    Хм - это не работало из-за-коробки для меня (так мало что можно сделать с matplotlib ...) - работает ли это с ipython / jupyter ноутбуками? Это также работает, когда есть несколько подзаговоров? А как насчет на диаграмме, а не в линейном графике? – dwanderson 24 January 2017 в 21:17
  • 4
    Это печатает этикетку в консоли при зависании. Как насчет создания метки на картинке при зависании? Я понял, что это вопрос. – Nikana Reklawyks 6 February 2017 в 20:14
  • 5
    В Jupyter не работает Spyder. – Euler_Salter 28 September 2017 в 11:36

Небольшое редактирование на примере, представленном в http://matplotlib.org/users/shell.html :

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_title('click on points')

line, = ax.plot(np.random.rand(100), '-', picker=5)  # 5 points tolerance

def onpick(event):
    thisline = event.artist
    xdata = thisline.get_xdata()
    ydata = thisline.get_ydata()
    ind = event.ind
    print 'onpick points:', zip(xdata[ind], ydata[ind])

fig.canvas.mpl_connect('pick_event', onpick)

plt.show()

Это график прямой линии, так как Сохаиб спрашивал

13
ответ дан texasflood 21 August 2018 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: