失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > python 等值线_绘图系列(1):利用matplotlib绘制等值线图

python 等值线_绘图系列(1):利用matplotlib绘制等值线图

时间:2022-07-23 16:51:49

相关推荐

python 等值线_绘图系列(1):利用matplotlib绘制等值线图

绘图系列是为了给出一些图形绘制示例,便于快速绘制一些图形。此系列不受所用语言和工具的限制,可能会使用 python,matlab,ncl,idl以及其它一些语言或是工具。

就以python来开篇,利用python中的matplotlib可视化库来绘制等值线图,并自定义colorbar。

关于 Basemap 的使用可以查看以前的文章,比如Basemap系列教程:自定义colormap,也可以在菜单中查看系列-Basemap。

# 先导入所需库

import numpy.ma as nm

import matplotlib.pyplot as plt

from matplotlib import cm, colors

from mpl_toolkits.basemap import Basemap

from pyhdf.SD import SD

hdf = SD('LISOTD_LRMTS_V2.3..hdf')

# 获取数据

data = hdf.select('LRMTS_COM_FR').get()

lat = hdf.select('Latitude').get()

lon = hdf.select('Longitude').get()

datas = np.sum(data, axis = 2) # 求和

mask_datas = nm.masked_values(datas, 0) # 掩膜 datas 中等于 0 的值

# 自定义 colormap

cmp = ['#A8A8A8', '#812089', '#A817B0', '#F098EF', '#010090',

'#6868C8', '#C8C8E0', '#1FA021', '#70D06F', '#B0F1B1',

'#DFE000', '#E89008', '#C78121', '#C0712F', '#D00000',

'#A00000', '#383838', '#A8A8A8']

cmaps = colors.ListedColormap(cmp)

# 设置不等间距 colorbar

levels = [0, 0.1, 0.2, 0.4, 0.6, 0.8, 1.0, 2.0, 4.0, 6.0, 8.0, 10.0, 15.0, 20.0, 25.0, 30.0, 35.0, 40.0]

norm = colors.BoundaryNorm(levels, cmaps.N)

# 绘图

fig,ax = plt.subplots()

m = Basemap(projection='mill',\

rsphere=6371200.,resolution='l',area_thresh=10000)

m.drawcoastlines() # 绘制海岸线

m.drawstates() # 绘制美国州界

m.drawcountries() # 绘制国界

# 绘制纬度线

parallels = np.arange(-90.,91,10.)

m.drawparallels(parallels,labels=[1,0,0,0],fontsize=10)

# 绘制经度线

meridians = np.arange(-180.,181.,30.)

m.drawmeridians(meridians,labels=[0,0,0,1],fontsize=10)

# 网格化经纬度,并进行投影转换坐标

lons, lats = np.meshgrid(lon, lat)

x, y = m(lons, lats)

# 绘制等值线

con = m.contourf(x, y, mask_datas, cmap = cmaps, norm = norm, levels = levels, spacing = 'uniform')

# 添加标题

ax.set_title('Flash Density')

cax = m.colorbar(con, cmap = cmaps, ax = ax, spacing = 'uniform')

cax.set_ticks(levels)

cax.ax.tick_params(direction = 'in')

cax.set_label('flash density (fl/km^2)')

plt.show()

注意:

设置不等间距 colorbar 的时候,要注意 contourf 的 norm, spacing 等参数,以及 colorbar 的参数设置,否则不会生效,或者生效了但是 colorbar 的 colormap 显示不正常。

上述方式除了绘制等值线图之外还添加了地图信息,如果不想添加地图信息的话,可以不导入 Basemap:

import numpy.ma as nm

import matplotlib.pyplot as plt

from matplotlib import cm, colors

from pyhdf.SD import SD

hdf = SD('LISOTD_LRMTS_V2.3..hdf')

data = hdf.select('LRMTS_COM_FR').get()

lat = hdf.select('Latitude').get()

lon = hdf.select('Longitude').get()

datas = np.sum(data, axis = 2)

mask_datas = nm.masked_values(datas, 0) # 掩膜 datas 中等于 0 的值

cmp = ['#A8A8A8', '#812089', '#A817B0', '#F098EF', '#010090',

'#6868C8', '#C8C8E0', '#1FA021', '#70D06F', '#B0F1B1',

'#DFE000', '#E89008', '#C78121', '#C0712F', '#D00000',

'#A00000', '#383838', '#A8A8A8']

cmaps = colors.ListedColormap(cmp)

levels = [0, 0.1, 0.2, 0.4, 0.6, 0.8, 1.0, 2.0, 4.0, 6.0, 8.0, 10.0, 15.0, 20.0, 25.0, 30.0, 35.0, 40.0]

norm = colors.BoundaryNorm(levels, cmaps.N)

fig,ax = plt.subplots()

con = ax.contourf(lon, lat, mask_datas, cmap = cmaps, norm = norm, levels = levels, spacing = 'uniform')

ax.set_xlabel('longitude', fontdict = dict(fontsize = 14))

ax.set_ylabel('latitude', fontdict = dict(fontsize = 14))

ax.set_title('Flash Density')

cax = fig.colorbar(con, cmap = cmaps, ax = ax, spacing = 'uniform')

cax.set_ticks(levels)

cax.ax.tick_params(direction = 'in')

cax.set_label('flash density (fl/km^2)')

plt.show()

注1:链接: /s/1ctYglK 密码: thvp

如果觉得《python 等值线_绘图系列(1):利用matplotlib绘制等值线图》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。