[Python Ocean Topic 8] Cartopy adjusts the number of contourf filling intervals for drawing topographic and bathymetric maps
article
Sometimes I want to make the contourf picture more detailed.
At this time, it is necessary to increase the number of filling intervals
Contents of this issue
1: The number of fillings in contourf changes
cf = ax.contourf(lon, lat, ele[:, :], levels=np.linspace(-9000,0,60),extend='both',cmap=cmap_r1, transform=ccrs.PlateCarree( ))
levels=np.linspace(-9000,0,60): Just adjust it to 60. The larger the number, the more lines are drawn. The more natural coloring you get.
question:
After the color filling becomes denser, the colorbar settings will also change accordingly.
solve
Fixed colorbar scale:
cb = plt.colorbar(cf, ax=ax, extend='both', orientation='vertical',ticks=np.linspace(-9000, 0, 10))
[Python Ocean Topic 1] View the attributes of the data nc file and output the attributes to the txt file
[Python Ocean Topic 2] Read the water depth nc file and read the water depth topographic map
[Python Ocean Topic 3] Image modification canvas and coordinate axes
[Python Ocean Topic 4] Depth Map Image Modification
[Python Ocean Topic 5] Water Depth Topography Map Coastal Filling
[Python Ocean Topic 6] Cartopy draws terrain and water depth maps
[python ocean topic] test data
[Python Ocean Topic 7] Cartopy draws land filling of topographic and bathymetric maps
References and their role in this article
1: Matplotlib series: colorbar settings-CSDN Blog
Full text code
1:# -*- coding: utf-8 -*- # %% # Importing related function packages import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as feature import numpy as np import matplotlib.ticker as ticker from cartopy import mpl from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER from matplotlib.font_manager import FontProperties from netCDF4 import Dataset from palettable.cmocean.diverging import Delta_4 from palettable.colorbrewer.sequential import GnBu_9 from paletable.colorbrewer.sequential import Blues_9 from paletable.scientific.diverging import Roma_20 from pylab import * def reverse_colourmap(cmap, name='my_cmap_r'): reverse = [] k = [] for key in cmap._segmentdata: k.append(key) channel = cmap._segmentdata[key] data = [] for t in channel: data.append((1 - t[0], t[2], t[1])) reverse.append(sorted(data)) LinearL = dict(zip(k, reverse)) my_cmap_r = mpl.colors.LinearSegmentedColormap(name, LinearL) return my_cmap_r cmap = Blues_9.mpl_colormap cmap_r = reverse_colourmap(cmap) cmap1 = GnBu_9.mpl_colormap cmap_r1 = reverse_colourmap(cmap1) cmap2 = Roma_20.mpl_colormap cmap_r2 = reverse_colourmap(cmap2) # read data a = Dataset('D:\pycharm_work\data\scs_etopo.nc') print(a) lon = a.variables['lon'][:] lat = a.variables['lat'][:] ele = a.variables['elevation'][:] # ele[ele > 0] = 0 # plot # Picture 3 #Set map global properties scale = '50m' plt.rcParams['font.sans-serif'] = ['Times New Roman'] # Set the overall font to Times New Roman fig = plt.figure(dpi=300, figsize=(3, 2), facecolor='w', edgecolor='blue')#Set a drawing board and return it to fig ax = fig.add_axes([0.05, 0.08, 0.92, 0.8], projection=ccrs.PlateCarree(central_longitude=180)) ax.set_extent([105, 125, 0, 25], crs=ccrs.PlateCarree())# Set the display range land = feature.NaturalEarthFeature('physical', 'land', scale, edgecolor='face', facecolor=feature.COLORS['land']) ax.add_feature(land, facecolor='0.6') ax.add_feature(feature.COASTLINE.with_scale('50m'), lw=0.4)#Add coastline: keyword lw sets line width; linestyle sets line style cf = ax.contourf(lon, lat, ele[:, :], levels=np.linspace(-9000,0,6),extend='both',cmap=cmap_r1, transform=ccrs.PlateCarree()) # ------colorbar settings cb = plt.colorbar(cf, ax=ax, extend='both', orientation='vertical',ticks=np.linspace(-9000, 0, 10)) cb.set_label('depth', fontsize=4, color='k')#Set the colorbar label font and size cb.ax.tick_params(labelsize=4, direction='in') #Set the colorbar tick font size. #Add title ax.set_title('Etopo', fontsize=4) # Use Formatter to format tick labels ax.set_xticks(np.arange(107, 125, 4), crs=ccrs.PlateCarree())#Add latitude and longitude ax.set_xticklabels(np.arange(107, 125, 4), fontsize=4) ax.set_yticks(np.arange(0, 25, 2), crs=ccrs.PlateCarree()) ax.set_yticklabels(np.arange(0, 25, 2), fontsize=4) ax.xaxis.set_major_formatter(LongitudeFormatter()) ax.yaxis.set_major_formatter(LatitudeFormatter()) ax.tick_params(color='k', direction='in')#Change the tick pointing inwards and set the color to blue gl = ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=False, xlocs=np.arange(107, 125, 4), ylocs=np.arange(0, 25, 2), linewidth=0.25, linestyle='--', color='k', alpha=0.8)#Add grid lines gl.top_labels, gl.bottom_labels, gl.right_labels, gl.left_labels = False, False, False, False plt.savefig('scs_elevation20.jpg', dpi=600, bbox_inches='tight', pad_inches=0.1) # Output the map and set the border margin to be tight plt.show() picture