『Python』matplotlib自定义colormap与ticklabel

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()

最终,画出来的图的效果为:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值