matplotlib 如何在背景图像上绘制具有对数刻度的图形?

hgqdbh6s  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(129)

我想在背景图像上绘制一条x轴和y轴为对数刻度的曲线。然而,当我试图这样做时,图像被对数刻度拉伸。我得到this figure
这是我写的代码。

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

xm = len(x) 
ym = len(y)

img = plt.imread("quiverplot.png")

fig, ax2 = plt.subplots() 
plt.plot(x, y) 
ax2.set_xscale('log')
ax2.set_yscale('log')

ax1 = ax2.twinx()

img = ax1.imshow(img, zorder=0, extent=[x[0], x[xm-1], y[0], y[ym-1]], aspect='auto')

fig.tight_layout() 
plt.show()

谢谢你给予我的任何建议。

dvtswwa3

dvtswwa31#

不要使用twinx(),而是使用matplotlib.pyplot.axes()创建一个新轴。您可以像这样控制框架(背景)、x/y轴和z顺序。

fig, ax2 = plt.subplots()
ax2.plot(x, y) 
ax2.set_xscale('log')
ax2.set_yscale('log')
ax2.set_frame_on(False)
ax2.zorder = 1

ax1 = plt.axes(ax2.get_position(True))
ax1.set_frame_on(False)
ax1.set_axis_off()
ax1.imshow(img, extent=[x[0], x[xm-1], y[0], y[ym-1]], aspect='auto')
...

如果您像这样更改绘图顺序,将会更简单。

fig, ax2 = plt.subplots() 
ax2.imshow(img, extent=[x[0], x[xm-1], y[0], y[ym-1]], aspect='auto')
ax2.set_axis_off()

ax1 = plt.axes(ax2.get_position(True))
ax1.set_frame_on(False)
ax1.set_xscale('log')
ax1.set_yscale('log')
ax1.plot(x, y)
...

相关问题