Matplotlib绘图:x轴对数间距y轴线性间距及子图颜色栏布局问题
解决方案:对数轴绘图与多子图颜色栏布局问题
一、解决imshow对数轴显示异常的问题
imshow默认按均匀像素间距绘制数据,不会自动匹配对数间距的xs——仅设置ax.set_xscale('log')只会修改轴刻度样式,数据的实际绘制位置仍为均匀分布,因此出现显示异常。
修复方案:
- (推荐)继续使用
pcolormesh(比pcolor效率更高),它会直接根据xs和ys的网格映射坐标,天然支持非均匀间距。 - 若坚持使用
imshow,需手动指定extent参数并调整坐标轴刻度:import matplotlib.pyplot as plt import numpy as np # 示例数据 xs = np.logspace(0, 3, 100) # 对数间距x轴 ys = np.linspace(0, 10, 50) # 线性间距y轴 zs = np.random.rand(len(ys), len(xs)) # 网格数据 fig, ax = plt.subplots() # 设置extent定义坐标轴范围:[x最小值, x最大值, y最小值, y最大值] im = ax.imshow(zs, extent=[xs.min(), xs.max(), ys.min(), ys.max()], aspect='auto', origin='lower') ax.set_xscale('log') plt.colorbar(im) plt.show()
二、解决多子图颜色栏挤占子图空间的问题
用plt.subplots(ncols=5)创建子图时,直接给最后一个子图添加颜色栏会压缩其宽度,导致子图大小不一致,可通过以下两种方法解决:
方法1:用gridspec预留颜色栏空间
将画布分为6列,前5列放子图,最后一列专门放颜色栏,保证所有子图宽度一致:
import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec import numpy as np # 示例数据 xs = np.logspace(0, 3, 100) ys = np.linspace(0, 10, 50) zs_list = [np.random.rand(len(ys), len(xs)) for _ in range(5)] fig = plt.figure(figsize=(12, 4)) # 定义网格:1行6列,前5列宽度相同,最后一列用于颜色栏(宽度比例缩小) gs = gridspec.GridSpec(1, 6, width_ratios=[1,1,1,1,1,0.1]) # 绘制5个子图 axes = [] for i in range(5): ax = fig.add_subplot(gs[0, i]) pcm = ax.pcolormesh(xs, ys, zs_list[i], shading='auto') ax.set_xscale('log') axes.append(ax) # 在预留位置添加颜色栏 cbar_ax = fig.add_subplot(gs[0, 5]) fig.colorbar(pcm, cax=cbar_ax) plt.tight_layout() plt.show()
方法2:共享颜色栏并调整间距
如果使用共享颜色栏,可指定所有子图给fig.colorbar,通过pad参数控制颜色栏与子图的间距,避免挤压子图:
import matplotlib.pyplot as plt import numpy as np xs = np.logspace(0, 3, 100) ys = np.linspace(0, 10, 50) zs_list = [np.random.rand(len(ys), len(xs)) for _ in range(5)] fig, axes = plt.subplots(ncols=5, figsize=(12, 4)) # 第一个子图绘制并获取颜色映射对象 pcm = axes[0].pcolormesh(xs, ys, zs_list[0], shading='auto') axes[0].set_xscale('log') # 绘制其余子图 for i, ax in enumerate(axes[1:]): ax.pcolormesh(xs, ys, zs_list[i+1], shading='auto') ax.set_xscale('log') # 添加共享颜色栏,pad参数控制间距 fig.colorbar(pcm, ax=axes, pad=0.02) plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者Physics_Student
相关产品推荐
相关产品推荐

