python叠加图像轮廓_python – 如何将我的轮廓图叠加在底图上

你几乎就在那里,但Basemap可能很有气质,你必须管理图表/地图细节的z顺序.此外,在使用底图绘制它们之前,必须将lon / lat坐标转换为地图投影坐标.

这是一个完整的解决方案,它提供以下输出.我改变了一些颜色和线宽,以使整个事物更清晰,YMMV.我还通过标准化的“均值”值(数据[‘Z’])缩放散点的大小 – 你可以简单地删除它并替换例如50,如果你喜欢一个恒定的大小(它看起来像最大的标记).

如果可能的话,还请详细说明降雨量的单位和测量的持续时间:

import numpy as np

import pandas as pd

from matplotlib.mlab import griddata

from mpl_toolkits.basemap import Basemap

import matplotlib.pyplot as plt

from matplotlib.colors import Normalize

%matplotlib inline

# set up plot

plt.clf()

fig = plt.figure(figsize=(10, 8))

ax = fig.add_subplot(111, axisbg='w', frame_on=False)

# grab data

data = pd.read_csv('../../data/meansr.txt', delim_whitespace=True)

norm = Normalize()

# define map extent

lllon = 21

lllat = -18

urlon = 34

urlat = -8

# Set up Basemap instance

m = Basemap(

projection = 'merc',

llcrnrlon = lllon, llcrnrlat = lllat, urcrnrlon = urlon, urcrnrlat = urlat,

resolution='h')

# transform lon / lat coordinates to map projection

data['projected_lon'], data['projected_lat'] = m(*(data.Lon.values, data.Lat.values))

# grid data

numcols, numrows = 1000, 1000

xi = np.linspace(data['projected_lon'].min(), data['projected_lon'].max(), numcols)

yi = np.linspace(data['projected_lat'].min(), data['projected_lat'].max(), numrows)

xi, yi = np.meshgrid(xi, yi)

# interpolate

x, y, z = data['projected_lon'].values, data['projected_lat'].values, data.Z.values

zi = griddata(x, y, z, xi, yi)

# draw map details

m.drawmapboundary(fill_color = 'white')

m.fillcontinents(color='#C0C0C0', lake_color='#7093DB')

m.drawcountries(

linewidth=.75, linestyle='solid', color='#000073',

antialiased=True,

ax=ax, zorder=3)

m.drawparallels(

np.arange(lllat, urlat, 2.),

color = 'black', linewidth = 0.5,

labels=[True, False, False, False])

m.drawmeridians(

np.arange(lllon, urlon, 2.),

color = '0.25', linewidth = 0.5,

labels=[False, False, False, True])

# contour plot

con = m.contourf(xi, yi, zi, zorder=4, alpha=0.6, cmap='RdPu')

# scatter plot

m.scatter(

data['projected_lon'],

data['projected_lat'],

color='#545454',

edgecolor='#ffffff',

alpha=.75,

s=50 * norm(data['Z']),

cmap='RdPu',

ax=ax,

vmin=zi.min(), vmax=zi.max(), zorder=4)

# add colour bar and title

# add colour bar, title, and scale

cbar = plt.colorbar(conf, orientation='horizontal', fraction=.057, pad=0.05)

cbar.set_label("Mean Rainfall - mm")

m.drawmapscale(

24., -9., 28., -13,

100,

units='km', fontsize=10,

yoffset=None,

barstyle='fancy', labelstyle='simple',

fillcolor1='w', fillcolor2='#000000',

fontcolor='#000000',

zorder=5)

plt.title("Mean Rainfall")

plt.savefig("rainfall.png", format="png", dpi=300, transparent=True)

plt.show()

使用matplotlib的griddata方法很方便,但也可能很慢.作为替代方案,您可以使用scipy的griddata方法,这些方法更快,更灵活:

from scipy.interpolate import griddata as gd

zi = gd(

(data[['projected_lon', 'projected_lat']]),

data.Z.values,

(xi, yi),

method='linear')

如果你使用scipy的griddata方法,你还必须确定哪种方法(最近的,线性的,立方的)给出了最好的结果图.

我要补充一点,上面演示和讨论的插值方法是最简单的,并不一定适用于降雨数据的插值. This article很好地概述了用于水文和水文模拟的有效方法和考虑因素.这些(可能使用Scipy)的实现留作练习& c.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值