строка, = ax.plot(x,y)

#python #matplotlib

#python #matplotlib

Вопрос:

Я хочу знать значение «,» после «строки».

 line, = ax.plot(rand(100), rand(100), 'o', picker=line_picker)
 

Это кажется важным для кода.
Без «,» мой код разрушен.
Ошибка «Ошибка атрибута: объект ‘list’ не имеет атрибута ‘get_xdata'»

 from matplotlib import pyplot as plt
import numpy as np

class PointBuilder:
    def __init__(self, line):
        self.line = line
        self.xs = list(line.get_xdata())
        self.ys = list(line.get_ydata())
        self.cid = line.figure.canvas.mpl_connect('pick_event', self)

    def __call__(self, event):
        print('click', event)
        ind = event.ind[0]
        self.xs.remove(self.xs[ind])
        self.ys.remove(self.ys[ind])
        self.line.set_data(self.xs, self.ys)
        self.line.figure.canvas.draw()

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_title('click to build line segments')
line = ax.plot(demag_data["X corr"], demag_data['Y corr']*-1, 'o',color='tab:blue', picker=5)
linebuilder = PointBuilder(line)

plt.show()
 

Комментарии:

1. Это просто для выражения того факта, что ax.plot возвращает список, и вы считаете, что в списке есть один элемент (и поэтому вы берете его вместо списка)

Ответ №1:

Введение: распаковка списков:

 lst = [1, 2, 3]
first, second, third = lst    # first == 1, second == 2, third == 3; "unpacking" a list

lst = [1, 2]                  
first, second = lst           # first == 1, second == 2

list = [1]
first, = lst                  # first == 1

first = lst                   # first == [1]   # not the same as previous
 

ax.plot() возвращает список объектов Line2D, представляющих отображаемые данные.

Итак, после команды

 line = ax.plot(...)
 

в line переменной у вас будет список (только из одного элемента), но вам нужен этот элемент, а не список.

Вы можете выполнить line = line[0] после этой команды, но line, = ax.plot(...) она приятнее (более питоническая).

Ответ №2:

Вероятно, это функция, гарантирующая, что функция возвращает один не итерируемый объект или итерируемый объект только с одним элементом. Вот пример:

 def func():
   return 1, 2, 3

a, b, c = func()
 

Это работает нормально. Рассмотрим теперь следующий пример:

 a = func()
 

Эта вилка также хороша, но a теперь представляет собой кортеж, собирающий все выходные данные. Результат print(a) равен (1, 2, 3) . Давайте добавим запятую:

 a, = func()
 

Это не работает, выдает ошибку:

 ValueError: too many values to unpack (expected 1)
 

Но когда мы меняем функцию, чтобы она выводила один объект

 def func():
   return 1
 

или

 def func():
   return [1]
 

это снова работает.

Дополнительная функциональность этого синтаксиса, которая здесь важна, заключается в следующем: если функция выводит список только с одним элементом, она берет этот элемент из списка и выводит его. Например:

 def func():
   return [1]

a = func()
print(a)
 

Результат такой [1] . Для случая с запятой:

 a, = func()
print(a)
 

результат такой 1 .

Таким образом, авторы не хотят, чтобы эта функция выводила список с более чем одним элементом, и они хотят вывести сам этот один элемент, а не как элемент списка.

Комментарии:

1. Я думаю, вы забыли запятую в своем последнем примере кода. Я бы исправил это, но so хочет, чтобы я отредактировал как минимум шесть символов.