爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 11210|回复: 3

[经验总结] python clip一定区域

[复制链接]

新浪微博达人勋

发表于 2014-8-17 15:50:49 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 lovechang1314 于 2014-8-17 21:47 编辑

前几天在查找有关python绘图能够剪切出来固定区域的方法,在论坛看到一个帖子讲用cartopy很容易实现,也讲了另外一种方法,但是我没有调试通过。
网址:http://bbs.06climate.com/forum.php?mod=viewthread&tid=24966&page=1#pid302732

今天无聊有看了一下matplotlib的文档,觉得我找到原因了,可能跟用meteoinfo得到的txt即经纬度信息有关,这个经纬度信息并不是最外围的点组成的,应该还有一些点是在最外围边界的内部,所以会出现这样的情况。
另外仅仅set_clip_path(us_path)貌似不行,总是会出错,我用另外的一个方法实现了clip:
path = Path(data)   #data就是帖子里面zip(x,y)
patch = PathPatch(path, facecolor='none')  
#print path
plt.gca().add_patch(patch)  #画出边界
cs = plt......   #绘图
cs.set_clip_path(patch)

---------------------------附带一个从matplotlib 的gallery里面随便找了一个例子,然后截取北京区域内的颜色
import matplotlib.pyplot as pltfrom matplotlib.colors import BoundaryNorm
from matplotlib.ticker import MaxNLocator
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.path import Path
from matplotlib.patches import PathPatch
# make these smaller to increase the resolution
dx, dy = 0.05, 0.05# generate 2 2d grids for the x & y bounds
y, x = np.mgrid[slice(39., 42 + dy, dy),
                slice(115., 119 + dx, dx)]
z = np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)
# x and y are bounds, so z should be the value *inside* those bounds.# Therefore, remove the last value from the z array.
z = z[:-1, :-1]levels = MaxNLocator(nbins=15).tick_values(z.min(), z.max())
# pick the desired colormap, sensible levels, and define a normalization# instance which takes data values and translates those into levels.
cmap = plt.get_cmap('PiYG')
norm = BoundaryNorm(levels, ncolors=cmap.N, clip=True)
im = plt.pcolormesh(x, y, z, cmap=cmap, norm=norm)
plt.colorbar()# set the limits of the plot to the limits of the data
plt.axis([x.min(), x.max(), y.min(), y.max()])
# read the boundary file
data = np.loadtxt(r'e:\test2\bj_boundary.txt')
path = Path(data)
patch = PathPatch(path, facecolor='none')
#print path
plt.gca().add_patch(patch)
im.set_clip_path(patch)plt.show()
结果:
未clip(1.jpg)clip后(3.jpg

这样虽然可以clip一个区域,但是还有一些疑惑的地方,大家一起讨论一下。。
我把上面程序一行patch = PathPatch(path, facecolor='none')注释掉却出现这种情况(2.jpg)。
绘图方法用contourf或者contour等绘图还没有测试,不过估计原理是一样的,应该也可以调试通过吧。有愿意试一下的可以尝试一下








1.jpg
3.jpg
2.jpg

评分

参与人数 1金钱 +14 贡献 +6 收起 理由
kongfeng0824 + 14 + 6 赞一个!

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-8-21 09:08:14 | 显示全部楼层
和那个方法道理是一样的
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-3-10 14:56:42 | 显示全部楼层
用contourf不行啊  怎么调试
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-4-4 00:26:58 | 显示全部楼层
多谢分享,向楼主学习
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表