[Python Ocean Topic 8] Cartopy adjusts the number of contourf filling intervals for drawing topographic and bathymetric maps

[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