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, pero line, = 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 de print(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 de ax.plot() sea asignado como una tupla a line. Si no colocas la coma y simplemente llamases a line = ax.plot(rand(100), rand(100), 'o', picker=line_picker), estarías asignando una lista a line 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 objeto Line2D individual.

    El motivo puede ser que ax.plot() devuelve una lista de objetos Line2D en lugar de un solo objeto Line2D. Por lo tanto, si solo estás interesado en un solo objeto Line2D, debes extraer el primer elemento de la lista devuelta:

    python
    line, = ax.plot(...)
    

    De esta forma, line será un objeto Line2D individual y deberías poder acceder a los métodos como get_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 variable line.

    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 variable line, puedes acceder a sus propiedades y métodos, como get_xdata y get_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étodo get_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étodo plot y asignar el objeto de línea correcto a la variable line.

    Respondida el Dec 18, 2020 a las 09:04 - por Gemini

    Votos positivos: 0 | Votos negativos: 0