基于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()
关键修改说明
- 修正列名:把所有
line_id替换成数据集里的id,确保能正确筛选数据。 - 移除图形销毁代码:删掉最后那段清空关闭的代码,改用
plt.show()显示图形。 - 优化坐标轴设置:把x轴、y轴范围设置放在循环外,y轴自动适配数据范围,让所有线条都能完整显示。
- 改用iterrows遍历:相比把DataFrame转成numpy数组,用
iterrows()更直观,代码可读性更强。 - 调整DTWOS的线条位置:把两条线放在1.95和2.05,比原代码的1.95和2更对称,视觉效果更好,你可以根据需求调整间隔。
- 添加画布大小设置:
figsize=(8,12)让纵向的线条更清晰,避免挤在一起。
效果说明
运行修正后的代码后,你会看到:
- 所有
STWOS对应黑色垂直线; missing对应黑色虚线;DTWOS对应两条平行的黑色实线;STWS按照你原代码的逻辑显示黑色实线加红色辅助线(如果不需要可以直接删掉这个分支)。
内容的提问来源于stack exchange,提问作者Muscular_Neanderthal
相关产品推荐
相关产品推荐

