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

Matplotlib中是否有内置方法连接具有相同y值的散点?

连接Matplotlib中相同y值的散点

嘿,Matplotlib确实没有专门的内置函数直接连接相同y值的散点,但用Pandas的分组功能配合Matplotlib的plot()就能轻松实现你的需求,而且代码逻辑很清晰。

先看你的原始数据,我们需要把所有有效的x值(包括x1和x2中非NaN的部分)和对应的y值关联起来,然后按y值分组,给每组的点画直线就行。

修改后的完整代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

x1 = [6, 11, 7, 13, 6, 7.5]
x2 = [np.nan, np.nan, np.nan, np.nan, np.nan, 8.6]
y = [2, 10, 2, 14, 9, 10]
df = pd.DataFrame(data=zip(x1, x2, y), columns=["x1", "x2", "y"])

fig, ax = plt.subplots()
ax.set_xlabel("x")
ax.set_ylabel("y")

# 绘制散点
ax.scatter(df["x1"], df["y"], c="k")
ax.scatter(df["x2"], df["y"], edgecolor="k", facecolors="none")

# 连接相同y值的散点
# 1. 把x1和x2转成单列,保留对应的y值,去掉NaN
melted_df = df.melt(id_vars='y', value_vars=['x1', 'x2'], value_name='x').dropna()
# 2. 按y值分组,遍历每组画连线
for y_val, group in melted_df.groupby('y'):
    # 对x值排序,让连线更顺畅(可选,根据你的需求调整)
    group_sorted = group.sort_values('x')
    # 绘制直线:x用排序后的x,y用重复的y_val
    ax.plot(group_sorted['x'], [y_val]*len(group_sorted), color='k', linestyle='-')

plt.show()

代码解释

  • 数据整理:用pd.melt()把原来的x1和x2列转成一个长列x,同时保留每个x对应的y值,再用dropna()过滤掉无效的NaN值,这样我们就得到了所有需要连接的有效点。
  • 分组连线:按y值分组后,每个组里都是相同y值的x点。对每个组的x排序(避免x无序导致连线交叉),然后用ax.plot()绘制直线——因为是相同y值,所以y坐标是重复的y_val。

这样运行后,你会看到:

  • y=2的两个实心散点会被直线连接
  • y=10的实心散点和空心散点会被直线连接
  • 单个点(y=9、y=14)因为没有同y值的其他点,不会生成连线

如果你不想用melt,也可以手动遍历每个y值收集对应的x值,比如:

# 另一种实现方式:手动收集同y值的x
unique_ys = df['y'].unique()
for y_val in unique_ys:
    # 收集该y值下所有非NaN的x值
    xs = []
    xs.extend(df.loc[df['y'] == y_val, 'x1'].dropna().tolist())
    xs.extend(df.loc[df['y'] == y_val, 'x2'].dropna().tolist())
    if len(xs) >= 2:  # 至少两个点才连线
        xs_sorted = sorted(xs)
        ax.plot(xs_sorted, [y_val]*len(xs_sorted), color='k', linestyle='-')

这个方法和前面的效果一致,只是代码稍长一些,看你个人习惯选择。

内容的提问来源于stack exchange,提问作者a11

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:42:43