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

0 投票
2 回答
2312 浏览
提问于 2025-04-18 12:42

我刚开始学习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)

任何帮助都会很棒!

2 个回答

1

评论区的空间不够用了。和@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()

示例代码的图表

-1

我猜你在例子中有像 a, b 这样的像素坐标。这里的 c 列是用来判断一个点属于哪一组的。

首先,把你的数据变成一个 ndarray

import numpy as np

data = np.array(data)

接下来,你可以通过检查数据的哪一部分属于哪个区域来创建两个数组:

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

这样会生成一个包含真和假的向量,只要第三列(第2列)的数据通过函数得到了正值,就会标记为真。这个向量的长度和 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 中为假的行”)

撰写回答