línea, = ax.plot(x,y)
Quiero saber el significado del " después "línea".
line, = ax.plot(rand(100), rand(100), 'o', picker=line_picker)
Parece importante para el código. Sin el "," mi código triturado. El error es "AttributeError: 'list' objeto no tiene atributo '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()
Pregunta hecha hace 3 años, 4 meses, 28 días - Por algoarchitect
4 Respuestas:
-
La introducción: Listas de desembalaje:
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()
devuelve a lista de objetos Line2D que representan los datos trazados.Entonces, después del comando
line = ax.plot(...)
tendrás en el
line
variable a lista (de sólo un elemento), pero usted necesita este elemento, no la lista.Puedes hacerlo.
line = line[0]
después de este comando, peroline, = ax.plot(...)
es más agradable (más Pythonic).Respondida el Dec 17, 2020 a las 08:54 - por hackharbinger
Votos positivos: 0 | Votos negativos: 0 -
Esta es probablemente una característica para asegurar que una función devuelve un objeto no identificable o un objeto iterable con sólo un elemento. Aquí hay un ejemplo:
def func(): return 1, 2, 3 a, b, c = func()
Esto funciona bien. Considere ahora el siguiente ejemplo:
a = func()
Este tenedor también está bien, pero
a
es ahora un tuple que recoge todas las salidas. La producción deprint(a)
es(1, 2, 3)
. Añadamos el coma:a, = func()
Esto no funciona, da un error:
ValueError: too many values to unpack (expected 1)
Pero cuando cambiamos la función así que produce un solo objeto
def func(): return 1
o
def func(): return [1]
funciona de nuevo.
La funcionalidad adicional de esta sintaxis, que es importante aquí, es la siguiente: si la función produce una lista con sólo un elemento toma este elemento de la lista y lo produce. Por ejemplo:
def func(): return [1] a = func() print(a)
La salida es
[1]
. Para el caso con coma:a, = func() print(a)
la salida
1
.Así que los autores no quieren que esta función produzca la lista con más de un elemento, y quieren producir este elemento en sí, no como elemento de la lista.
Respondida el Dec 17, 2020 a las 09:03 - por debugdynamo
Votos positivos: 0 | Votos negativos: 0 -
En la línea que mencionas:
python line, = ax.plot(rand(100), rand(100), 'o', picker=line_picker)
La coma después de
line
hace que el retorno deax.plot()
sea asignado como una tupla aline
. Si no colocas la coma y simplemente llamases aline = ax.plot(rand(100), rand(100), 'o', picker=line_picker)
, estarías asignando una lista aline
en lugar de una tupla.En cuanto al error que mencionas, "AttributeError: 'list' objeto no tiene atributo 'get_xdata'", parece ser causado por el hecho de que
line
está siendo tratado como una lista en lugar de un objetoLine2D
individual.El motivo puede ser que
ax.plot()
devuelve una lista de objetosLine2D
en lugar de un solo objetoLine2D
. Por lo tanto, si solo estás interesado en un solo objetoLine2D
, debes extraer el primer elemento de la lista devuelta:python line, = ax.plot(...)
De esta forma,
line
será un objetoLine2D
individual y deberías poder acceder a los métodos comoget_xdata()
sin problemas.¡Espero que esta explicación te haya sido de ayuda para comprender mejor cómo funciona esta asignación y para solucionar el error en tu código!
Respondida el Dec 18, 2020 a las 08:52 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El operador
=
seguido de una coma (,=
) es una forma de desempaquetado en Python. Se utiliza para asignar múltiples valores a múltiples variables a la vez.En tu código, la línea:
python line, = ax.plot(x, y)
es equivalente a:
python line = ax.plot(x, y)[0]
Esto significa que el método
plot
devuelve una lista de objetos de línea, y estás asignando el primer elemento de esa lista a la variableline
.En tu caso, el método
plot
devuelve una lista de un solo elemento, que es el objeto de línea para la línea que has trazado. Al asignar este objeto de línea a la variableline
, puedes acceder a sus propiedades y métodos, comoget_xdata
yget_ydata
.Si eliminaras la coma, estarías asignando toda la lista de objetos de línea a la variable
line
. Esto daría lugar al error que mencionas, ya que estarías intentando llamar al métodoget_xdata
en una lista, que no tiene este método.Por lo tanto, el operador
=
seguido de una coma es esencial para desempaquetar el resultado del métodoplot
y asignar el objeto de línea correcto a la variableline
.Respondida el Dec 18, 2020 a las 09:04 - por Gemini
Votos positivos: 0 | Votos negativos: 0