#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 хочет, чтобы я отредактировал как минимум шесть символов.