2014-07-09 48 views
1

我對python非常陌生,但有興趣學習一種新技術,通過這種新技術,我可以根據散點圖中不同標記的位置在散點圖中標識不同數據點散點圖。如何分散散點圖上的數據集

我具體的例子是太多這樣的:http://www.astroml.org/examples/datasets/plot_sdss_line_ratios.html

我有一個BPT情節和希望將數據沿分界線分割線。

我有一個數據集的格式如下:

data = [[a,b,c], 
     [a,b,c], 
     [a,b,c] 
] 

而且我也有分界線以下幾點:

NII = np.linspace(-3.0, 0.35) 

def log_OIII_Hb_NII(log_NII_Ha, eps=0): 
    return 1.19 + eps + 0.61/(log_NII_Ha - eps - 0.47) 

任何幫助將是巨大的!

+0

你可以做的是數據列表分爲兩個列表,根據其在所限定的兩個平面之中分界線。完成之後,您可以分別確定每組數據的顏色(和大小,...)。 – markusian

回答

-1

我假設你的像素座標爲a, b。然後用c s這個列來計​​算一個點是否屬於這兩個組中的一個。

第一數據,保證數據的ndarray

import numpy as np 

data = np.array(data) 

現在,你可以通過檢查數據的哪一部分創建兩個數組屬於哪個區域:

dataselector = log_OIII_Hb_NII(data[:,2]) > 0 

這將創建Trues的載體每當第三列(第2列)中的數據給出該函數的正值時,就會出現True的錯誤。矢量的長度等於data中的行數。

然後你就可以繪製兩個數據集:

import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = fig.add_subplot(111) 

# the plotting part 
ax.plot(data[dataselector,0], data[dataselector,1], 'ro') 
ax.plot(data[-dataselector,0], data[-dataselector,1], 'bo') 

即:

  • 創建真/假值,告訴它的data行屬於清單哪個組
  • 情節兩組(-dataselector表示「dataselector中存在假的​​所有行」)
+0

這不起作用。我可以與我分享我的電子郵件嗎? – user3125347

2

評論部分沒有足夠的空間。沒有太多不同,以什麼@DrV寫的,但也許更多的天文數字般的傾斜:

import random 
import numpy as np 
import matplotlib.pyplot as plt 

def log_OIII_Hb_NII(log_NII_Ha, eps=0): 
    return 1.19 + eps + 0.61/(log_NII_Ha - eps - 0.47) 

# Make some fake measured NII_Ha data 
iternum = 100 

# Ranged -2.1 to 0.4: 
Measured_NII_Ha = np.array([random.random()*2.5-2.1 for i in range(iternum)]) 
# Ranged -1.5 to 1.5: 
Measured_OIII_Hb = np.array([random.random()*3-1.5 for i in range(iternum)]) 

# For our measured x-value, what is our cut-off value 
Measured_Predicted_OIII_Hb = log_OIII_Hb_NII(Measured_NII_Ha) 

# Now compare the cut-off line to the measured emission line fluxes 
# by using numpy True/False arrays 
# 
# i.e., x = numpy.array([1,2,3,4]) 
# >> index = x >= 3 
# >> print(index) 
# >> numpy.array([False, False, True, True]) 
# >> print(x[index]) 
# >> numpy.array([3,4]) 

Above_Predicted_Red_Index = Measured_OIII_Hb > Measured_Predicted_OIII_Hb 
Below_Predicted_Blue_Index = Measured_OIII_Hb < Measured_Predicted_OIII_Hb 
# Alternatively, you can invert Above_Predicted_Red_Index 



# Make the cut-off line for a range of values for plotting it as 
# a continuous line 
Predicted_NII_Ha = np.linspace(-3.0, 0.35) 
Predicted_log_OIII_Hb_NII = log_OIII_Hb_NII(Predicted_NII_Ha) 

fig = plt.figure(0) 
ax = fig.add_subplot(111) 

# Plot the modelled cut-off line 
ax.plot(Predicted_NII_Ha, Predicted_log_OIII_Hb_NII, color="black", lw=2) 

# Plot the data for a given colour 
ax.errorbar(Measured_NII_Ha[Above_Predicted_Red_Index], Measured_OIII_Hb[Above_Predicted_Red_Index], fmt="o", color="red") 
ax.errorbar(Measured_NII_Ha[Below_Predicted_Blue_Index], Measured_OIII_Hb[Below_Predicted_Blue_Index], fmt="o", color="blue") 

# Make it aesthetically pleasing 
ax.set_ylabel(r"$\rm \log([OIII]/H\beta)$") 
ax.set_xlabel(r"$\rm \log([NII]/H\alpha)$") 

plt.show() 

plot of example code