Python 如何在散点图上分离数据集

Python 如何在散点图上分离数据集,python,matplotlib,astronomy,Python,Matplotlib,Astronomy,我对python非常陌生,但我对学习一种新技术感兴趣,通过这种技术,我可以根据散点图中的不同数据点在散点图中的位置,用不同的标记识别散点图中的不同数据点 我的具体例子与此非常相关: 我有一个BPT图,想沿着分界线分割数据 我有一个以下格式的数据集: data = [[a,b,c], [a,b,c], [a,b,c] ] 我还有以下关于分界线的信息: NII = np.linspace(-3.0, 0.35) def log_OIII_Hb_NII(log_

我对python非常陌生,但我对学习一种新技术感兴趣,通过这种技术,我可以根据散点图中的不同数据点在散点图中的位置,用不同的标记识别散点图中的不同数据点

我的具体例子与此非常相关:

我有一个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)

任何帮助都会很好

我假设您的示例中的像素坐标为
a,b
。带有
c
s的列则用于计算点是否属于这两个组中的一个

首先将数据设置为
ndarray

import numpy as np

data = np.array(data)
现在,您可以通过检查数据的哪个部分属于哪个区域来创建两个数组:

dataselector = log_OIII_Hb_NII(data[:,2]) > 0
这将创建一个True和False向量,每当第三列(第2列)中的数据从函数中给出正值时,该向量都具有True。向量的长度等于
数据中的行数

然后可以绘制两个数据集:

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')
即:

  • 创建一个真/假值列表,告诉哪些
    数据行属于哪个组
  • 绘制两个组(
    -dataselector
    表示“在
    dataselector
    中存在False的所有行”)

    • 评论部分没有足够的空间。与@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()
      
      随机导入
      将numpy作为np导入
      将matplotlib.pyplot作为plt导入
      def log_OIII_Hb_NII(log_NII_Ha,eps=0):
      回报率1.19+eps+0.61/(对数年收益率-eps-0.47)
      #制作一些假的NII_Ha测量数据
      iternum=100
      #范围为-2.1至0.4:
      测量值\u NII\u Ha=np.数组([random.random()*2.5-2.1表示范围内的i(iternum)])
      #范围为-1.5至1.5:
      测量的_OIII_Hb=np.数组([random.random()*3-1.5表示范围内的i(iternum)])
      #对于我们测量的x值,我们的截止值是多少
      测量值=预测值=对数值(测量值)
      #现在将截止线与测量的排放线通量进行比较
      #通过使用numpy真/假数组
      #
      #即x=numpy.数组([1,2,3,4])
      #>>索引=x>=3
      #>>打印(索引)
      #>>numpy.array([False,False,True,True])
      #>>打印(x[索引])
      #>>numpy.array([3,4])
      上述预测指数=测量值>测量值>预测值
      低于预测值的蓝色指数=测量值的血红蛋白<测量值的血红蛋白
      #或者,您可以反转以上的预测红色指数
      #将一系列值的截止线绘制为
      #连续线
      预测的最小值=np.linspace(-3.0,0.35)
      预测值=log\u OIII\u Hb\u NII=log\u OIII\u Hb\u NII(预测值)
      图=plt.图(0)
      ax=图添加_子批次(111)
      #绘制模拟的截止线
      ax.曲线图(预测值(Ha)、预测值(log)、预测值(Hb)、预测值(color=“black”、lw=2)
      #绘制给定颜色的数据
      最大误差条(测量值为[高于预测值的红色指数]、测量值为[高于预测值的红色指数]、fmt=“o”、color=“红色”)
      最大误差条(测量值为[低于预测值的蓝色指数]、测量值为[低于预测值的蓝色指数]、fmt=“o”、color=“蓝色”)
      #使其美观
      ax.set\u ylabel(r“$\rm\log([OIII]/H\beta)$”)
      ax.set\u xlabel(r“$\rm\log([NII]/H\alpha)$”)
      plt.show()
      

      您可以做的是根据数据列表在分界线定义的两个平面内的位置,将其拆分为两个列表。完成后,可以分别决定每组数据的颜色(和大小…)