2016-04-08 1 views
2

Я работаю над некоторыми метеорологическими данными для построения контурных линий на базовой карте. Полный рабочий пример кода, который я сделал ранее, находится здесь How to remove/omit smaller contour lines using matplotlib. Все работает нормально, и я не жалуюсь на контурный сюжет. Однако есть специальный случай, когда мне приходится скрывать все контурные линии над определенной областью (нерегулярный лат & lon) на базовой карте.Как скрыть контурные линии/данные из определенной области на Базовой карте

Единственное возможное решение, которое я могу придумать, - это нарисовать линии сплайна над желаемой областью и заполнить их цветом, таким как Basemap. После многих поисков я нашел эту ссылку How to draw rectangles on a Basemap (код ниже)

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', alpha=0.4) 
    plt.gca().add_patch(poly) 

lats = [ -30, 30, 30, -30 ] 
lons = [ -50, -50, 50, 50 ] 

m = Basemap(projection='sinu',lon_0=0) 
m.drawcoastlines() 
m.drawmapboundary() 
draw_screen_poly(lats, lons, m) 

plt.show() 

Это, кажется, работает частично. Однако я хочу нарисовать регион, который является нерегулярным.

Любое решение оценивается.

Edit: 1

я понял, где проблема. Кажется, что любой цвет (facecolor), заполненный в области многоугольника, не скрывает ничего ниже. Всегда прозрачно только, независимо от используемого значения alpha. Чтобы проиллюстрировать проблему, я обрезал изображение, имеющее все три области, т.е. контур, область базовой карты и область полигона. Область Polygon заполнена красным цветом, но, как вы можете видеть, контурные линии всегда видны. Конкретная линия, которую я использовал в приведенном выше коде, является: -

poly = Polygon(xy, facecolor='red', edgecolor='b') 

Поэтому проблема заключается не в коде выше. Кажется, проблема с заполнением многоугольника. Но до сих пор нет решения для этой проблемы. Полученное изображение (обрезанное изображение) ниже (Смотрите мое 2-ое редактирование ниже прикрепленного изображения): -

enter image description here

Edit 2: Принимая ключ от этого http://matplotlib.1069221.n5.nabble.com/Clipping-a-plot-inside-a-polygon-td41950.html, который имеет аналогичное требование шахты , Я могу удалить некоторые данные. Однако удаленные данные находятся только вне области полигона, а не внутри. Вот код, который я взял ключ от: -

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.patches import RegularPolygon 

data = np.arange(100).reshape(10, 10) 
fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.contourf(data) 
poly = RegularPolygon([ 0.5, 0.5], 6, 0.4, fc='none', 
         ec='k', transform=ax.transAxes) 
for artist in ax.get_children(): 
    artist.set_clip_path(poly) 

Теперь мой вопрос, что команда используется для удаления данных в пределах области полигона?

+0

вручая в латах/Лон многоугольник Вершины не работает? – tacaswell

+0

Извините за задержку. Он работает после предоставления всех лат. Тем не менее, цвет базовой карты, который я использую, является белым/нет цвета. Когда я даю цвет полигона как «белый», используя эту команду: poly = Polygon (xy, facecolor = 'white') ', то он не скрывает линии данных/контура за ним. В принципе «белый» цвет действует как прозрачный. Код работает, но проблема связана с цветом. –

+0

Я обновил свой вопрос с помощью экрана. –

ответ

2

Не заметил, что на это претендовал иск, поэтому я мог бы просто предложить уже предложенное решение here. Вы можете повозиться с ZOrder, чтобы скрыть вещи позади полигона:

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='white',zorder=5) 

ax.add_patch(rect1) 

plt.show() 

, результат:

Hiding contour line with polygon

+0

Я начал новую тему, так как ответа на эту тему не было.В любом случае, я тоже принимаю этот ответ. Наслаждайтесь щедростью ;-)). –

Смежные вопросы