2016-04-12 6 views
1

Я работаю с некоторыми данными о погоде для построения контурных линий на базовой карте с использованием matplotlib. Используемые мной данные (x, y и данные) загружаются здесь http://www.mediafire.com/download/0epjjdm8auit611/mslp.txt здесь http://www.mediafire.com/download/1dn6p8nw96h2mmd/xlong.txt и здесь http://www.mediafire.com/download/31suzsz6j7u2bgz/xlat.txt. Рабочий пример кода ниже: -Как удалить контур/путь внутри ploygon на базовой карте с помощью matplotlib?

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() 

Приведенный выше код дает мне сюжет ...

enter image description here

Сюжет абсолютно нормально. Но я хотел бы скрыть/удалить контурные линии над определенной областью. Итак, я нарисовал многоугольник поверх базовой карты и попытался скрыть данные под полигоном. Код, который я использовал для этого, выглядит следующим образом: -

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() 

Полученное изображение выглядит как показано ниже. Как вы можете видеть, нет никакого эффекта facecolour, так как он не скрывает никаких данных под ним.

enter image description here

То, что я хочу сделать, это либо удалить контурные линии, проходящие через этот многоугольник или скрыть/обрезают область полигонов с использованием техники обработки изображений.

Решение Я думаю, являются: -

1. Нанесите белый цвет многоугольников области так, чтобы он соответствовал цвету и базовой карты данные скрыты (это уже сделано в приведенном выше примере, и не работает).

2. Пройдите через каждый контур из коллекции контуров и проверьте, проходит ли он через область многоугольника. Наконец, удалите его из сюжета.

3. Наконец, чип от области многоугольника.

Мое сознание не выходит за рамки вышеперечисленных идей. Любое решение для решения этой проблемы высоко ценится.

ответ

1

Базовый набор инструментов для matplotlib следует большей части той же логики, что и matplotlib. Вы заметите, что у вас есть аргументы zorder, чтобы передать ваши разговоры. Вам просто нужно убедиться, что zorder прямоугольника выше, чем zorder контура.

Недавно я дал тент для аналогичного вопроса here. Логика кода должна быть воспроизводимой для вас, например:

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() 

, обратите внимание, как axvspan и сами данные plot вынуждены быть на вершине grid (по манипуляциям с zorder).

EDIT: Рабочий пример контурного участка с более низкой зоной, чем прямоугольник.

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() 

, что приводит к:

Rectangle overlapping countour plot

, оригинал:

contour plot

, который приносит этикетки там.

+0

спасибо. Это сработало. Однако у меня также есть «clabel» для каждой линии контура. нет никакого эффекта на zorder на 'clabel'. Любая идея удалить это тоже? –

+0

@sundar_ima Вероятно, это проблема с чем-то на вашей кодовой последовательности, так как я не могу воспроизвести вашу проблему. Как вы видите в моем отредактированном столбце, метки находятся ниже прямоугольника. – armatita

+0

Тант отлично работал. Большое спасибо. Принимая ваш ответ. –