1. 自定义colormap
from matplotlib import cm
from matplotlib.colors import LinearSegmentedColormap
# 定义colorbar的颜色帧
color_list = ['#0000FF', '#3333FF', '#00FF33', '#FFFF33', '#FF9900', '#FF0000', '#FF00FF', '#6600CC']
# 线性补帧,并定义自定义colormap的名字,此处为rain
my_cmap = LinearSegmentedColormap.from_list('rain', color_list)
# 注册自定义的cmap,此后可以像使用内置的colormap一样使用自定义的rain
cm.register_cmap(cmap=my_cmap)
gci = plt.imshow(data, vmin=0, vmax=10, cmap="rain") # data是你要可视化的矩阵,使用时直接使用rain这个名字
2. 自定义坐标轴形式
from matplotlib.ticker import MultipleLocator
from mpl_toolkits.axes_grid1 import make_axes_locatable
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['font.serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串
# 示例的data的shape是(514, 1028),我们想要让其坐标显示全球的经纬网效果
plt.figure(figsize=(18, 9)) # 创建画布
ax = plt.subplot(111) # 划分子图,这里只有1x1的子图
gci = ax.imshow(data, vmin=0, vmax=10, cmap="rain") # 画热力图,这里cmap用的就是自定义的rain
# ================================= 二选一即可 ==================================
# 方法一:设置主要刻度,MultipleLocator传的参数会导致该参数的整数倍都会显示刻度
ax.xaxis.set_major_locator(MultipleLocator(1028 / 12))
ax.yaxis.set_major_locator(MultipleLocator(514 / 6))
# 方法二:直接设置要显示的刻度列表
ax.xaxis.set_ticks(np.arange(0, 1029, 1028 / 12.))
ax.yaxis.set_ticks(np.arange(0, 515, 514 / 6.))
# =============================================================================
# 自定义要显示的刻度值标签,替代实际刻度值
ax.set_xticklabels([-180, -150, -120, -90, -60, -30, 0, 30, 60, 90, 120, 150, 180])
ax.set_yticklabels([-90, -60, -30, 0, 30, 60, 90])
# 设置要显示的坐标轴的位置
ax.xaxis.set_ticks_position("top")
ax.yaxis.set_ticks_position("left")
# =============================== 设置刻度样式 ==================================
for ticklabel in ax.xaxis.get_ticklabels():
ticklabel.set_fontfamily("Times New Roman")
ticklabel.set_fontweight("bold")
ticklabel.set_fontsize(10)
for ticklabel in ax.yaxis.get_ticklabels():
ticklabel.set_fontfamily("Times New Roman")
ticklabel.set_fontweight("bold")
ticklabel.set_fontsize(10)
# 显示网格
# which: 显示什么刻度,major表示主刻度,minor表示副刻度,both表示都显示
# axis: 显示哪一个轴的网格线,both表示全部显示,x表示只显示x轴网格线,y表示只显示y轴网格线
plt.grid(which="major", axis="both", linestyle="-", color="black")
divider = make_axes_locatable(ax) # 指定要显示哪个子图的colorbar
cax = divider.append_axes("bottom", size="5%", pad=0.2) # size表示colorbar宽度,pad表示colorbar距离axes的距离
cbar = plt.colorbar(gci, ax=ax, cax=cax, orientation='horizontal')
cbar.set_ticks([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# 设置colorbar相关的字体格式
font = {
"family": "times new roman",
"color": "darkred",
"style": 'italic',
"weight": "bold",
"size": "16",
}
cbar.set_label(r'$rain(mm\cdot h^{-1})$', fontdict=font)
# 设置图形的标题,注意,这里是suptitle,表示全部子图的标题,colorbar也是一个子图,所以直接plt.title()显示的是colorbar的标题
plt.suptitle("Global Precipitation on 2020-06-29", family="times new roman",
size=24, weight="bold", style="italic",color="blue",
verticalalignment="center", # 水平对齐方式
horizontalalignment="center", # 垂直对齐方式
y=0.95)
plt.show()
最终,画出来的图的效果为: