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

