Wenn Sie mit Python (Pandas oder NumPy) Datenwissenschaft betreiben möchten, verwenden Sie derzeit de mato matplotlib als Zeichnungsbibliothek und [zum Zeichnen von Geodaten und Karten Es ist besser, Cartopy zu verwenden. Die Kopie ist 2020 - wenn ich versuche, sie mit Google Colaboratory zu verwenden, bei dem es sich um Jupyter-Notizbuch in der Google Cloud handelt. 04 Derzeit ist die offizielle Methode von Fehlern geplagt und praktisch unbrauchbar. Hier finden Sie eine Zusammenfassung der Problemumgehungen und ihrer Erklärungen.
Installieren Sie mit einer der folgenden Möglichkeiten.
Muster 1
!grep '^deb ' /etc/apt/sources.list | \
sed 's/^deb /deb-src /g' | \
tee /etc/apt/sources.list.d/deb-src.list
!apt-get -qq update
!apt-get -qq build-dep python3-cartopy
!pip uninstall -y shapely
!pip install --no-binary cartopy cartopy==0.17.0
Muster 2
!grep '^deb ' /etc/apt/sources.list | \
sed 's/^deb /deb-src /g' | \
tee /etc/apt/sources.list.d/deb-src.list
!apt-get update
!apt-get -qq build-dep python3-cartopy
!apt-get -qq remove python-shapely python3-shapely
!pip install --no-binary shapely shapely --force
!pip install --no-binary cartopy cartopy==0.17.0
Das offizielle Google Colaboratory-Notizbuch (https://colab.research.google.com/notebooks/snippets/importing_libraries.ipynb) enthält folgende Betriebssystemverpackung: Es soll mit dem System apt möglich sein.
!apt-get -qq install python-cartopy python3-cartopy
import cartopy
Die auf diese Weise installierte Kartusche weist jedoch einen Fehler auf, der mit einem einfachen Code wie dem folgenden gelöscht werden kann:
gridlines ()
schlägt fehlIch kann das Raster nicht zeichnen, da bei gridlines ()
eine Fehlermeldung angezeigt wird.
Beispielcode:
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
ax = plt.axes(projection=ccrs.PlateCarree())
ax.gridlines()
ax.coastlines()
Error:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-4-3e1ebed7d096> in <module>()
3
4 ax = plt.axes(projection=ccrs.PlateCarree())
----> 5 ax.gridlines()
6 ax.coastlines()
4 frames
/usr/local/lib/python3.6/dist-packages/matplotlib/ticker.py in _validate_steps(steps)
2108 steps = np.asarray(steps)
2109 if np.any(np.diff(steps) <= 0) or steps[-1] > 10 or steps[0] < 1:
-> 2110 raise ValueError('steps argument must be an increasing sequence '
2111 'of numbers between 1 and 10 inclusive')
2112 if steps[0] != 1:
ValueError: steps argument must be an increasing sequence of numbers between 1 and 10 inclusive
Küsten ()
Das Zeichnen einer Küstenlinie mit "Küstenlinien ()" führt zu "Sitzung aus unbekanntem Grund abgestürzt" mit dem folgenden Laufzeitprotokoll:
Beispielcode:
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
ax = plt.axes(projection=ccrs.PlateCarree())
ax.coastlines()
Fehlerprotokoll (Laufzeitprotokoll):
Apr 14, 2020, 6:18:57 PM WARNING warn("IPython.utils.traitlets has moved to a top-level traitlets package.")
Apr 14, 2020, 6:18:57 PM WARNING /usr/local/lib/python3.6/dist-packages/IPython/utils/traitlets.py:5: UserWarning: IPython.utils.traitlets has moved to a top-level traitlets package.
Apr 14, 2020, 6:18:57 PM WARNING WARNING:root:kernel e5263554-c566-4983-aea5-418e4cb6441a restarted
Apr 14, 2020, 6:18:57 PM INFO KernelRestarter: restarting kernel (1/5), keep random ports
Apr 14, 2020, 6:18:54 PM WARNING python3: geos_ts_c.cpp:3991: int GEOSCoordSeq_getSize_r(GEOSContextHandle_t, const geos::geom::CoordinateSequence*, unsigned int*): Assertion `0 != cs' failed.
Die Ursache für Problem 1 ist, dass die installierte Cartopy so alt ist wie v0.14.2. Obwohl es in Cartopys Ausgabe Nr. 1374 gemeldet wurde, ist der Fehler selbst PR Nr. 773. Es wurde in / cartopy / pull / 773) behoben und wurde seit v0.16.0 im Februar 2018 behoben.
Übrigens ist v0.14.2 die im April 2016 veröffentlichte Version, und der Grund, warum eine so alte Version installiert wird, ist, dass das Betriebssystem Ubuntu 18.04.3 LTS ist. Wie LTS sagt, handelt es sich um eine langfristig unterstützte Version, und die erste Version, 18.04, wurde im April 2018 veröffentlicht. Da es sich um eine Langzeit-Support-Version handelt, können Sie sie lange Zeit mit Vertrauen verwenden. Wenn es sich jedoch um kleinere Software oder Software handelt, die noch nicht stabil ist, ist es ein wenig schwierig, die Version mit dem Fehler ständig zu verpacken und zu verwenden. (Siehe Paketinformationen).
In [1]: cartopy.__version__
Out[1]: '0.14.2'
In [2]: !cat /etc/os-release
Out[2]:
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
Problem 2 ist, dass Cartopy und Shapely, die von Cartopy verwendet werden, unterschiedliche Versionen von GEOS verwenden und nicht kompatibel sind. Als Cartopy Ausgabe Nr. 871 und Ausgabe Nr. 1490 gemeldet. Problem Nr. 805 erläutert die grundlegende Antwort, wurde jedoch noch nicht behoben.
Wenn in Debian und Ubuntu die Version des Bibliothekspakets hochgefahren wird, werden die davon abhängigen Pakete neu erstellt, sodass sie nicht mit einer anderen Version der Bibliothek verknüpft werden sollten. Wenn Sie eine Cartopy mit apt einfügen, wird die vom Betriebssystem bereitgestellte Deb-Paketversion Shapely 1.6.4 in die damit verknüpfte Cartopy aufgenommen, wie unten gezeigt. Wenn diese Form verwendet wird, tritt kein Problem auf.
Deb-Pakete, die zu Beginn mit "apt-get install" eingegeben wurden:
python-pkg-resources (39.0.1-2 Ubuntu:18.04/bionic [all])
python-pyshp (1.2.12+ds-1 Ubuntu:18.04/bionic [all])
python-shapely (1.6.4-1 Ubuntu:18.04/bionic [amd64])
python-six (1.11.0-2 Ubuntu:18.04/bionic [all])
python-cartopy (0.14.2+dfsg1-2build3 Ubuntu:18.04/bionic [amd64])
python3-pkg-resources (39.0.1-2 Ubuntu:18.04/bionic [all])
python3-pyshp (1.2.12+ds-1 Ubuntu:18.04/bionic [all])
python3-shapely (1.6.4-1 Ubuntu:18.04/bionic [amd64])
python3-six (1.11.0-2 Ubuntu:18.04/bionic [all])
python3-cartopy (0.14.2+dfsg1-2build3 Ubuntu:18.04/bionic [amd64])
Wie unten gezeigt, scheint Google Colaboratory jedoch von Anfang an die neueste Version von Shapely v1.7.0 mit pip enthalten zu haben.
In [3]: !pip list | grep Shapely
Out[3]: Shapely 1.7.0
Wenn Sie einfach in diesem Zustand importieren, ist die Kartusche passend und Shapely ist pip. Dies ist die Ursache für die Inkompatibilität. Es ist ein Ärger.
In [4]:
import shapely
shapely.__version__
Out[4]: '1.7.0'
In Bezug auf Problem 2 ist die Kombination von pip und apt schlecht, daher ist dies eigentlich einfach. Wenn Sie zu Beginn vor oder nach der Installation von "apt-get" Folgendes ausführen, verwendet Shapely diejenige, die Sie mit apt (deb-Version) eingegeben haben ("cartopy importieren" vor "pip uninstall"). Und beachten Sie, dass es darin "formschön" importiert wird).
!pip uninstall -y shapely
Da die Ursache die oben genannte ist, ist die Politik der Gegenmaßnahmen wie folgt.
Tun Sie dies speziell.
apt-get build-dep
Beim Importieren aus der Quelle müssen abhängige Bibliotheken wie GEOS enthalten sein. Es ist mühsam, sie einzeln zu platzieren, daher werde ich dieses Mal "apt-get build-dep" verwenden.
apt-get build-dep
ist ein Befehl, der das Deb-Paket installiert, das zum Erstellen des Quellpakets des angegebenen Deb-Pakets erforderlich ist. In diesem Fall wird die zum Erstellen von cartopy v0.17.0 erforderliche Umgebung basierend auf den Build-Informationen des Quellpakets des deb-Pakets von cartopy v0.14.2 vorbereitet. Wenn sich die Abhängigkeiten zwischen v0.14.2 und v0.17.0 ändern, funktioniert dies natürlich nicht. Wenn jedoch keine größeren Änderungen vorgenommen wurden, ist dies in Ordnung (diesmal hat es tatsächlich funktioniert).
Dann möchte ich sofort zu "apt-get build-dep" gehen, aber selbst wenn ich es plötzlich ausführe, tritt ein Fehler auf.
In [5]: !apt-get build-dep cartopy
Out[5]:
Reading package lists... Done
E: Unable to find a source package for cartopy
Die von "apt-get build-dep" verwendeten Quellpaketinformationen sind "/ etc / apt / sources.list" (und "/ etc / apt / sources.list.d / *"). Dies ist die Quelleneinstellung für die Paketerfassung von apt. Das liegt daran, dass es standardmäßig auskommentiert ist.
In [6]: !grep deb /etc/apt/sources.list
Out[6]:
deb http://archive.ubuntu.com/ubuntu/ bionic main restricted
# deb-src http://archive.ubuntu.com/ubuntu/ bionic main restricted
deb http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted
# deb-src http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted
deb http://archive.ubuntu.com/ubuntu/ bionic universe
# deb-src http://archive.ubuntu.com/ubuntu/ bionic universe
deb http://archive.ubuntu.com/ubuntu/ bionic-updates universe
# deb-src http://archive.ubuntu.com/ubuntu/ bionic-updates universe
deb http://archive.ubuntu.com/ubuntu/ bionic multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ bionic multiverse
deb http://archive.ubuntu.com/ubuntu/ bionic-updates multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ bionic-updates multiverse
deb http://archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse
# deb http://archive.canonical.com/ubuntu bionic partner
# deb-src http://archive.canonical.com/ubuntu bionic partner
deb http://security.ubuntu.com/ubuntu/ bionic-security main restricted
# deb-src http://security.ubuntu.com/ubuntu/ bionic-security main restricted
deb http://security.ubuntu.com/ubuntu/ bionic-security universe
# deb-src http://security.ubuntu.com/ubuntu/ bionic-security universe
deb http://security.ubuntu.com/ubuntu/ bionic-security multiverse
# deb-src http://security.ubuntu.com/ubuntu/ bionic-security multiverse
deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran35/
Dies ist die einzige Ursache. Sie können das Problem lösen, indem Sie einfach eine Datei vorbereiten, in der die mit "deb" beginnende Zeile durch "deb-src" ersetzt wird, und die Paketinformationen mit "apt-get update" aktualisieren.
In [7]:
!grep '^deb ' /etc/apt/sources.list | \
sed 's/^deb /deb-src /g' | \
tee /etc/apt/sources.list.d/deb-src.list
!apt-get -qq update
Dies wird auch das oben erwähnte "apt-get build-dep" bestehen.
Wenn Sie danach "pip install --no-binary" verwenden, um ohne Verwendung von Binärpaketen zu erstellen, wird das am Anfang beschriebene Verfahren verwendet. Ich denke, es gibt sowohl Fälle, in denen es kein Problem mit Shapely of apt gibt, als auch Fälle, in denen Sie die neueste Version verwenden möchten, die ursprünglich in Google Colaboratory enthalten war. Daher werde ich zwei Muster zeigen. Es ist eine gute Idee, es zu ändern, je nachdem, welche Form Sie verwenden möchten.
Muster 1: Bei Verwendung der Deb-Paketversion von apt Shapely (v1.6.4)
!grep '^deb ' /etc/apt/sources.list | \
sed 's/^deb /deb-src /g' | \
tee /etc/apt/sources.list.d/deb-src.list
!apt-get -qq update
!apt-get -qq build-dep python3-cartopy
!pip uninstall -y shapely
!pip install --no-binary cartopy cartopy==0.17.0
Muster 2: Bei Verwendung der neuesten Version von Shapely (v1.7.0) aus der Quelle
!grep '^deb ' /etc/apt/sources.list | \
sed 's/^deb /deb-src /g' | \
tee /etc/apt/sources.list.d/deb-src.list
!apt-get update
!apt-get -qq build-dep python3-cartopy
!apt-get -qq remove python-shapely python3-shapely
!pip install --no-binary shapely shapely --force
!pip install --no-binary cartopy cartopy==0.17.0
Beide Python-Programme in Frage 1 und 2 funktionieren einwandfrei. Die Wellen der offiziellen Galerie funktionieren ebenfalls wie unten gezeigt.
import matplotlib.pyplot as plt
import numpy as np
import cartopy.crs as ccrs
def sample_data(shape=(73, 145)):
"""Return ``lons``, ``lats`` and ``data`` of some fake data."""
nlats, nlons = shape
lats = np.linspace(-np.pi / 2, np.pi / 2, nlats)
lons = np.linspace(0, 2 * np.pi, nlons)
lons, lats = np.meshgrid(lons, lats)
wave = 0.75 * (np.sin(2 * lats) ** 8) * np.cos(4 * lons)
mean = 0.5 * np.cos(2 * lats) * ((np.sin(2 * lats)) ** 2 + 2)
lats = np.rad2deg(lats)
lons = np.rad2deg(lons)
data = wave + mean
return lons, lats, data
def main():
fig = plt.figure(figsize=(10, 5))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.Mollweide())
lons, lats, data = sample_data()
ax.contourf(lons, lats, data,
transform=ccrs.PlateCarree(),
cmap='nipy_spectral')
ax.coastlines()
ax.set_global()
plt.show()
main()
Da sich der Inhalt (Status) des Betriebssystem-Dateisystems während der Installation ändert, ist es besser zu wissen, wie Sie beim Versuch und bei der fehlerhaften Installation zum ursprünglichen Status zurückkehren können. Sie können es mit der folgenden Methode zurücksetzen.
Bei "Restart Runtime" befindet sich der Code-Ausführungsstatus im Ausgangszustand (nichts befindet sich im Speicher), das Dateisystem bleibt jedoch geändert.
Recommended Posts