如何使用matplotlib在图形文件中裁剪轮廓?

时间:2019-04-02 20:34:40

标签: python matplotlib

我正在做一个核仁密度图,但是我的轮廓延伸到水域。我没有太多的编码经验,但是我使用了一个形状文件来绘制“基本图”。但是,我不确定如何从形状文件创建剪切路径,以使轮廓线沿国家/地区的边缘切割。在这个问题上的任何指导将不胜感激。

我决定使用shapefile的外部边界创建一个剪切路径。 但是,当我将set_clip_path函数应用于轮廓集合时,多边形边界的内部被剪切掉了。 这是我使用的代码的要点。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.path as mpath
import matplotlib.patches as mpatches
import shapefile as shp

lon_lat_box = (-61.979370, -60.444031, 9.974261, 11.375031)

fig = plt.figure(figsize=(15,15))
ax1 = fig.add_subplot(1,1,1)

Path = mpath.Path

#read shape file
sfile = shp.Reader("./tto_adm0/TTO_adm0.shp")

#make clip path
for shape_rec in sfile.shapeRecords():
    vertices = []
    codes = []
    pts = shape_rec.shape.points
    prt = list(shape_rec.shape.parts) + [len(pts)]
    for i in range(len(prt) - 1):
        for j in range(prt[i], prt[i+1]):
            vertices.append((pts[j][0], pts[j][1]))
        codes += [Path.MOVETO]
        codes += [Path.LINETO] * (prt[i+1] - prt[i] -2)
        codes += [Path.CLOSEPOLY]
    clip = mpath.Path(vertices, codes)
    clip = mpatches.PathPatch(clip, facecolor = 'white')

#plot    
ax1.add_patch(clip)
plt.xlim(lon_lat_box[0],lon_lat_box[1])
plt.ylim(lon_lat_box[2],lon_lat_box[3])

plot_map(shape_ex)
ax1.contourf(xx, yy, Z, cut, cmap="jet", alpha=0.3)
contour = ax1.contourf(xx, yy, Z, cut, cmap="jet", alpha=0.3)
C = plt.contourf(xx, yy, Z, cut, cmap="jet", alpha=0.3)
plt.colorbar(C)
for c in contour.collections:
    c.set_clip_path(clip)    

fig.savefig(pdf_name)
fig.show()

Here is what the output looks like right now

更新: 我意识到“ ax1.add_patch(clip)”行仅掩盖了国家边界内的所有轮廓填充,因为我将面部颜色设置为白色。 这意味着轮廓仍然没有使用我创建的面片进行裁剪,我也不知道为什么。

如果我删除了“ ax1.add_patch(clip)”这一行,结果看起来像this

更新2: 有了ImportanceOfBeingErnest的建议,我得以解决问题并获得the desired output 对我的代码进行了以下调整:

contour = ax1.contourf(xx, yy, Z, cut, cmap="jet", alpha=0.3)
plt.colorbar(contour)
for c in contour.collections:
c.set_clip_path(clip)   

0 个答案:

没有答案