2017-02-13 74 views
1

目前我正在試圖繪製它描述了宇宙學線性擾動增長不同的世界模型的函數創建多個地塊。我希望能夠將所有曲線放在同一組軸上,但是我很難設置它。的功能變化的變量對同一軸上

我的目標是繪製該功能d,相對於Z,但有不同的密度參數($ \ $歐米茄)多條曲線。

我已成功兩種解決方案但兩者都沒有完美的工作,首先是效率非常低(添加新的功能,每個組參數):

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

所以我試圖使它具有更簡單的循環,但一直未能解決如何標籤添加到每個小區內環路:

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循環在標籤上添加標籤。任何幫助將不勝感激。

+0

你要什麼標籤? – Chuck

+0

您的代碼無法運行 - 請提供您正在使用的模塊導入。 – Chuck

回答

1

所以我試圖使其與一個for循環簡單,但一直未能解決如何標籤添加到每個小區內環路

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

+0

這很完美,謝謝查爾斯! – Daniel

+0

@丹尼爾不客氣!不要忘記還upvote任何你覺得有用的答案! :) – Chuck

1

你可以使用預定義的字符串基於這兩個參數在循環中創建一個標籤,該字符串使用相應的值進行格式化。

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

+0

恕我直言,它看起來像你已經張貼我做了完全相同的代碼(有一些_extremely_細微的變化,即變量順序和figsize),6分鐘後,我張貼。你已經從字面上解除了我寫的'label ='Om:{},Ov:{}'。格式(param1,param2))語句。我知道這個代碼段被複制,因爲實際上,你不需要任何'MOm''MOv''COm'或'COv'變量來運行這段代碼;我誤將他們留下了 - 但在我寫這篇評論的時候,他們在你的代碼中。我可能會誤解,在這種情況下,我表示歉意;你拿什麼? – Chuck

+0

還有的做一些事情的標準方式,即從問題的代碼複製,刪除所有的*明顯*不需要,做必要的修改,寫答案,粘貼兩回的答案領域和擊中門柱按鈕。一些不需要的變量只能存活下來,這表明我們都沒有太過關注。問題是我有什麼興趣來複制你的代碼,爲什麼我會費心去修改它?如果我知道某人正在同時工作,發佈了一個很好的答案,我最好花時間去做其他的事情。 – ImportanceOfBeingErnest

+0

我想這是有道理的,我認爲這是最初引起我質疑的時間長短,以及答案實際上有多相似。不過,我必須說,你的參與表明我所說的可能不是這樣。看起來我開始認真對待這件事 - 我的道歉。 – Chuck