更改函数中的变量以在同一轴上创建多个绘图

2024-04-27 14:54:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试绘制一个函数,描述不同世界模型的宇宙学线性扰动增长。我想能够有在同一组轴上的所有曲线,但正在努力设置它。你知道吗

我的目的是绘制这个函数D,关于z,但是有多个不同密度参数的图($\Omega$)。你知道吗

我已经管理了两个解决方案,但两个方案都不能很好地工作,第一个非常低效(为每组参数添加新函数):

z = np.arange(0.0,10,0.1)

#density parameters
MOm = 1.0
MOv = 0.0

COm = 0.3
COv = 0.7

H0 = 70

def Mf(z):
    A = (5/2)*MOm*(H0**2)
    H = H0 * np.sqrt( MOm*((1+z)**3) + MOv )
    return A * ((1+z)/(H**3))

def MF(z):
    res = np.zeros_like(z)
    for i,val in enumerate(z):
        y,err = integrate.quad(Mf,val,np.inf)
        res[i] = y
    return res

def MD(z):
    return (H0 * np.sqrt( MOm*((1+z)**3) + MOv )) * MF(z)

def Cf(z):
    A = (5/2)*COm*(H0**2)
    H = H0 * np.sqrt( COm*((1+z)**3) + COv )
    return A * ((1+z)/(H**3))

def CF(z):
    res = np.zeros_like(z)
    for i,val in enumerate(z):
        y,err = integrate.quad(Cf,val,np.inf)
        res[i] = y
    return res

def CD(z):
    return (H0 * np.sqrt( COm*((1+z)**3) + COv )) * CF(z) 


plt.plot(z,MD(z),label="Matter Dominated")
plt.plot(z,CD(z),label="Current Epoch")

因此,我尝试使用for循环使其更简单,但无法解决如何将标签添加到循环内的每个绘图:

Om = (1.0,0.3)
Ov = (0.0,0.7)

for param1,param2 in zip(Om,Ov):
    def f(z):
        A = (5/2)*param1*(H0**2)
        H = H0 * np.sqrt( param1*((1+z)**3) + param2 )
        return A * ((1+z)/(H**3))

    def F(z):
        res = np.zeros_like(z)
        for i,val in enumerate(z):
            y,err = integrate.quad(f,val,np.inf)
            res[i] = y
        return res

    def D(z):
        return (H0 * np.sqrt( param1*((1+z)**3) + param2 )) * F(z)

    plt.plot(z,D(z))

有人能帮忙解释一下这样做的有效方法吗?或者如何使用for循环动态地向绘图添加标签。任何帮助都将不胜感激。你知道吗


Tags: 函数incomforreturndefnpres
2条回答

So I tried to make it simpler with a for loop, but have been unable to work out how to add labels to each plot inside the loop

from scipy import integrate
from matplotlib import pyplot as plt

MOm = 1.0
MOv = 0.0

COm = 0.3
COv = 0.7

z = np.arange(0.0,10,0.1)
H0 = 70
Om = (1.0,0.3)
Ov = (0.0,0.7)

fig = plt.figure(1)
for param1,param2 in zip(Om,Ov):
    def f(z):
        A = (5/2)*param1*(H0**2)
        H = H0 * np.sqrt( param1*((1+z)**3) + param2 )
        return A * ((1+z)/(H**3))

    def F(z):
        res = np.zeros_like(z)
        for i,val in enumerate(z):
            y,err = integrate.quad(f,val,np.inf)
            res[i] = y
        return res

    def D(z):
        return (H0 * np.sqrt( param1*((1+z)**3) + param2 )) * F(z)

## Now define labels as you need and labels as follows:

    plt.plot(z,D(z),label = 'Om: {}, Ov: {}'.format(param1,param2))
    plt.legend()

enter image description here

可以使用预定义的字符串在循环中基于这两个参数创建一个标签,并使用相应的值格式化该字符串。你知道吗

label="Om {}, Ov {}".format(param1, param2)

总的来说,这将给出:

import numpy as np
import scipy.integrate as integrate
import matplotlib.pyplot as plt

z = np.arange(0.0,10,0.1)
MOm = 1.0
MOv = 0.0
COm = 0.3
COv = 0.7
H0 = 70

Om = (1.0,0.3)
Ov = (0.0,0.7)
plt.figure(figsize=(3.8,2.4))
for param1,param2 in zip(Om,Ov):
    def f(z):
        A = (5/2)*param1*(H0**2)
        H = H0 * np.sqrt( param1*((1+z)**3) + param2 )
        return A * ((1+z)/(H**3))

    def F(z):
        res = np.zeros_like(z)
        for i,val in enumerate(z):
            y,err = integrate.quad(f,val,np.inf)
            res[i] = y
        return res

    def D(z):
        return (H0 * np.sqrt( param1*((1+z)**3) + param2 )) * F(z)

    plt.plot(z,D(z), label="Om {}, Ov {}".format(param1, param2))

plt.legend()   
plt.show()

enter image description here

相关问题 更多 >