2016-04-12 14 views
1

Ich arbeite mit einigen Wetterdaten, um Konturlinien auf der Grundkarte mit Matplotlib zu plotten. Die Daten, die ich verwendet habe (x, y und Daten) werden hier hochgeladen http://www.mediafire.com/download/0epjjdm8auit611/mslp.txt hier http://www.mediafire.com/download/1dn6p8nw96h2mmd/xlong.txt und hier http://www.mediafire.com/download/31suzsz6j7u2bgz/xlat.txt. Der Arbeitsbeispielcode ist unter: -Wie man Kontur/Pfad innerhalb von ploygon auf Grundkarte mit Matplotlib entfernen?

from mpl_toolkits.basemap import Basemap 
import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.patches import Polygon 

m = Basemap(projection='merc', llcrnrlat=7, urcrnrlat=40, 
      llcrnrlon=68, urcrnrlon=110, resolution='l') 

x = np.loadtxt('xlong.txt', delimiter=',') 
y = np.loadtxt('xlat.txt', delimiter=',') 
Z = np.loadtxt('mslp.txt', delimiter=',') 

x, y = m(x, y) 
CS = plt.contour(x, y, Z, colors='b') 

plt.show() 

Der obige Code gibt mir die folgende Handlung ...

enter image description here

Das Grundstück ist absolut OK. Aber ich möchte Konturlinien in einem bestimmten Bereich verstecken/entfernen. Also habe ich ein Polygon über eine Grundkarte gezeichnet und versucht, Daten unter dem Polygon zu verstecken. Der Code, den ich verwendet habe, ist wie folgt: -

from mpl_toolkits.basemap import Basemap 
import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.patches import Polygon 


def draw_screen_poly(lats, lons, m): 
    x, y = m(lons, lats) 
    xy = zip(x, y) 
    poly = Polygon(xy, facecolor='red') 
    plt.gca().add_patch(poly) 

lats = [30, 35, 35, 30] 
lons = [80, 80, 90, 90] 

m = Basemap(projection='merc', llcrnrlat=7, urcrnrlat=40, 
      llcrnrlon=68, urcrnrlon=110, resolution='l') 

x = np.loadtxt('xlong.txt', delimiter=',') 
y = np.loadtxt('xlat.txt', delimiter=',') 
Z = np.loadtxt('mslp.txt', delimiter=',') 

x, y = m(x, y) 
CS = plt.contour(x, y, Z, colors='b') 

draw_screen_poly(lats, lons, m) 

plt.show() 

Das resultierende Bild ist lloking wie unten. Wie Sie sehen können, gibt es keinen Effekt von , da darunter keine Daten versteckt sind.

enter image description here

Was ich tun möchte, ist entweder Konturlinien entfernen durch dieses Polygon vorbei oder ausblenden/Clip das Sperrgebiet der Technik der Bildverarbeitung.

Die Lösung, die ich denke, sind: -

1. einig weiße Farbe Polygonbereich anwenden, so dass es die basemap Farbe paßt und Daten verborgen ist (dies bereits in dem obigen Beispiel geschehen ist und nicht funktioniert).

2. Gehen Sie jede Kontur aus der Konturensammlung durch und prüfen Sie, ob sie durch die Polygonregion verläuft. Schließlich entferne es aus der Handlung.

3. Abschließend den Polygonbereich abschneiden.

Mein Verstand geht nicht über die obigen Ideen hinaus. Jede Lösung zur Lösung dieses Problems wird sehr geschätzt.

Antwort

1

Das Basemap Toolkit für Matplotlib folgt weitgehend der gleichen Logik wie Matplotlib selbst. Sie werden bemerken, dass Sie zorder Argumente haben, um Ihre Plotaufrufe zu geben. Sie müssen nur sicherstellen, dass die zorder des Rechtecks ​​höher ist als die zorder der Kontur.

Kürzlich habe ich einen Awnser für eine ähnliche Frage here gegeben. Die Code-Logik sollte für Sie beispielsweise reproduzierbar sein:

import numpy as np 
import matplotlib.pyplot as plt 

t = np.arange(-1, 2, .01) 
s = np.sin(2*np.pi*t) 

plt.plot(t, s,zorder=4) 

p = plt.axvspan(1.25, 1.55, facecolor='g', alpha=1,zorder=3) 

plt.axis([-1, 2, -1, 2]) 
plt.grid(zorder=2) 

plt.show() 

darauf, wie die axvspan und die plot Daten selbst gezwungen sind, auf der Oberseite der grid zu sein (indem sie mit den zorder bastelt).

EDIT: Arbeitsbeispiel für Konturdiagramm mit niedrigerer Ordnung als ein Rechteck.

import matplotlib 
import matplotlib.mlab as mlab 
import matplotlib.pyplot as plt 

matplotlib.rcParams['xtick.direction'] = 'out' 
matplotlib.rcParams['ytick.direction'] = 'out' 

delta = 0.025 
x = np.arange(-3.0, 3.0, delta) 
y = np.arange(-2.0, 2.0, delta) 
X, Y = np.meshgrid(x, y) 
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) 
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) 
# difference of Gaussians 
Z = 10.0 * (Z2 - Z1) 


# Create a simple contour plot with labels using default colors. The 
# inline argument to clabel will control whether the labels are draw 
# over the line segments of the contour, removing the lines beneath 
# the label 
fig = plt.figure() 
ax = fig.add_subplot(111) 
CS = plt.contour(X, Y, Z,zorder=3) 
plt.clabel(CS, inline=1, fontsize=10) 
plt.title('Simplest default with labels') 

rect1 = matplotlib.patches.Rectangle((0,0), 2, 1, color='yellow',zorder=5) 

ax.add_patch(rect1) 

plt.show() 

, was zu:

Rectangle overlapping countour plot

, das Original ist:

contour plot

, die dort die Etiketten bringt.

+0

Vielen Dank. Das hat funktioniert. Allerdings habe ich für jede Konturlinie auch "Clavel". es gibt keine Auswirkung auf Zorder auf 'clabel'. Irgendeine Idee, dieses auch zu entfernen? –

+0

@sundar_ima Es ist wahrscheinlich ein Problem mit etwas in Ihrer Code-Sequenz, da ich Ihr Problem nicht reproduzieren kann. Wie Sie in meinem Beitrag sehen, sind die Beschriftungen unterhalb des Rechtecks. – armatita

+0

Thant hat perfekt funktioniert. Vielen Dank. Akzeptieren Sie Ihre Antwort. –