Python:如何在特定y值(y = 1)的图形中为线条添加标记?

问题描述 投票:0回答:2

我正在研究一些代码来生成一个显示宇宙演变的数字。 This是我的情节。我希望它在每个线上的点比例因子a = 1(y = 1)。我使用的代码是:

import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
from scipy.integrate import odeint

H = 71
Mpc = 3.085677581e+19
km = 1.0
Gyr= 3.1536e16
H0 = (H * Gyr * km / Mpc)

openlegend = ('$\Omega_{0}=0.99$','$\Omega_{0}=0.9$','$\Omega_{0}=0.7$', '$\Omega_{0}=0.5$','$\Omega_{0}=0.3$','$\Omega_{0}=0.1$')

t_0 = 0.0004
a_0 = 0.001

def Friedmann(a, t):
dadt = H0 * (((omega_m) * a**(-1)) + ((omega_r) * a**(-2)) + ((omega_lambda) * a**2) + (omega_k))**(1./2.)
return dadt

plt.rc('text', usetex=True)
plt.rc('font', family='serif')

omega_m = 0.5
omega_lambda = 0.49
t = np.linspace(t_0, 40, 200)
a = odeint(Friedmann, a_0, t)
plt.plot(t,a)

plt.legend(openlegend)
plt.xlabel("Time/Gyr")
plt.ylabel("Scale factor")
plt.grid(True)
plt.axis([0, 40, 0, 3])
plt.show()

在上面的代码中,我删除了其他4个绘图段,因为这个问题代码太重,但我认为所需的一切都在那里。任何帮助深表感谢。

python numpy matplotlib plot scipy
2个回答
1
投票

首先找到相应的t值:

from scipy.optimize import fmin
def testfunc(t):
    return abs(1.0-odeint(Friedmann, a_0, t))

tmin=fmin(testfunc,t_0)

然后在那个地方绘制一个标记:

plt.plot(tmin,odeint(Friedmann,a_0,tmin),'ro')

0
投票

要回答你的第二个问题,请看看:

a = np.sort(np.random.rand(100))*2
print(a)

[ 0.04076413  0.07112053  0.09023507  0.09191885  0.10870836  0.12426541
  0.15729747  0.16440316  0.20495337  0.22365309  0.24789116  0.24872571
  0.25064043  0.35076052  0.40280108  0.40847091  0.41375155  0.41872087
  0.42212211  0.43659979  0.44668006  0.45077655  0.481286    0.48560537
  0.52093186  0.52609924  0.56036436  0.56825814  0.62489957  0.62508836
  0.63732085  0.64103949  0.64947372  0.67048212  0.67637557  0.70392489
  0.70942404  0.72100452  0.75495165  0.7912313   0.79807935  0.80725338
  0.8267592   0.82791651  0.82841211  0.82848251  0.82904787  0.89153547
  0.92865278  0.96317979  0.99453125  1.00568198  1.00616394  1.01079887
  1.05477181  1.07749413  1.09642453  1.11116792  1.11821267  1.11954254
  1.11977944  1.1542566   1.17433921  1.19874957  1.25671437  1.27505726
  1.30764574  1.31788563  1.32370927  1.33032743  1.39506346  1.40655092
  1.40935935  1.42417487  1.45180301  1.47163972  1.57174153  1.59848992
  1.66061794  1.68826849  1.69218186  1.70790405  1.72978585  1.73469934
  1.78886879  1.82761629  1.83104592  1.83245659  1.83909942  1.84631466
  1.84894874  1.86030259  1.8784236   1.88678391  1.92236088  1.94622433
  1.96752263  1.98113385  1.99168009  1.99612737]

i = np.argmax(a>1) # first index giving a[i]>1
# BEWARE THIS WILL RETURN 0 IF NO VALUE IS GREATER THAN 1...
print(a[i])

1.0056819789665188

然后t[i]会给你相应的时间。您也可以使用i = np.argmin(abs(a-1))来获得最接近1的点而不是第一个高于1的点,但我想差异无关紧要。

© www.soinside.com 2019 - 2024. All rights reserved.