如何在背景图像上绘制带对数刻度的曲线图?
解决对数刻度轴上背景图像拉伸问题
问题原因
你代码里用twinx()创建了共享x轴但y轴为线性的副轴,背景图像绘制在这个线性y轴的轴上,而主轴是对数y轴,两者的坐标映射逻辑完全不同,导致图像被错误拉伸。
解决方案
移除双轴,直接在同一个对数刻度轴上绘制背景图像和曲线,让图像的坐标范围匹配对数轴的映射:
import numpy as np import matplotlib.pyplot as plt x = np.random.uniform(low=0, high=10**6, size=(100,)) y = np.random.uniform(low=10**(-14), high=10**(-10), size=(100,)) x.sort() y.sort() img = plt.imread("quiverplot.png") fig, ax = plt.subplots() # 先绘制背景图像,zorder设为0确保在底层 ax.imshow(img, zorder=0, extent=[x.min(), x.max(), y.min(), y.max()], aspect='auto', origin='lower') # 绘制曲线,zorder设为1确保在图像上方 ax.plot(x, y, zorder=1) # 设置对数刻度 ax.set_xscale('log') ax.set_yscale('log') fig.tight_layout() plt.show()
关键改动说明
- 移除
twinx()创建的副轴,避免线性轴和对数轴的坐标冲突 - 先绘制背景图像再绘制曲线,通过
zorder控制图层顺序 - 添加
origin='lower':imshow默认以图像左上角对应数据范围的左下角,该参数修正方向,让图像与数据轴方向一致 aspect='auto':让图像自适应坐标轴的比例,避免强制等比例导致的变形
内容的提问来源于stack exchange,提问作者Samael
相关产品推荐
相关产品推荐

