Почему возникает ошибка StopIteration для слишком большого количества элементов в полярном графике Matplotlib?Python

Программы на Python
Ответить
Anonymous
 Почему возникает ошибка StopIteration для слишком большого количества элементов в полярном графике Matplotlib?

Сообщение Anonymous »

Я пытаюсь создать полярный график некоторых данных со стрелкой аннотации, указывающей на другую точку графика. Однако, похоже, я получаю StopIteration, если добавляю слишком много компонентов.
Я не могу сказать более конкретно, потому что график работает нормально, если я 1) использую разные значения для r, 2) прокомментируйте строку ax.set_rticks(...), 3) прокомментируйте ax.annotate(...), 4) прокомментируйте ax.scatter(an_theta, ан_р), и т. д. Кажется, что трассировка стека подразумевает, что ошибка возникает при рисовании стрелки аннотации. Есть идеи, почему я получаю эту ошибку?
Я запускаю это на jupyterlab 4.2.5 (встроенные графики), matplotlib 3.7.1.
Воспроизводимый пример:
import numpy as np
import matplotlib.pyplot as plt

# Radius, random numbers in [0, 1)
rng = np.random.default_rng(seed=42)
r = rng.random((24,))

# 0 to 2pi
theta = np.linspace(0, 2, 24, endpoint=False) * np.pi

fig, ax = plt.subplots(subplot_kw={'projection': 'polar'})

# Data to plot
ax.plot(theta, r)
ax.scatter(theta, r, c=r, cmap='viridis')
ax.set_rticks([1, 2, 3]) # Less radial ticks
ax.grid(True)

# Where the annotation arrow should point
an_r = 0.670
an_theta = 0.820

# Visualise arrow end-point
ax.scatter(an_theta, an_r)

# Create arrow
ax.annotate('',
xy=(an_theta, an_r), # theta, radius
xytext=(0, 0),
arrowprops=dict(facecolor='black', shrink=0),
horizontalalignment='right'
)

plt.show()

Ошибка:
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/IPython/core/formatters.py:340](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/IPython/core/formatters.py#line=339), in BaseFormatter.__call__(self, obj)
338 pass
339 else:
--> 340 return printer(obj)
341 # Finally look for special method names
342 method = get_real_method(obj, self.print_method)

File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/IPython/core/pylabtools.py:152](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/IPython/core/pylabtools.py#line=151), in print_figure(fig, fmt, bbox_inches, base64, **kwargs)
149 from matplotlib.backend_bases import FigureCanvasBase
150 FigureCanvasBase(fig)
--> 152 fig.canvas.print_figure(bytes_io, **kw)
153 data = bytes_io.getvalue()
154 if fmt == 'svg':

File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/backend_bases.py:2342](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/backend_bases.py#line=2341), in FigureCanvasBase.print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, pad_inches, bbox_extra_artists, backend, **kwargs)
2336 renderer = _get_renderer(
2337 self.figure,
2338 functools.partial(
2339 print_method, orientation=orientation)
2340 )
2341 with getattr(renderer, "_draw_disabled", nullcontext)():
-> 2342 self.figure.draw(renderer)
2344 if bbox_inches:
2345 if bbox_inches == "tight":

File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/artist.py:95](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/artist.py#line=94), in _finalize_rasterization..draw_wrapper(artist, renderer, *args, **kwargs)
93 @wraps(draw)
94 def draw_wrapper(artist, renderer, *args, **kwargs):
---> 95 result = draw(artist, renderer, *args, **kwargs)
96 if renderer._rasterizing:
97 renderer.stop_rasterizing()

File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/artist.py:72](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/artist.py#line=71), in allow_rasterization..draw_wrapper(artist, renderer)
69 if artist.get_agg_filter() is not None:
70 renderer.start_filter()
---> 72 return draw(artist, renderer)
73 finally:
74 if artist.get_agg_filter() is not None:

File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/figure.py:3140](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/figure.py#line=3139), in Figure.draw(self, renderer)
3137 # ValueError can occur when resizing a window.
3139 self.patch.draw(renderer)
-> 3140 mimage._draw_list_compositing_images(
3141 renderer, self, artists, self.suppressComposite)
3143 for sfig in self.subfigs:
3144 sfig.draw(renderer)

File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/image.py:131](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/image.py#line=130), in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
129 if not_composite or not has_images:
130 for a in artists:
--> 131 a.draw(renderer)
132 else:
133 # Composite any adjacent images together
134 image_group = []

File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/artist.py:39](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/artist.py#line=38), in _prevent_rasterization..draw_wrapper(artist, renderer, *args, **kwargs)
36 renderer.stop_rasterizing()
37 renderer._rasterizing = False
---> 39 return draw(artist, renderer, *args, **kwargs)

File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/projections/polar.py:1037](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/projections/polar.py#line=1036), in PolarAxes.draw(self, renderer)
1034 self.yaxis.reset_ticks()
1035 self.yaxis.set_clip_path(self.patch)
-> 1037 super().draw(renderer)

File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/artist.py:72](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/artist.py#line=71), in allow_rasterization..draw_wrapper(artist, renderer)
69 if artist.get_agg_filter() is not None:
70 renderer.start_filter()
---> 72 return draw(artist, renderer)
73 finally:
74 if artist.get_agg_filter() is not None:

File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/axes/_base.py:3064](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/axes/_base.py#line=3063), in _AxesBase.draw(self, renderer)
3061 if artists_rasterized:
3062 _draw_rasterized(self.figure, artists_rasterized, renderer)
-> 3064 mimage._draw_list_compositing_images(
3065 renderer, self, artists, self.figure.suppressComposite)
3067 renderer.close_group('axes')
3068 self.stale = False

File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/image.py:131](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/image.py#line=130), in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
129 if not_composite or not has_images:
130 for a in artists:
--> 131 a.draw(renderer)
132 else:
133 # Composite any adjacent images together
134 image_group = []

File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/artist.py:72](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/artist.py#line=71), in allow_rasterization..draw_wrapper(artist, renderer)
69 if artist.get_agg_filter() is not None:
70 renderer.start_filter()
---> 72 return draw(artist, renderer)
73 finally:
74 if artist.get_agg_filter() is not None:

File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/text.py:2032](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/text.py#line=2031), in Annotation.draw(self, renderer)
2030 if self.arrow_patch.figure is None and self.figure is not None:
2031 self.arrow_patch.figure = self.figure
-> 2032 self.arrow_patch.draw(renderer)
2033 # Draw text, including FancyBboxPatch, after FancyArrowPatch.
2034 # Otherwise, a wedge arrowstyle can land partly on top of the Bbox.
2035 Text.draw(self, renderer)

File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/artist.py:39](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/artist.py#line=38), in _prevent_rasterization..draw_wrapper(artist, renderer, *args, **kwargs)
36 renderer.stop_rasterizing()
37 renderer._rasterizing = False
---> 39 return draw(artist, renderer, *args, **kwargs)

File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/patches.py:4352](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/patches.py#line=4351), in FancyArrowPatch.draw(self, renderer)
4348 # FIXME: dpi_cor is for the dpi-dependency of the linewidth. There
4349 # could be room for improvement. Maybe _get_path_in_displaycoord could
4350 # take a renderer argument, but get_path should be adapted too.
4351 self._dpi_cor = renderer.points_to_pixels(1.)
-> 4352 path, fillable = self._get_path_in_displaycoord()
4354 if not np.iterable(fillable):
4355 path = [path]

File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/patches.py:4327](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/patches.py#line=4326), in FancyArrowPatch._get_path_in_displaycoord(self)
4325 posB = self._convert_xy_units(self._posA_posB[1])
4326 (posA, posB) = self.get_transform().transform((posA, posB))
-> 4327 _path = self.get_connectionstyle()(posA, posB,
4328 patchA=self.patchA,
4329 patchB=self.patchB,
4330 shrinkA=self.shrinkA * dpi_cor,
4331 shrinkB=self.shrinkB * dpi_cor
4332 )
4333 else:
4334 _path = self.get_transform().transform_path(self._path_original)

File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/patches.py:2732](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/patches.py#line=2731), in ConnectionStyle._Base.__call__(self, posA, posB, shrinkA, shrinkB, patchA, patchB)
2726 path = self.connect(posA, posB)
2727 path = self._clip(
2728 path,
2729 self._in_patch(patchA) if patchA else None,
2730 self._in_patch(patchB) if patchB else None,
2731 )
-> 2732 path = self._clip(
2733 path,
2734 inside_circle(*path.vertices[0], shrinkA) if shrinkA else None,
2735 inside_circle(*path.vertices[-1], shrinkB) if shrinkB else None
2736 )
2737 return path

File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/patches.py:2710](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/patches.py#line=2709), in ConnectionStyle._Base._clip(self, path, in_start, in_stop)
2708 if in_start:
2709 try:
-> 2710 _, path = split_path_inout(path, in_start)
2711 except ValueError:
2712 pass

File [~/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/bezier.py:351](/home/preclineu/.conda/envs/graph_svd/lib/python3.11/site-packages/matplotlib/bezier.py#line=350), in split_path_inout(path, inside, tolerance, reorder_inout)
348 from .path import Path
349 path_iter = path.iter_segments()
--> 351 ctl_points, command = next(path_iter)
352 begin_inside = inside(ctl_points[-2:]) # true if begin point is inside
354 ctl_points_old = ctl_points

StopIteration:


Подробнее здесь: https://stackoverflow.com/questions/793 ... polar-plot
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»