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
相关产品推荐
相关产品推荐

