ax = fig.add_axes([0.1, 0.1, 0.5, 0.4],projection=ccrs.PlateCarree())
时间: 2024-02-16 10:02:26 浏览: 18
这是使用Matplotlib绘制地图时的一行代码。其中,fig是指代表整个图形的Figure对象,add_axes()方法用于在Figure对象上添加一个Axes对象,[0.1, 0.1, 0.5, 0.4]参数表示Axes对象的左下角位置及宽度和高度,projection参数则表示使用的地图投影方式,这里使用的是ccrs模块中的PlateCarree投影方式,它是经纬度坐标系,可以用于绘制全球地图。
相关问题
优化这个代码import xarray as xr import netCDF4 as nc import pandas as pd import numpy as np import datetime import matplotlib.pyplot as plt import cartopy.mpl.ticker as cticker import cartopy.crs as ccrs import cartopy.feature as cfeature ds = xr.open_dataset('C:/Users/cindy/Desktop/SP.nc', engine='netcdf4') # 读取原始数据 ds_temp = xr.open_dataset('C:/Users/cindy/Desktop/SP.nc') # 区域提取* south_asia = ds_temp.sel(latitude=slice(38, 28), longitude=slice(75, 103)) indian_ocean = ds_temp.sel(latitude=slice(5, -15), longitude=slice(60, 100)) # 高度插值 south_asia_200hpa = south_asia.t.interp(level=200) indian_ocean_200hpa = indian_ocean.t.interp(level=200) south_asia_400hpa = south_asia.t.interp(level=400) indian_ocean_400hpa = indian_ocean.t.interp(level=400) # 区域平均 TTP = south_asia_400hpa.mean(dim=('latitude', 'longitude'))#.values TTIO = indian_ocean_400hpa.mean(dim=('latitude', 'longitude'))# TTP_200hpa = south_asia_200hpa.mean(dim=('latitude', 'longitude')) TTIO_200hpa = indian_ocean_200hpa.mean(dim=('latitude', 'longitude')) tlup=(TTP-TTIO)-(TTP_200hpa-TTIO_200hpa)-(-5.367655815) # 定义画图区域和投影方式 fig = plt.figure(figsize=[10, 8]) ax = plt.axes(projection=ccrs.PlateCarree()) # 添加地图特征 ax.set_extent([60, 140, -15, 60], crs=ccrs.PlateCarree()) ax.add_feature(cfeature.COASTLINE.with_scale('50m'), linewidths=0.5) ax.add_feature(cfeature.LAND.with_scale('50m'), facecolor='lightgray') ax.add_feature(cfeature.OCEAN.with_scale('50m'), facecolor='white') # 画距平场 im = ax.contourf(TTP_200hpa, TTP, tlup, cmap='coolwarm', levels=np.arange(-4, 4.5, 0.5), extend='both') # 添加色标 cbar = plt.colorbar(im, ax=ax, shrink=0.8) cbar.set_label('Temperature anomaly (°C)') # 添加经纬度坐标轴标签 ax.set_xticks(np.arange(60, 105, 10), crs=ccrs.PlateCarree()) ax.set_yticks(np.arange(-10, 40, 10), crs=ccrs.PlateCarree()) lon_formatter = cticker.LongitudeFormatter() lat_formatter = cticker.LatitudeFormatter() ax.xaxis.set_major_formatter(lon_formatter) ax.yaxis.set_major_formatter(lat_formatter) # 添加标题和保存图片 plt.title('Temperature anomaly at 400hPa over South Asia and the Indian Ocean') plt.savefig('temperature_anomaly.png', dpi=300) plt.show()
1. 首先,可以将多个导入语句合并为一行,以提高代码的可读性。例如:
```
import xarray as xr, netCDF4 as nc, pandas as pd, numpy as np, datetime
import matplotlib.pyplot as plt
import cartopy.mpl.ticker as cticker, cartopy.crs as ccrs, cartopy.feature as cfeature
```
2. 可以在代码中删除不必要的变量,例如 `ds` 和 `ds_temp` 都是指向同一个文件的数据集,因此只需要保留一个即可。
3. 对于数据集的区域提取和高度插值操作,可以将它们合并成一个链式操作,以减少代码行数。例如:
```
south_asia = ds.sel(latitude=slice(38, 28), longitude=slice(75, 103)).t.interp(level=200)
indian_ocean = ds.sel(latitude=slice(5, -15), longitude=slice(60, 100)).t.interp(level=200)
```
4. 对于计算平均值的操作,可以使用 `reduce` 函数,以减少代码行数。例如:
```
TTP, TTIO = np.array([south_asia_400hpa, indian_ocean_400hpa]).reduce(lambda x, y: x.mean(dim=('latitude', 'longitude')), axis=0)
TTIO_200hpa = indian_ocean_200hpa.mean(dim=('latitude', 'longitude'))
```
5. 可以将一些常量定义为全局变量或者类变量,以方便后续使用。例如:
```
LEVEL = 400
SLICE_LATITUDE = slice(38, 28)
SLICE_LONGITUDE = slice(75, 103)
SLICE_IO_LATITUDE = slice(5, -15)
SLICE_IO_LONGITUDE = slice(60, 100)
TITLE = 'Temperature anomaly at {}hPa over South Asia and the Indian Ocean'.format(LEVEL)
```
6. 可以将绘图的代码封装为一个函数,以提高代码的可读性和复用性。例如:
```
def plot_temperature_anomaly(TTP, TTIO, TTP_200hpa, TTIO_200hpa, tlup):
fig = plt.figure(figsize=[10, 8])
ax = plt.axes(projection=ccrs.PlateCarree())
ax.set_extent([60, 140, -15, 60], crs=ccrs.PlateCarree())
ax.add_feature(cfeature.COASTLINE.with_scale('50m'), linewidths=0.5)
ax.add_feature(cfeature.LAND.with_scale('50m'), facecolor='lightgray')
ax.add_feature(cfeature.OCEAN.with_scale('50m'), facecolor='white')
im = ax.contourf(TTP_200hpa, TTP, tlup, cmap='coolwarm', levels=np.arange(-4, 4.5, 0.5), extend='both')
cbar = plt.colorbar(im, ax=ax, shrink=0.8)
cbar.set_label('Temperature anomaly (°C)')
ax.set_xticks(np.arange(60, 105, 10), crs=ccrs.PlateCarree())
ax.set_yticks(np.arange(-10, 40, 10), crs=ccrs.PlateCarree())
lon_formatter = cticker.LongitudeFormatter()
lat_formatter = cticker.LatitudeFormatter()
ax.xaxis.set_major_formatter(lon_formatter)
ax.yaxis.set_major_formatter(lat_formatter)
plt.title(TITLE)
plt.savefig('temperature_anomaly.png', dpi=300)
plt.show()
```
7. 最后,可以将所有操作封装为一个函数,以方便调用。例如:
```
def calculate_and_plot_temperature_anomaly(filename):
ds = xr.open_dataset(filename)
south_asia = ds.sel(latitude=SLICE_LATITUDE, longitude=SLICE_LONGITUDE).t.interp(level=LEVEL)
indian_ocean = ds.sel(latitude=SLICE_IO_LATITUDE, longitude=SLICE_IO_LONGITUDE).t.interp(level=LEVEL)
south_asia_200hpa = south_asia.t.interp(level=200)
indian_ocean_200hpa = indian_ocean.t.interp(level=200)
TTP, TTIO = np.array([south_asia, indian_ocean]).reduce(lambda x, y: x.mean(dim=('latitude', 'longitude')), axis=0)
TTP_200hpa = south_asia_200hpa.mean(dim=('latitude', 'longitude'))
TTIO_200hpa = indian_ocean_200hpa.mean(dim=('latitude', 'longitude'))
tlup=(TTP-TTIO)-(TTP_200hpa-TTIO_200hpa)-(-5.367655815)
plot_temperature_anomaly(TTP, TTIO, TTP_200hpa, TTIO_200hpa, tlup)
```
这样,我们就可以通过调用 `calculate_and_plot_temperature_anomaly(filename)` 函数来计算和绘制温度距平图了。
proj = ccrs.PlateCarree() fig = plt.figure(figsize=(5.5, 5), dpi=600) # 创建画布 ax = fig.add_subplot(221, projection = proj) extent = [114.5, 123, 27, 36] shp_path = "e:/z/ozone/2023年省级/2023年初省级矢量.shp" shp_reader = Reader(shp_path) ax = plt.axes(projection=ccrs.PlateCarree()) ax.add_feature(cfeature.OCEAN, fc='white', zorder=2) ax.add_geometries(shp_reader.geometries(), fc="None", ec="k", lw=0.8, crs=proj, zorder=2) ax.set_xticks(np.arange(extent[0]+0.5, extent[1]+1, 2)) ax.set_yticks(np.arange(extent[2], extent[3]+1, 2)) ax.xaxis.set_major_formatter(LongitudeFormatter()) ax.yaxis.set_major_formatter(LatitudeFormatter()) ax.set_extent(extent, proj) #ax.set_title(labels,loc="left",fontsize=12,pad=1) cf = ax.contourf(grid_x, grid_y, grid_data, cmap=plt.cm.RdBu_r, extend="both", levels=np.arange(10, 190, 10)) cb = fig.colorbar(cf, shrink=1.5, pad=0.08, fraction=0.04, ax=ax) q = ax.quiver(lon_w[::2], lat_w[::2], u10_mean[::2, ::2], v10_mean[::2, ::2], color="k", width=0.005, scale=50, zorder=3) ax.quiverkey(q, 0.88, 0.85, U=5, angle=0, label="5 m/s", labelpos="E", color="k", labelcolor="k", coordinates='figure') #------------------------plot----------------------- plt.subplots_adjust(left=0.15,right=0.85,top=0.8,bottom=0.2,wspace=0.15,hspace=0.2) q1,cf1=plot(ssl,ax[0][0],'2023-03-08') plt.show()
根据你提供的代码,你创建了一个名为`fig`的画布,并添加了一个子图`ax`。然后,你设置了子图的投影为`ccrs.PlateCarree()`,并定义了一个范围`extent`。
接下来,你添加了海洋特征和矢量图层到子图中,并设置了x轴和y轴的刻度和格式。然后,你使用`ax.contourf()`绘制了等值填充图,并添加了一个颜色条`cb`。你还使用`ax.quiver()`绘制了矢量场图,并添加了一个矢量场图例。
最后,你使用`plt.subplots_adjust()`函数调整了子图的布局参数,并调用了一个名为`plot()`的函数,并将返回的结果分配给了`q1`和`cf1`两个变量。
请注意,根据你之前的问题,我无法确定`plot()`函数的具体实现和返回值。请确保在使用`plot()`函数之前已经定义了该函数,并且你正确地传递了所需的参数。
如果你遇到任何错误或需要进一步帮助,请提供更多上下文或相关代码,这样我就能够更准确地指导你解决问题。