我正在尝试绘制一个图,以指定重力红移作为距离的函数。但是,我在绘图中有问题。我想从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()
答案 0 :(得分:0)
我认为这种情节存在误解。 plt.imshow
创建2D数组的颜色映射-但是轴的比例尺未显示独立的数据变量,而仅显示数组的索引。这与例如plt.contourf
。
实际上,您的数组f
甚至没有[x=1, y=1]
的值,因为x
和y
的开头是2 ...
让我们比较imshow
和contourf
:
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)
或者换句话说:在不设置xlim和ylim的情况下检查刻度的极限:它们从-0.5到97,5而不是2到99 ...
但是,您会发现imshow
有趣的花招。
看看上面的情节发生了什么
axs[0].imshow(f, interpolation='bilinear', origin='lower', extent=[2, 99, 2, 99])