如何重新缩放pcolormesh绘图的坐标轴优化扁平图形显示
解决pcolormesh绘图y轴扁平问题
问题背景
使用pcolormesh绘制图形时,因x轴范围(0-5)与y轴范围(0-0.002)差异极大,导致图形呈现扁平状态,原始代码及数据如下:
原始代码
fig, ax = plt.subplots() ax.pcolormesh(Omega_re, Omega_im, brightness, cmap="gray", shading="gouraud") ax.set_xlabel(r"$Re(\omega)$") ax.set_ylabel(r"$Im(\omega)$") ax.set_aspect(1) fig.show()
数据
Omega_re = array([[2. , 2.75, 3.5 , 4.25, 5. ], [2. , 2.75, 3.5 , 4.25, 5. ], [2. , 2.75, 3.5 , 4.25, 5. ], [2. , 2.75, 3.5 , 4.25, 5. ], [2. , 2.75, 3.5 , 4.25, 5. ]]) Omega_im = array([[0. , 0. , 0. , 0. , 0. ], [0.0005, 0.0005, 0.0005, 0.0005, 0.0005], [0.001 , 0.001 , 0.001 , 0.001 , 0.001 ], [0.0015, 0.0015, 0.0015, 0.0015, 0.0015], [0.002 , 0.002 , 0.002 , 0.002 , 0.002 ]]) brightness = array([[4.05649772, 3.7299948 , 2.61262439, 4.2841897 , 3.40368949], [4.05649076, 3.72997624, 2.61258381, 4.2841071 , 3.40353591], [4.05648399, 3.72995772, 2.61254052, 4.28402084, 3.40338229], [4.05647716, 3.72993901, 2.6124984 , 4.28393373, 3.40322865], [4.05647025, 3.72992049, 2.61245428, 4.2838476 , 3.40307499]])
解决方案
1. 取消固定宽高比
直接移除ax.set_aspect(1),让matplotlib自动适配轴比例,这是最简便的方法:
fig, ax = plt.subplots() ax.pcolormesh(Omega_re, Omega_im, brightness, cmap="gray", shading="gouraud") ax.set_xlabel(r"$Re(\omega)$") ax.set_ylabel(r"$Im(\omega)$") # 移除固定宽高比设置 fig.show()
2. 设置自定义宽高比
手动指定合适的aspect值,放大y轴的视觉占比:
fig, ax = plt.subplots() ax.pcolormesh(Omega_re, Omega_im, brightness, cmap="gray", shading="gouraud") ax.set_xlabel(r"$Re(\omega)$") ax.set_ylabel(r"$Im(\omega)$") # 根据轴范围计算比例,让y轴视觉宽度更合理 x_range = 5 - 0 y_range = 0.002 - 0 ax.set_aspect(x_range / y_range * 0.1) # 0.1为调整系数,可按需修改 fig.show()
也可以直接设置经验值,比如ax.set_aspect(100),快速放大y轴显示。
3. 调整图形整体尺寸
创建子图时指定更大的高度,给y轴更多展示空间:
# 设置宽8、高6的画布,尺寸可按需调整 fig, ax = plt.subplots(figsize=(8, 6)) ax.pcolormesh(Omega_re, Omega_im, brightness, cmap="gray", shading="gouraud") ax.set_xlabel(r"$Re(\omega)$") ax.set_ylabel(r"$Im(\omega)$") ax.set_aspect(1) fig.show()
4. 缩放y轴数据后修改刻度标签
将y轴数据放大后绘图,再把刻度改回原始值,实现视觉上的y轴放大:
fig, ax = plt.subplots() # 将y轴数据放大1000倍后绘图 ax.pcolormesh(Omega_re, Omega_im * 1000, brightness, cmap="gray", shading="gouraud") ax.set_xlabel(r"$Re(\omega)$") ax.set_ylabel(r"$Im(\omega)$") ax.set_aspect(1) # 手动设置刻度标签为原始值 ax.set_yticks([0, 0.5, 1, 1.5, 2]) ax.set_yticklabels([0, 0.0005, 0.001, 0.0015, 0.002]) fig.show()
内容的提问来源于stack exchange,提问作者Projetos Programação
相关产品推荐
相关产品推荐

