You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:37:59