Matplotlib contourf contour畫(huà)圖實(shí)例(包含高斯濾波)
????最近被要求復(fù)現(xiàn)圖片

要求做到海面區(qū)域,完全一致。因?yàn)閷?duì)于matplotlib使用不夠熟練導(dǎo)致我在復(fù)現(xiàn)過(guò)程中遇到了好幾個(gè)問(wèn)題。
使用地圖投影并不能達(dá)到圖片所示效果
????無(wú)論我使用使用地圖投影,或者使用PlateCarree還是Lambert投影,都不能達(dá)到圖片中的效果,最后我使用了PlateCarree投影,并在圖片生成后對(duì)圖片進(jìn)行拉伸,才接近圖片效果。
colorbar不能完全復(fù)現(xiàn)
????我用了matplotlib自帶的colormap但是不能達(dá)到圖片效果,我也想過(guò)用matplotlib自帶的生成漸變colormap的函數(shù),但是效果也很差,最后我想了一個(gè)笨辦法,就是一個(gè)一個(gè)顏色地讀取然后自己創(chuàng)建一個(gè)色卡,我用到了蘋(píng)果自帶的功能,應(yīng)該很多軟件都有類(lèi)似功能。使用讀取出來(lái)的sRGB即可。


然后就解決了色卡的問(wèn)題
contour曲線過(guò)于粗糙

????我也嘗試了很多方法,比如說(shuō)每隔4個(gè)點(diǎn)讀取數(shù)據(jù),或者用線性插值等插值方法,將數(shù)據(jù)插值到更大的網(wǎng)格上去,但是收效甚微,最后發(fā)現(xiàn)可以使用高斯濾波的函數(shù)。下面直接放上成果圖,因?yàn)槲也粫?huì)ps所以圖片還是相差很多,如果有兄弟有更好的完善方法,可以dd我。

濾波函數(shù)使用方法:
from scipy.ndimage.filters import gaussian_filter
Arr_z = gaussian_filter(Arr_z, 1) ?# 高斯濾波
這是具體的高斯濾波:(21條消息) gaussian_filter( )函數(shù)(高斯濾波)_方如一的博客-CSDN博客
https://blog.csdn.net/Fwuyi/article/details/123585403
我把代碼放在最后,import中可能很多都沒(méi)有調(diào)用到,是我之前放的,懶得改了。
# 數(shù)據(jù)處理部分
import numpy as np
from numpy.linalg import solve # ?用來(lái)解方程
import pandas as pd
import xarray as xr
import datetime as dt
import scipy
from scipy.io import loadmat ?# 讀取m文件
from scipy.stats import linregress ?# 進(jìn)行回歸分析
from sklearn import linear_model
clf = linear_model.LinearRegression()
# import cfgrib
from scipy.optimize import curve_fit
from eofs.standard import Eof
import datetime as dt
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from matplotlib import colors
import matplotlib as mpl
import matplotlib.patches as mpatchesimport
import matplotlib.transforms as mtransformsdef
plt.rcParams['axes.unicode_minus'] =False ?# 打開(kāi)負(fù)號(hào)
plt.rcParams['font.sans-serif'] = 'SimHei' ?# 顯示中文
import cartopy.mpl.ticker as cticker
import scipy.ndimage
from scipy.ndimage.filters import gaussian_filter
#數(shù)據(jù)處理部分
dataset = xr.open_dataset('ETOPO_2022_v1_60s_N90W180_bed.nc')
print(dataset)
print()
z = dataset.z.loc[36.27:42.3, 117.11:122.46][::4, ::4]
print(z.lon.shape, z.lat.shape)
print(np.array(z.lon.shape)[0])
lon = np.array(z.lon).reshape(np.array(z.lon.shape)[0], 1)
lat = np.array(z.lat).reshape(np.array(z.lat.shape)[0], 1)
Arr_z = np.array(z)
# Arr_z = gaussian_filter(Arr_z, 1) ?# 高斯濾波
print(Arr_z.shape, lon.shape, lat.shape)
lon, lat = np.meshgrid(lon, lat)
print(Arr_z.min(), Arr_z.max())
#畫(huà)圖部分
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] =False ?# 打開(kāi)負(fù)號(hào)
? # 創(chuàng)建色卡
# plt.rcParams.update({'figure.dpi':150})
proj = ccrs.PlateCarree(central_longitude=0)
fig = plt.figure(figsize=(14.56, 18.74))
axes = fig.add_axes([0, 0, 1, 1], projection=proj)
axes.add_feature(cfeature.COASTLINE, zorder=2, linewidth=1.5)
axes.add_feature(cfeature.LAND, zorder=1)
leftlon, rightlon, lowerlat, upperlat = (117.11,122.46,36.27,42.3)
img_extent = [leftlon, rightlon, lowerlat, upperlat]
? # 自定義色卡
cmap = mpl.cm.Blues_r
cmap1 = mpl.colors.ListedColormap(['#040A47', '#02165F', '#001651', '#042B61', '#063C88', '#1B76D7', '#207DD3', '#33ABED', '#4FBAF1', '#5EBEEB', '#81CEEA', '#97D5E9'])
bounds = [-65, -60, -55, -50, -45, -40, -35, -30, -25, -20, -15, -10, 0]
#040A47 02165F 001651 042B61 063C88 1B76D7 207DD3 33ABED 4FBAF1 5EBEEB 81CEEA 97D5E9
red_color_normal = mpl.colors.LinearSegmentedColormap.from_list('自定義的顏色名字', [(0, ? ?'#04023D'),(1, ? ?'#96CEE3')], N=256) ?# 顏色漸變
norm = mpl.colors.BoundaryNorm(bounds, cmap1.N) ?# 自定義色卡的歸一化
vmax = 0
vmin = -60
axes.contourf(lon, lat, Arr_z, norm=norm,zorder=0, cmap=cmap1, levels=bounds, extend='both')
contour = axes.contour(lon, lat, Arr_z, zorder=0, colors='#95D6F9', linestyles="-", levels=bounds, extend='none')
plt.axis('off')