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

基于Python实现自定义样式垂直线的数据可视化问题求助

问题排查与解决方案

我仔细看了你的代码和需求,发现几个关键问题导致你看不到预期的可视化效果,下面逐一说明并给出修正后的代码:

主要问题分析

  • 列名不匹配:你的数据集里标识分组的列是id,但代码里一直用line_id,这会直接触发KeyError,程序根本没法正确读取数据。
  • 绘图后错误销毁图形:代码最后那段plt.figure().clear(); plt.close(); plt.cla(); plt.clf()完全把你刚刚绘制的图形清空并关闭了,这是你看不到任何结果的核心原因。
  • 重复设置坐标轴:循环内部每次都调用plt.axis(xmin=1,xmax=3),这不仅冗余,还可能导致坐标轴状态混乱,应该把坐标轴配置放在循环外面。
  • 多余的无效操作:比如重复赋值egs=df1["line_id"],还有drop(["Unnamed: 0","index"],axis=1)——你的数据集里并没有这两列,执行这个会报错。
  • 未处理的trk值:你的数据集里有STWS,但需求里没提到,不过代码里处理了,这个没问题,但要注意和需求对齐。

修正后的代码

import pandas as pd
import matplotlib.pyplot as plt

# 读取数据集(假设你的CSV文件和代码同目录)
df1 = pd.read_csv("line3.csv")

# 取id为1的分组(和你原代码的b=1对应)
target_id = 1
a = df1[df1["id"] == target_id]
# 按rbegin降序排序,确保线条从上到下绘制
a_sorted = a.sort_values(by="rbegin", ascending=False)

# 设置画布和坐标轴
plt.figure(figsize=(8, 12))  # 设置合适的画布大小,方便查看
plt.xlim(1, 3)  # 设置x轴范围,只需要一次
plt.ylim(a_sorted["rend"].min() - 2, a_sorted["rbegin"].max() + 2)  # 自动适配y轴范围,留一点边距
plt.title(f"line: {target_id}")
plt.ylabel("Value")

# 遍历每一行绘制线条
for _, row in a_sorted.iterrows():
    trk = row["trk"]
    rbegin = row["rbegin"]
    rend = row["rend"]
    
    if trk == "STWOS":
        # 黑色实线
        plt.vlines(2, rend, rbegin, linewidth=1, color="black")
    elif trk == "missing":
        # 黑色虚线
        plt.vlines(2, rend, rbegin, color="black", linewidth=1, linestyles="dashed")
    elif trk == "DTWOS":
        # 两条平行黑色实线,间隔0.05
        plt.vlines(1.95, rend, rbegin, linewidth=1, color="black")
        plt.vlines(2.05, rend, rbegin, linewidth=1, color="black")
    elif trk == "STWS":
        # 按你原代码的逻辑处理STWS,如果你不需要可以删除
        plt.annotate(str(rend), (1.85, rend), fontsize=5)
        plt.vlines(2.05, rend, rbegin, linewidth=0.5, color="red")
        plt.axhline(y=rbegin, xmin=0.51, xmax=0.53, linewidth=1/7, color="red")
        plt.axhline(y=rend, xmin=0.51, xmax=0.53, linewidth=1/7, color="red")
        plt.vlines(2, rend, rbegin, linewidth=1, color="black")

# 显示图形,不要清空!
plt.tight_layout()
plt.show()

关键修改说明

  1. 修正列名:把所有line_id替换成数据集里的id,确保能正确筛选数据。
  2. 移除图形销毁代码:删掉最后那段清空关闭的代码,改用plt.show()显示图形。
  3. 优化坐标轴设置:把x轴、y轴范围设置放在循环外,y轴自动适配数据范围,让所有线条都能完整显示。
  4. 改用iterrows遍历:相比把DataFrame转成numpy数组,用iterrows()更直观,代码可读性更强。
  5. 调整DTWOS的线条位置:把两条线放在1.95和2.05,比原代码的1.95和2更对称,视觉效果更好,你可以根据需求调整间隔。
  6. 添加画布大小设置:figsize=(8,12)让纵向的线条更清晰,避免挤在一起。

效果说明

运行修正后的代码后,你会看到:

  • 所有STWOS对应黑色垂直线;
  • missing对应黑色虚线;
  • DTWOS对应两条平行的黑色实线;
  • STWS按照你原代码的逻辑显示黑色实线加红色辅助线(如果不需要可以直接删掉这个分支)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:44:05