У меня есть графический интерфейс, использующий PyQt5. Я создал класс, который отвечает за отображение столбца категорий с помощью value_counts()
в гистограмму. Он получит фрейм данных с именем tb1
и имя столбца с именем ctb1
.
это кусок моего кода:
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
Я пытаюсь поместить это в свой подсюжет, который вызвал axes
, используя это CountStatus.axes.barh()
, но он продолжает давать мне
AttributeError: объект «список» не имеет атрибута «барх»
Я не могу понять, в чем проблема, или есть другой способ изобразить это на гистограмме?
Вы путаетесь между своими self.axes
, которые действительно являются matplotlib Axes
, и pd.value_counts.axes
, которые представляют собой просто список меток серии value_counts
.
одно и то же имя, но совершенно разные и не связанные между собой объекты.
Вместо этого используйте что-то вроде self.axes.barh(CountStatus...)
или CountSatus.plot.barh(ax=self.axes)
спасибо за ваш ответ. Я попробовал это с `self.axes.barh(CountStatus,width=0.5)`, это дало мне `нехешируемый тип: 'numpy.ndarray', если я должен преобразовать состояние счетчика в два массива, один для x, а другой для этикеток?
Это один из вариантов. Другой вариант - CountSatus.plot.barh(ax=self.axes)
@LiorCohen, вы должны включить это в свой ответ.
попробуйте этот кусок кода:
def plot(self,df1,ctb1,v2):
CountStatus = pd.value_counts(df1[ctb1].values, sort=True)
CountStatus.plot.barh(ax=self.axes)
self.draw()
Ошибка явная:
CountStatus.axes
— это список.