Невозможно сохранить созданную Cartopy фигуру в PDF-файл, используя Matplotlib - PullRequest
1 голос
/ 09 апреля 2020

Я использую Cartopy для создания набора графиков на сетке широта / долгота (обновление с базовой карты Matplotlib), и даже несмотря на то, что при построении графиков не возникает никаких ошибок, мой код завершается неудачно, когда я пытаюсь сохранить рисунок в многостраничный файл PDF с использованием Matplotlib matplotlib.backends.backend_pdf.PdfPages.

Вот соответствующая часть кода:

import cartopy
import cartopy.crs as ccrs
from matplotlib import colorbar, cm, pyplot
from matplotlib.backends.backend_pdf import PdfPages
from matplotlib.font_manager import FontProperties

(fig, axis) = pyplot.subplots(nrows=1, ncols=1, subplot_kw={"projection": ccrs.PlateCarree()})

fout = PdfPages("Junk.pdf")
fout.savefig(fig)

Я подтвердил, что fig имеет тип matplotlib.figure.Figure.

Я получаю ошибку:

File "./plot_cfba.py", line 326, in <module>
    fout_tmp.savefig(fig[0])
  File "/data/science_TC/kmueller/toolkit/python/3.6.9/lib/python3.6/site-packages/matplotlib/backends/backend_pdf.py", line 2445, in savefig
    figure.savefig(self, format="pdf", **kwargs)
  File "/data/science_TC/kmueller/toolkit/python/3.6.9/lib/python3.6/site-packages/matplotlib/figure.py", line 2180, in savefig
    self.canvas.print_figure(fname, **kwargs)
  File "/data/science_TC/kmueller/toolkit/python/3.6.9/lib/python3.6/site-packages/matplotlib/backend_bases.py", line 2089, in print_figure
    **kwargs)
  File "/data/science_TC/kmueller/toolkit/python/3.6.9/lib/python3.6/site-packages/matplotlib/backends/backend_pdf.py", line 2503, in print_pdf
    self.figure.draw(renderer)
  File "/data/science_TC/kmueller/toolkit/python/3.6.9/lib/python3.6/site-packages/matplotlib/artist.py", line 38, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/data/science_TC/kmueller/toolkit/python/3.6.9/lib/python3.6/site-packages/matplotlib/figure.py", line 1709, in draw
    renderer, self, artists, self.suppressComposite)
  File "/data/science_TC/kmueller/toolkit/python/3.6.9/lib/python3.6/site-packages/matplotlib/image.py", line 135, in _draw_list_compositing_images
    a.draw(renderer)
  File "/data/science_TC/kmueller/toolkit/python/3.6.9/lib/python3.6/site-packages/matplotlib/artist.py", line 38, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/data/science_TC/kmueller/miniconda3/lib/python3.6/site-packages/cartopy/mpl/geoaxes.py", line 372, in draw
    gl._draw_gridliner(background_patch=self.background_patch)
  File "/data/science_TC/kmueller/miniconda3/lib/python3.6/site-packages/cartopy/mpl/gridliner.py", line 338, in _draw_gridliner
    x_lc = mcollections.LineCollection(lines, **collection_kwargs)
  File "/data/science_TC/kmueller/toolkit/python/3.6.9/lib/python3.6/site-packages/matplotlib/collections.py", line 1331, in __init__
    **kwargs)
  File "/data/science_TC/kmueller/toolkit/python/3.6.9/lib/python3.6/site-packages/matplotlib/collections.py", line 162, in __init__
    self.update(kwargs)
  File "/data/science_TC/kmueller/toolkit/python/3.6.9/lib/python3.6/site-packages/matplotlib/artist.py", line 974, in update
    ret = [_update_property(self, k, v) for k, v in props.items()]
  File "/data/science_TC/kmueller/toolkit/python/3.6.9/lib/python3.6/site-packages/matplotlib/artist.py", line 974, in <listcomp>
    ret = [_update_property(self, k, v) for k, v in props.items()]
  File "/data/science_TC/kmueller/toolkit/python/3.6.9/lib/python3.6/site-packages/matplotlib/artist.py", line 970, in _update_property
    .format(type(self).__name__, k))
AttributeError: 'LineCollection' object has no property 'xloc'

Я использую Matplotlib версии 3.1.2, Cartopy 0.17.0 и python 3.6.9.

Есть ли несоответствие между этими версиями Matplotlib и Cartopy? Нужно ли обновлять один из них, чтобы он соответствовал другому?

Этот код работал нормально, но теперь, когда я делаю свои карты, используя Cartopy, все сломалось.

1 Ответ

0 голосов
/ 14 апреля 2020

Как оказалось, проблема была полностью в моем собственном решении. Вызов «axis.gridlines» должен содержать «xlocs» и «ylocs», а не «xlo c» и «ylo c».

Мне следовало бы внимательно посмотреть на сообщение об ошибке. Я был пойман тем фактом, что вызов savefig взорвался, когда проблема была действительно в «axis.gridlines», тем самым отправив мое мышление в совершенно неправильном направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...