Python中基于Mg#数值条件筛选地球化学数据绘制散点子图的实现问题
Python中基于Mg#数值条件筛选地球化学数据绘制散点子图的实现问题
嗨,我完全懂你的需求——不想额外创建新列或新DataFrame,直接在绘图环节根据Mg#的数值条件筛选数据对吧?其实根本不需要用if/elif语句,Pandas的布尔索引就能完美解决这个问题,代码简洁还完全符合你的要求!
核心思路:用布尔索引实时筛选数据
Pandas支持直接通过布尔条件对DataFrame进行切片筛选,你可以在调用plt.scatter()的时候,直接把筛选后的数据集传进去,全程不需要提前生成新的数据集。
1. 单条件筛选(比如Mg# > 70)
直接在索引里写布尔条件,把符合要求的行筛选出来,再取对应的Pd和Cu/Pd值:
# 筛选Mg# > 70的数据绘制 plt.scatter( East_Greenland[East_Greenland['Mg#'] > 70]['Pd'], East_Greenland[East_Greenland['Mg#'] > 70]['Cu'] / East_Greenland[East_Greenland['Mg#'] > 70]['Pd'], color="green", marker="s", s=25, edgecolor="black", label="East Greenland (Mg# > 70)" )
2. 区间条件筛选(比如60 ≤ Mg# ≤ 70)
对于区间范围,用&来组合两个布尔条件,注意每个条件都要加括号(因为Pandas的运算符优先级问题):
# 先把区间条件存成mask变量让代码更整洁 mask = (East_Greenland['Mg#'] >= 60) & (East_Greenland['Mg#'] <= 70) plt.scatter( East_Greenland[mask]['Pd'], East_Greenland[mask]['Cu'] / East_Greenland[mask]['Pd'], color="orange", marker="o", s=25, edgecolor="black", label="East Greenland (60 ≤ Mg# ≤70)" )
如果你不想用额外变量,也可以直接把(East_Greenland['Mg#'] >=60) & (East_Greenland['Mg#'] <=70)写在索引里,效果完全一致。
绘制子图的完整示例
如果你想把不同Mg#区间的数据分成单独的子图展示,可以用plt.subplots()创建子图布局,每个子图对应一个筛选条件:
import matplotlib.pyplot as plt # 创建2行1列的子图布局 fig, (ax1, ax2) = plt.subplots(nrows=2, ncols=1, figsize=(8, 10)) # 子图1:Mg# >70的数据 mask_high = East_Greenland['Mg#'] > 70 ax1.scatter( East_Greenland[mask_high]['Pd'], East_Greenland[mask_high]['Cu'] / East_Greenland[mask_high]['Pd'], color="green", marker="s", s=25, edgecolor="black", label="Mg# > 70" ) ax1.set_title("East Greenland (onshore) - Mg# >70") ax1.set_xlabel("Pd") ax1.set_ylabel("Cu/Pd") ax1.legend() ax1.grid(alpha=0.3) # 子图2:Mg#在60-70之间的数据 mask_mid = (East_Greenland['Mg#'] >=60) & (East_Greenland['Mg#'] <=70) ax2.scatter( East_Greenland[mask_mid]['Pd'], East_Greenland[mask_mid]['Cu'] / East_Greenland[mask_mid]['Pd'], color="orange", marker="o", s=25, edgecolor="black", label="60 ≤ Mg# ≤70" ) ax2.set_title("East Greenland (onshore) - 60 ≤ Mg# ≤70") ax2.set_xlabel("Pd") ax2.set_ylabel("Cu/Pd") ax2.legend() ax2.grid(alpha=0.3) # 调整子图间距避免重叠 plt.tight_layout() plt.show()
为什么不用if/elif?
其实你之前纠结的条件语句,反而不太适合这种数值区间的筛选场景。布尔索引是对整个DataFrame的行进行批量筛选,比分支判断更直接高效,代码可读性也更强——完全不需要循环或条件判断就能实现精准筛选。
这样操作下来,你既不用创建新的列或DataFrame,又能精准筛选出不同Mg#区间的数据来绘图,完美匹配你的需求~
备注:内容来源于stack exchange,提问作者Anna Morrison
相关产品推荐
相关产品推荐

