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

VS Code中Python3保存TB数据集图表失败,疑路径问题求排查

问题排查与修复方案

你的代码在保存图表时出现错误,主要有以下几个问题,逐一修复即可解决:

1. 路径拼接语法错误

最后一行代码的路径写法不符合Python语法,正确的字符串拼接需要用+连接,或者用更安全的os.path.join(自动适配不同系统的路径分隔符):

错误写法:

chart.save(current_path"/screenshots/altair_table1.png")

修复后(二选一):

# 方式1:字符串拼接
chart.save(current_path + "/screenshots/altair_table1.png")

# 方式2:os.path.join(推荐)
chart.save(os.path.join(current_path, "screenshots", "altair_table1.png"))

2. 目标目录可能不存在

如果当前工作目录下没有screenshots文件夹,chart.save()会因找不到路径报错。需要提前检查并创建目录:

在保存图表前添加以下代码:

screenshot_dir = os.path.join(current_path, "screenshots")
if not os.path.exists(screenshot_dir):
    os.makedirs(screenshot_dir)

3. 图表编码的数据源错误

你在groupby('year')聚合后,table1的结构已发生变化:原表的cases被聚合为新列n,且country列被分组聚合后消失了。但后续图表代码仍使用alt.Y('cases')和color='country',这会导致Altair找不到对应字段报错。

修复方案1:保留国家维度绘图

调整聚合逻辑,同时按年份和国家分组:

# 按year和country聚合,保留国家维度
table1 = (table1.
        groupby(['year', 'country']).
        agg(total_cases = ('cases', 'sum')).
        reset_index())

# 此时可正常使用country字段编码
base_chart = alt.Chart(table1).encode(
    alt.X('year'), 
    alt.Y('total_cases', title='病例数'),
    detail='country'
)

chart = base_chart.mark_line() + base_chart.encode(color='country').mark_circle()

修复方案2:绘制总病例数折线图

如果只需要年份维度的总病例数,修改图表编码:

# 聚合后的table1只有year和n列,Y轴用'n'
base_chart = alt.Chart(table1).encode(
    alt.X('year'), 
    alt.Y('n', title='总病例数')
)

chart = base_chart.mark_line() + base_chart.mark_circle()

完整修复后的代码

import pandas as pd
import altair as alt
import numpy as np
import os

current_path = os.getcwd()
print(current_path)
    
base_url = "https://github.com/byuidatascience/data4python4ds/raw/master/data-raw/"
table1 = pd.read_csv("{}table1/table1.csv".format(base_url))
table2 = pd.read_csv("{}table2/table2.csv".format(base_url))
table3 = pd.read_csv("{}table3/table3.csv".format(base_url))
table4a = pd.read_csv("{}table4a/table4a.csv".format(base_url))
table4b = pd.read_csv("{}table4b/table4b.csv".format(base_url))
table5 = pd.read_csv("{}table5/table5.csv".format(base_url), dtype = 'object')
print(table1)
table1 = table1.assign(rate = lambda x: x.cases / x.population * 1000)
print(table1)

# 按年份和国家聚合,保留国家维度
table1 = (table1.
        groupby(['year', 'country']).
        agg(total_cases = ('cases', 'sum')).
        reset_index())
print(table1)

base_chart = alt.Chart(table1).encode(
    alt.X('year'), 
    alt.Y('total_cases', title='病例数'),
    detail='country'
)

chart = base_chart.mark_line() + base_chart.encode(color='country').mark_circle()

# 创建screenshots目录(如果不存在)
screenshot_dir = os.path.join(current_path, "screenshots")
if not os.path.exists(screenshot_dir):
    os.makedirs(screenshot_dir)

# 正确拼接路径并保存
chart.save(os.path.join(screenshot_dir, "altair_table1.png"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:58:26