如何绘制从特定半径开始的imshow?

时间:2018-10-01 17:58:26

标签: python imshow

我正在尝试绘制一个图,以指定重力红移作为距离的函数。但是,我在绘图中有问题。我想从rs=1.0绘制它,因为在schwarzshild半径内,rs=1.0内无法检测到任何物体。

我试图做口罩,但是没有用。是否有任何方法以起始半径大约为r>1绘制轮廓图?实际上,在上图中,我想让我的imshow绘制从蓝色实心圆开始的红移量,而不是在r=0处绘制(我不知道为什么它从那里开始)。

import numpy as np
import matplotlib.pyplot as plt

rs=1
ang=np.linspace(0,2*np.pi,2000)
x, y = np.mgrid[2:100, 2:100]
dist = np.hypot(x, y) # Linear distance from point 0, 0
z = np.sqrt(1/dist)
f=1/np.sqrt((1-rs*z)/(1-rs/4))*(1/10)

plt.imshow(f, interpolation='bilinear')

a=np.cos(ang)
b=np.sin(ang)

plt.xlim(0,15)
plt.ylim(0,15)
plt.plot(a,b)
plt.colorbar()
plt.show()

1 个答案:

答案 0 :(得分:0)

我认为这种情节存在误解。 plt.imshow创建2D数组的颜色映射-但是轴的比例尺未显示独立的数据变量,而仅显示数组的索引。这与例如plt.contourf

实际上,您的数组f甚至没有[x=1, y=1]的值,因为xy的开头是2 ...

让我们比较imshowcontourf

fig, axs = plt.subplots(1, 2)
axs[0].imshow(f, interpolation='bilinear')
axs[0].set_xlim(0,15)
axs[0].set_ylim(0,15)

axs[1].contourf(x, y, f)
axs[1].set_aspect(1)

axs[1].set_xlim(0,15)
axs[1].set_ylim(0,15)

enter image description here

或者换句话说:在不设置xlim和ylim的情况下检查刻度的极限:它们从-0.5到97,5而不是2到99 ...

但是,您会发现imshow有趣的花招。
看看上面的情节发生了什么

axs[0].imshow(f, interpolation='bilinear', origin='lower', extent=[2, 99, 2, 99])

enter image description here