Я пытаюсь имитировать поведение plt.subplots(), но с помощью пользовательских классов. Вместо того, чтобы возвращать Axes из subplots(), я хотел бы вернуть CustomAxes. Я просмотрел исходный код и не понимаю, почему я получаю сообщение об ошибке трассировки ниже.
Я могу выполнить то, что хочу, не наследуя от Axes , но я думаю, что в долгосрочной перспективе я хотел бы унаследовать от Axes. Если вы думаете, что это смешно и есть способ получше, дайте мне знать!
Код:
from matplotlib.figure import Figure
from matplotlib.axes import Axes
class CustomAxes(Axes):
def __init__(self, fig, *args, **kwargs):
super().__init__(fig, *args, **kwargs)
def create_plot(self, i):
self.plot([1, 2, 3], [1, 2, 3])
self.set_title(f'Title {i}')
class CustomFigure(Figure):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def subplots(self, *args, **kwargs):
axes = super().subplots(*args, **kwargs)
axes = [CustomAxes(fig=self, *args, **kwargs) for ax in axes.flatten()]
return axes
fig, axes = CustomFigure().subplots(nrows=2, ncols=2)
for i, ax in enumerate(axes, start=1):
ax.create_plot(i=i)
fig.tight_layout()
fig
< /code>
traceback: < /p>
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[60], line 23
20 axes = [CustomAxes(fig=self, *args, **kwargs) for ax in axes.flatten()]
21 return axes
---> 23 fig, axes = CustomFigure().subplots(nrows=2, ncols=2)
24 for i, ax in enumerate(axes, start=1):
25 ax.create_plot(i=i)
Cell In[60], line 20
18 def subplots(self, *args, **kwargs):
19 axes = super().subplots(*args, **kwargs)
---> 20 axes = [CustomAxes(fig=self, *args, **kwargs) for ax in axes.flatten()]
21 return axes
Cell In[60], line 20
18 def subplots(self, *args, **kwargs):
19 axes = super().subplots(*args, **kwargs)
---> 20 axes = [CustomAxes(fig=self, *args, **kwargs) for ax in axes.flatten()]
21 return axes
Cell In[60], line 7
6 def __init__(self, fig, *args, **kwargs):
----> 7 super().__init__(fig, *args, **kwargs)
File ~/repos/test/venv/lib/python3.11/site-packages/matplotlib/axes/_base.py:656, in _AxesBase.__init__(self, fig, facecolor, frameon, sharex, sharey, label, xscale, yscale, box_aspect, forward_navigation_events, *args, **kwargs)
654 else:
655 self._position = self._originalPosition = mtransforms.Bbox.unit()
--> 656 subplotspec = SubplotSpec._from_subplot_args(fig, args)
657 if self._position.width < 0 or self._position.height < 0:
658 raise ValueError('Width and height specified must be non-negative')
File ~/repos/test/venv/lib/python3.11/site-packages/matplotlib/gridspec.py:576, in SubplotSpec._from_subplot_args(figure, args)
574 rows, cols, num = args
575 else:
--> 576 raise _api.nargs_error("subplot", takes="1 or 3", given=len(args))
578 gs = GridSpec._check_gridspec_exists(figure, rows, cols)
579 if gs is None:
TypeError: subplot() takes 1 or 3 positional arguments but 0 were given
< /code>
Рабочий код без наследования: < /p>
from matplotlib.figure import Figure
class CustomAxes():
def __init__(self, ax):
self.ax = ax
def create_plot(self, i):
self.ax.plot([1, 2, 3], [1, 2, 3])
self.ax.set_title(f'Title {i}')
class CustomFigure(Figure):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def subplots(self, *args, **kwargs):
axes = super().subplots(*args, **kwargs)
axes = [CustomAxes(ax) for ax in axes.flatten()]
return self, axes
fig, axes = CustomFigure().subplots(nrows=2, ncols=2)
for i, ax in enumerate(axes, start=1):
ax.create_plot(i=i)
fig.tight_layout()
fig
Подробнее здесь: https://stackoverflow.com/questions/793 ... nheritance
Проблемы с осями (matplotlib) наследование ⇐ Python
Программы на Python
-
Anonymous
1737735018
Anonymous
Я пытаюсь имитировать поведение plt.subplots(), но с помощью пользовательских классов. Вместо того, чтобы возвращать Axes из subplots(), я хотел бы вернуть CustomAxes. Я просмотрел исходный код и не понимаю, почему я получаю сообщение об ошибке трассировки ниже.
Я могу выполнить то, что хочу, не наследуя от Axes , но я думаю, что в долгосрочной перспективе я хотел бы унаследовать от Axes. Если вы думаете, что это смешно и есть способ получше, дайте мне знать!
Код:
from matplotlib.figure import Figure
from matplotlib.axes import Axes
class CustomAxes(Axes):
def __init__(self, fig, *args, **kwargs):
super().__init__(fig, *args, **kwargs)
def create_plot(self, i):
self.plot([1, 2, 3], [1, 2, 3])
self.set_title(f'Title {i}')
class CustomFigure(Figure):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def subplots(self, *args, **kwargs):
axes = super().subplots(*args, **kwargs)
axes = [CustomAxes(fig=self, *args, **kwargs) for ax in axes.flatten()]
return axes
fig, axes = CustomFigure().subplots(nrows=2, ncols=2)
for i, ax in enumerate(axes, start=1):
ax.create_plot(i=i)
fig.tight_layout()
fig
< /code>
traceback: < /p>
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[60], line 23
20 axes = [CustomAxes(fig=self, *args, **kwargs) for ax in axes.flatten()]
21 return axes
---> 23 fig, axes = CustomFigure().subplots(nrows=2, ncols=2)
24 for i, ax in enumerate(axes, start=1):
25 ax.create_plot(i=i)
Cell In[60], line 20
18 def subplots(self, *args, **kwargs):
19 axes = super().subplots(*args, **kwargs)
---> 20 axes = [CustomAxes(fig=self, *args, **kwargs) for ax in axes.flatten()]
21 return axes
Cell In[60], line 20
18 def subplots(self, *args, **kwargs):
19 axes = super().subplots(*args, **kwargs)
---> 20 axes = [CustomAxes(fig=self, *args, **kwargs) for ax in axes.flatten()]
21 return axes
Cell In[60], line 7
6 def __init__(self, fig, *args, **kwargs):
----> 7 super().__init__(fig, *args, **kwargs)
File ~/repos/test/venv/lib/python3.11/site-packages/matplotlib/axes/_base.py:656, in _AxesBase.__init__(self, fig, facecolor, frameon, sharex, sharey, label, xscale, yscale, box_aspect, forward_navigation_events, *args, **kwargs)
654 else:
655 self._position = self._originalPosition = mtransforms.Bbox.unit()
--> 656 subplotspec = SubplotSpec._from_subplot_args(fig, args)
657 if self._position.width < 0 or self._position.height < 0:
658 raise ValueError('Width and height specified must be non-negative')
File ~/repos/test/venv/lib/python3.11/site-packages/matplotlib/gridspec.py:576, in SubplotSpec._from_subplot_args(figure, args)
574 rows, cols, num = args
575 else:
--> 576 raise _api.nargs_error("subplot", takes="1 or 3", given=len(args))
578 gs = GridSpec._check_gridspec_exists(figure, rows, cols)
579 if gs is None:
TypeError: subplot() takes 1 or 3 positional arguments but 0 were given
< /code>
Рабочий код без наследования: < /p>
from matplotlib.figure import Figure
class CustomAxes():
def __init__(self, ax):
self.ax = ax
def create_plot(self, i):
self.ax.plot([1, 2, 3], [1, 2, 3])
self.ax.set_title(f'Title {i}')
class CustomFigure(Figure):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def subplots(self, *args, **kwargs):
axes = super().subplots(*args, **kwargs)
axes = [CustomAxes(ax) for ax in axes.flatten()]
return self, axes
fig, axes = CustomFigure().subplots(nrows=2, ncols=2)
for i, ax in enumerate(axes, start=1):
ax.create_plot(i=i)
fig.tight_layout()
fig
Подробнее здесь: [url]https://stackoverflow.com/questions/79384811/issues-with-axes-matplotlib-inheritance[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия