AttributeError: 'list' objeto no tiene atributo 'barh'

Tengo una interfaz GUI usando PyQt5. Hice una clase que es responsable de trazar una columna categórica usando value_counts() en el bar. Recibirá el marco de datos llamado tb1 y el nombre de la columna ctb1.

Este es un pedazo de mi código:

class Ui_Dialog:
   def setupUi(self, Dialog):
       Dialog.setObjectName("Dialog")
       Dialog.resize(900, 500)

   def retranslateUi(self, Dialog):
       _translate = QtCore.QCoreApplication.translate
       Dialog.setWindowTitle(_translate("Dialog", "output window"))

class Canvas(FigureCanvas):
   def __init__(self,parent=None, width=10, height=9):
       fig = Figure(figsize=(width, height))
       self.axes = fig.add_subplot(111)
       FigureCanvas.__init__(self, fig)
       self.setParent(parent)

     

   def plot(self,df1,ctb1,v2):
       CountStatus = pd.value_counts(df1[ctb1].values, sort=True)
       CountStatus.axes.barh()
       self.draw()
       

class Dialog(QtWidgets.QDialog, Ui_Dialog):

   def __init__(self,tb1,ctb1,parent=None):
       super().__init__(parent)
       self.setupUi(self)
       self.canvas = Canvas(self,width=8, height=5)
       self.canvas.plot(tb1,ctb1,v2)
       self.canvas.move(0, 0)


if __name__ == "__main__":
# some code here

Estoy tratando de ponerlo en mi subploto que llamó axes usando esto CountStatus.axes.barh() pero me sigue dando

AttributeError: 'list' objeto no tiene atributo 'barh'

No puedo entender lo que parece el problema o hay otra manera de trazarlo en un gráfico de barras?

Pregunta hecha hace 3 años, 4 meses, 27 días - Por scriptsorcerer


4 Respuestas:

  • Estás confundido entre tu self.axes que de hecho son matplotlib Axes, a pd.value_counts.axes que son sólo una lista de las etiquetas de las value_counts serie.

    mismo nombre pero completamente diferentes y no relacionados objetos.

    En lugar de usar algo como self.axes.barh(CountStatus...)o CountSatus.plot.barh(ax=self.axes)

    Respondida el Dec 18, 2020 a las 15:20 - por logiclinguist

    Votos positivos: 0 | Votos negativos: 0

  • probar esta paz de código:

     def plot(self,df1,ctb1,v2):          
         CountStatus = pd.value_counts(df1[ctb1].values, sort=True)
         CountStatus.plot.barh(ax=self.axes)
         self.draw()
    

    Respondida el Dec 18, 2020 a las 15:28 - por cyberjedi

    Votos positivos: 0 | Votos negativos: 0

  • El error se produce porque estás intentando llamar al método barh() en CountStatus.axes, pero CountStatus es un objeto de tipo pd.Series, no un objeto que tenga un atributo axes.

    Para trazar un gráfico de barras horizontal en Canvas, puedes hacer lo siguiente en el método plot():

    python
    class Canvas(FigureCanvas):
       def __init__(self,parent=None, width=10, height=9):
           fig = Figure(figsize=(width, height))
           self.axes = fig.add_subplot(111)
           FigureCanvas.__init__(self, fig)
           self.setParent(parent)
    
       def plot(self,df1,ctb1,v2):
           CountStatus = pd.value_counts(df1[ctb1].values, sort=True)
           CountStatus.plot(kind='barh', ax=self.axes)
           self.draw()
    

    Al llamar CountStatus.plot(kind='barh', ax=self.axes), estarás trazando un gráfico de barras horizontal en el subploto definido por self.axes.

    Espero que esta solución te ayude a resolver el problema. Si tienes alguna otra pregunta, ¡estaré encantado de ayudarte!

    Respondida el Dec 19, 2020 a las 15:24 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error ocurre porque el resultado de pd.value_counts(df1[ctb1].values, sort=True) es una serie, no un DataFrame. Las series no tienen el atributo axes, por lo que no puedes llamar a barh() en ellas.

    Para resolver este problema, puedes convertir la serie en un DataFrame utilizando el método to_frame():

    python
    CountStatus = pd.value_counts(df1[ctb1].values, sort=True).to_frame()
    CountStatus.axes.barh()
    

    Esto creará un DataFrame con una sola columna llamada CountStatus, y podrás llamar a barh() en el objeto axes de este DataFrame.

    Otra opción es utilizar el método plot.barh() directamente en la serie:

    python
    CountStatus = pd.value_counts(df1[ctb1].values, sort=True)
    CountStatus.plot.barh()
    

    Esto creará un gráfico de barras horizontales utilizando la serie CountStatus.

    Respondida el Dec 19, 2020 a las 15:34 - por Gemini

    Votos positivos: 0 | Votos negativos: 0