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 matplotlibAxes
, apd.value_counts.axes
que son sólo una lista de las etiquetas de lasvalue_counts
serie.mismo nombre pero completamente diferentes y no relacionados objetos.
En lugar de usar algo como
self.axes.barh(CountStatus...)
oCountSatus.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()
enCountStatus.axes
, peroCountStatus
es un objeto de tipopd.Series
, no un objeto que tenga un atributoaxes
.Para trazar un gráfico de barras horizontal en
Canvas
, puedes hacer lo siguiente en el métodoplot()
: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 porself.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 atributoaxes
, por lo que no puedes llamar abarh()
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 abarh()
en el objetoaxes
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