2017-10-10 8 views
0

J'utilise depuis longtemps un fond de carte avec matplotlib en python mais je construisais un nouveau morceau de code et je suis tombé sur cette anomalie vraiment étrange et je ne sais pas Je ne sais pas comment le contourner.Matplotlib basemap polygone jette une erreur mais réussit si quelque chose est tracée

Si j'ai un polygone que je veux tracer dans matplotlib en utilisant (lonList, latList) la commande show jettera une erreur lors du tracé du polygone avec une erreur d'allocation. Ou sur une autre machine, j'ai vu qu'il va tracer un écran vide. Cependant, si j'utilise la même liste et ajoute un nuage de points (ligne commentée ci-dessous), cela fonctionnera. De plus, si je trace une ligne ou un nuage de points tout seul, cela fonctionnera, mais le tracé du polygone lui-même échoue. Je n'ai aucune idée pourquoi cela est et ne peut pas trouver un rapport de bogue à ce sujet. S'il vous plaît aider? Par ailleurs, je cours Debian Jessie 8 avec python 2.7 si cela peut aider.

#!/usr/bin/env python 

import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 
from matplotlib.collections import PatchCollection 
from matplotlib.patches  import Polygon 

def singlePatchExample(): 
    patches = [] 
    fig = plt.figure(figsize=(19.2,10.8)) 
    ax = plt.subplot(111) 

    lonSW = -8.0 
    latSW = 51.0 
    lonNE = -6.0 
    latNE = 53.0 
    centLon = (lonSW + lonNE)/2.0 
    centLat = (latSW + latNE)/2.0 

    baseMap = Basemap(llcrnrlon=lonSW,llcrnrlat=latSW,urcrnrlon=lonNE,urcrnrlat=latNE,\ 
       resolution='i', lat_0 = centLon, lon_0 = centLat) 

    longList = [ -7.0, -7.5, -7.7 ] 
    latList = [ 51.5, 52.0, 52.5 ] 

    x, y = baseMap(longList, latList) 
    polygon = Polygon(zip(x,y), True) 
    patches.append(polygon) 

    patchInSingleImage = PatchCollection(patches, alpha=0.2) 
    ax.add_collection(patchInSingleImage) 
    ax.set_title("Single Patch Example, (without points????)") 

    #baseMap.scatter(x, y, color='r') 

    plt.show() 

singlePatchExample() 

Répondre

2

Lors de l'exécution du code, j'obtiens une figure avec des axes mais aucun polygone n'est affiché. Cela devrait en fait être la même avec et sans fond de carte. La raison en est que matplotlib ne s'aligne pas automatiquement lorsque le seul artiste à l'intérieur d'un axe est un PatchCollection (ou probablement n'importe quelle collection).

La solution dans ce cas serait d'ajouter

ax.autoscale() 

après avoir ajouté la collection.

Le point principal est que puisqu'il n'y a pas réellement de chose sur la carte, la mise à l'échelle doit être prise en charge par les axes matplotlib. Vous pouvez vous assurer que la carte est réellement connectée aux axes en dessinant quelque chose de superflu avec zéro largeur de ligne sur la carte.

baseMap.drawrivers(linewidth=0) 

Cela rendrait superflu ax.autoscale() et échelle de la carte comme si elle avait une des données à ce sujet. De même, dessiner des parallèles ou des méridiens aurait le même effet - juste tout ce qui dessinerait la carte sur les axes.

baseMap.drawparallels(latList) 
+0

Merci pour ce travail, mais comment puis-je conserver la limite originale SW, NE. C'est également important à préserver. Je pense toujours que cela vaut la peine d'être +1 car je ne pouvais même pas deviner ça. Cela ressemble toujours à un bug. –

+0

Eh bien, tant que vous n'avez rien sur la carte, aucune carte n'est affichée. Assurez-vous d'avoir la carte dans les axes. J'ai mis à jour la réponse avec quelques options possibles. – ImportanceOfBeingErnest