Python 使用LineCollection打印shapefile会显示所有边,但会部分填充它们

Python 使用LineCollection打印shapefile会显示所有边,但会部分填充它们,python,matplotlib,matplotlib-basemap,Python,Matplotlib,Matplotlib Basemap,在过去的几天里,我一直在尝试将气象站数据插入我国的地图中。我的做法如下: 加载数据时,我使用插值创建网格 基于这个网格,我绘制了一幅轮廓和轮廓图像 然后,我在地图顶部绘制德国、比利时和法国的形状文件,以覆盖不相关的轮廓/轮廓元素。我用过这个 最后,我还使用了一个海洋形状文件(IHO Sea Areas;www.marineregions.org/downloads.php#IHO)进行绘图,以覆盖北海。使用QGIS,我编辑了这个海洋形状文件,并删除了除北海以外的所有内容-给定时间限制:) 你

在过去的几天里,我一直在尝试将气象站数据插入我国的地图中。我的做法如下:

  • 加载数据时,我使用插值创建网格
  • 基于这个网格,我绘制了一幅
    轮廓
    轮廓
    图像
  • 然后,我在地图顶部绘制德国、比利时和法国的形状文件,以覆盖不相关的
    轮廓
    /
    轮廓
    元素。我用过这个
  • 最后,我还使用了一个海洋形状文件(IHO Sea Areas;www.marineregions.org/downloads.php#IHO)进行绘图,以覆盖北海。使用QGIS,我编辑了这个海洋形状文件,并删除了除北海以外的所有内容-给定时间限制:)
你可能会说一切都很好——但出于某种原因,该国的部分地区以及岛屿被解释为水。我想这是因为这些是不同的部分,都没有连接到主要的土地(由于水/河流)

奇怪的是,这些边是画出来的,但没有填充

我已经试过很多次了,但是对于如何解决这个问题,我没有任何线索。我猜它在
LineCollection
中的某个地方,因为在QGIS中,shapefile是正确的(即,它在单击岛屿等时不识别形状,这是正确的,因为它在单击海洋时应该只识别形状)。 我真诚地希望你能帮我指出我错在哪里,以及我怎样才能解决这个问题

非常感谢

这是我得到的地图:

我的代码如下(您可能会看到,我对这种编程非常陌生,我昨天就开始了:):

将numpy导入为np
导入matplotlib
matplotlib.use('Agg')
从scipy.interpolate导入网格数据
从mpl_toolkits.basemap导入basemap,maskoceans
将matplotlib.pyplot作为plt导入
从numpy.random导入种子
将形状文件导入为shp
从matplotlib.collections导入LineCollection
从matplotlib导入cm
#设置体形大小
plt.图(figsize=(15,15),dpi=80)
#定义地图边界
xMin,xMax=2.5,8.0
yMin,yMax=50.6,53.8
#创建地图
m=底图(投影=merc',llcrnrlon=xMin,llcrnrlat=yMin,urcrnlon=xMax,urcrnlat=yMax,分辨率=h')
m、 drawmapboundary(填充颜色='#d4dadc',线宽=0.25)
#m.绘制海岸线(线宽=0.5,颜色='#333333')
#加载数据
y=[54.325666666667,52.36,53.269444444444,55.399166666667,54.116666666667,53.614444444444,53.491666666667,53.824130555556,52.918055555556,54.03694,52.139722,52.926865008825,54.853888888889,52.317222,53.240026656696,52.642696895243,53.391265948394,52.505333893732,52.098821802977,52.896643913235,52.457270486008,53.223000488316,52.701902388132,52.0548617826,53.411581103636,52.434561756559,52.749056395511,53.123676213651,52.067534268959,53.194409573306,52.27314817052,51.44133405998,51.224757511326,51.990941918858,51.44774444494043,51.960667359998,51.969031121385,51.564889021961,51.8593837451.449772459909,51.658582805,51.625690909.625YMAX,19662509,62599]
x=[2.93575,3.3416666666667,3.6277777777778,3.8102777777778,4.0122222222222,4.9602777777778,5.9416666666667,2.9452777777778,4.1502777777778,6.04167,4.436389,4.7811453228565,4.6961111111111,4.789722,4.9207907082729,4.9787572406902,5.3458010937365,4.6029300588208,5.1797058644882,5.383478899702,5.5196324030324,5.7515738887123,5.8874461671401,5.8723225499.5757579797575757414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141[斧头]
z=[4.8,5.2,5.8,5.4,5.3,5.4,4.6,5.8,6.3,4.8,5.4,5.3,4.6,5.4,4.1,5.5,4.5,4.2,3.9,3.7,4.2,3.2,4,3.8,2.7,2.3,3.4,2.5.5,3.7,5.2.9,5.1,3.8,4.4.4,4.2,4.2,3.2,3.2,2,2,3.2,2,2]
平均值=np.平均值(z)
z、 扩展([avg,avg,avg,avg])
x、 y=m(x,y)
#要插值到的目标栅格
xis=np.arange(最小(x),最大(x),2000)
Ys=np.arange(最小值(y),最大值(y),2000年)
席,Y= NP
#插入
zi=网格数据((x,y),z,(xi,yi),方法='cubic')
#确定颜色栏(todo)的正确值
vrange=最大(z)-最小(z)
mult=2
vmin=最小值(z)-(多个*vrange)
vmax=最大值(z)+(多重*vrange)
#画轮廓
cs=m.等高线(xi,yi,zi,5,线宽=0.25,颜色=k')
cs=m.contourf(xi,yi,zi,5,vmax=vmax,vmin=vmin,cmap=plt.get_cmap('jet'))
#从shapefile打印海
sf=shp.Reader(r'/DIR_TO_shp/shapefiles/northsea')
shapes=sf.shapes()
打印形状[0]。零件
记录=sf.records()
ax=plt.子批次(111)
对于记录,zip中的形状(记录,形状):
lons,lats=zip(*shape.points)
数据=np.数组(m(lons,lats)).T
打印透镜(形状、零件)
如果len(形状零件)==1:
segs=[数据,]
其他:
segs=[]
对于范围(1,len(形状零件))中的i:
索引=形状。零件[i-1]
index2=形状零件[i]
segs.append(数据[索引:index2])
segs.append(数据[index2:])
lines=LineCollection(分段,抗锯齿=(1,),zorder=3)
行。设置面颜色(“#abc0d3”)
线条。设置边缘颜色(“红色”)
线条。设置线条宽度(0.5)
ax.添加_集合(行)
#从shapefile绘制法国
sf=shp.Reader(r'/DIR\u TO\u shp/shapefiles/FRA\u adm0')
shapes=sf.shapes()
记录=sf.records()
ax=plt.子批次(111)
对于记录,zip中的形状(记录,形状):
lons,lats=zip(*shape.points)
数据=np.数组(m(lons,lats)).T
如果len(形状零件)==1:
segs=[数据,]
其他:
segs=[]
对于范围(1,len(形状零件))中的i:
索引=形状。零件[i-1]
index2=形状零件[i]
segs.append(数据[索引:index2])
segs.append(数据[index2:])
线=线集合(分段、抗锯齿=(1,))
行。设置面颜色(“#faf8”)
线条。设置边缘颜色(“#333”)
import numpy as np
import matplotlib
matplotlib.use('Agg')
from scipy.interpolate import griddata
from mpl_toolkits.basemap import Basemap, maskoceans
import matplotlib.pyplot as plt
from numpy.random import seed
import shapefile as shp
from matplotlib.collections import LineCollection
from matplotlib.patches import Path, PathPatch
from matplotlib import cm


# Set figure size
fig, ax = plt.subplots(figsize=(15,15), dpi = 80)

# Define map bounds
xMin, xMax = 2.5, 8.0
yMin, yMax = 50.6, 53.8

shapefiles = [
    'shapefiles/BEL_adm0',
    'shapefiles/FRA_adm0',
    'shapefiles/DEU_adm0',
    'shapefiles/northsea',
]

colors = ['red', 'green', 'yellow', 'blue']


y = [54.325666666667,52.36,53.269444444444,55.399166666667,54.116666666667,53.614444444444,53.491666666667,53.824130555556,52.918055555556,54.03694,52.139722,52.926865008825,54.853888888889,52.317222,53.240026656696,52.642696895243,53.391265948394,52.505333893732,52.098821802977,52.896643913235,52.457270486008,53.223000488316,52.701902388132,52.0548617826,53.411581103636,52.434561756559,52.749056395511,53.123676213651,52.067534268959,53.194409573306,52.27314817052,51.441334059998,51.224757511326,51.990941918858,51.447744494043,51.960667359998,51.969031121385,51.564889021961,51.857593837453,51.449772459909,51.658528382201,51.196699902606,50.905256257898,51.497306260089,yMin,yMin,yMax,yMax]
x = [2.93575,3.3416666666667,3.6277777777778,3.8102777777778,4.0122222222222,4.9602777777778,5.9416666666667,2.9452777777778,4.1502777777778,6.04167,4.436389,4.7811453228565,4.6961111111111,4.789722,4.9207907082729,4.9787572406902,5.3458010937365,4.6029300588208,5.1797058644882,5.383478899702,5.5196324030324,5.7515738887123,5.8874461671401,5.8723225499118,6.1990994508938,6.2589770334531,6.5729701105864,6.5848470019087,6.6567253619722,7.1493220605216,6.8908745111116,3.5958241584686,3.8609657214986,4.121849767852,4.342014,4.4469005114756,4.9259216999194,4.9352386335384,5.1453989235756,5.3770039280214,5.7065946674719,5.7625447234516,5.7617834850481,6.1961067840608,xMin,xMax,xMin,xMax]
z = [4.8,5.2,5.8,5.4,5,5.3,5.4,4.6,5.8,6.3,4.8,5.4,5.3,4.6,5.4,4.4,4.1,5.5,4.5,4.2,3.9,3.7,4.2,3.2,4,3.8,2.7,2.3,3.4,2.5,3.7,5.2,2.9,5.1,3.8,4.4,4.2,3.9,3.8,3.2,2.6,2.8,2.4,3.1]
avg = np.average(z)
z.extend([avg,avg,avg,avg])



# Create map
m = Basemap(
    ax = ax,
    projection='merc',
    llcrnrlon=xMin,
    llcrnrlat=yMin,
    urcrnrlon=xMax,
    urcrnrlat=yMax,
    resolution='h'
)
x,y = m(x,y)
m.drawmapboundary(fill_color='#d4dadc',linewidth=0.25)

# target grid to interpolate to
xis = np.arange(min(x),max(x),2000)
yis = np.arange(min(y),max(y),2000)
xi,yi = np.meshgrid(xis,yis)

# interpolate
zi = griddata((x,y),z,(xi,yi),method='cubic')

# Decide on proper values for colour bar (todo)
vrange = max(z)-min(z)
mult = 2
vmin = min(z)-(mult*vrange)
vmax = max(z)+(mult*vrange)

# Draw contours
cs = m.contour(xi, yi, zi, 5, linewidths=0.25, colors='k')
cs = m.contourf(xi, yi, zi, 5,vmax=vmax,vmin=vmin,cmap=plt.get_cmap('jet'))

for sf_name,color in zip(shapefiles, colors):
    print(sf_name)

    # Load data

    #drawing shapes:
    sf = shp.Reader(sf_name)
    shapes = sf.shapes()
    ##print shapes[0].parts
    records = sf.records()
    ##ax = plt.subplot(111)
    for record, shape in zip(records,shapes):
        lons,lats = zip(*shape.points)
        data = np.array(m(lons, lats)).T

        if len(shape.parts) == 1:
            segs = [data,]
        else:
            segs = []
            for i in range(1,len(shape.parts)):
                index = shape.parts[i-1]
                index2 = shape.parts[i]

                seg = data[index:index2]
                segs.append(seg)
            segs.append(data[index2:])

        ##assuming that the longest segment is the enclosing
        ##line and ordering the segments by length:
        lens=np.array([len(s) for s in segs])
        order = lens.argsort()[::-1]
        segs = [segs[i] for i in order]

        ##producing the outlines:
        lines = LineCollection(segs,antialiaseds=(1,),zorder=4)

        ##note: leaving the facecolors out:
        ##lines.set_facecolors('#abc0d3')
        lines.set_edgecolors('red')
        lines.set_linewidth(0.5)
        ax.add_collection(lines)

        ##producing a path from the line segments:
        segs_lin = [v for s in segs for v in s]
        codes = [
            [Path.MOVETO]+
            [Path.LINETO for p in s[1:]]
        for s in segs]

        codes_lin = [c for s in codes for c in s]
        path = Path(segs_lin, codes_lin)

        ##patch = PathPatch(path, facecolor="#abc0d3", lw=0, zorder = 3)
        patch = PathPatch(path, facecolor=color, lw=0, zorder = 3)
        ax.add_patch(patch)



plt.axis('off')
fig.savefig("shapefiles.png",bbox_inches='tight',pad_inches=0)