2014-07-09 3 views
1

저는 파이썬에 관해서 매우 익숙하지만 새로운 기법을 배우는 것에 관심이 있습니다. 따라서 새로운 마커를 사용하여 분산 형 플롯에서 다른 마커를 식별 할 수 있습니다. 산포도.분산 형 플롯에서 데이터 세트를 분리하는 방법

내 구체적인 예는이 훨씬입니다 : 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이있는 열은 점이 두 그룹 중 하나에 속하는지 여부를 계산하는 데 사용됩니다.

먼저 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