Python + pyecharts 实战:疫情数据折线图可视化
折线图可视化实战 | 用 Python pyecharts 实现疫情数据对比分析全面解析 一、知识前导Python 与 JSON 的相互转换importjson# 1. 列表 → JSON 字符串data[{name:张大山,age:11},{name:王大锤,age:13},{name:赵啸虎,age:14}]json_datajson.dumps(data,ensure_asciiFalse)print(json_data)# 输出[{name: 张大山, age: 11}, {name: 王大锤, age: 13}, {name: 赵啸虎, age: 14}]print(type(json_data))# class str# 2. 字典 → JSON 字符串d{name:zhangsan,age:11}json_datajson.dumps(d,ensure_asciiFalse)print(json_data)# {name: zhangsan, age: 11}print(type(json_data))# class str# 3. JSON 字符串 → Python 列表str_json[{name:张大山,age:11},{name:王大锤,age:13},{name:赵啸虎,age:14}]json_datajson.loads(str_json)print(json_data)# [{name: 张大山, age: 11}, ...]print(type(json_data))# class list# 4. JSON 字符串 → Python 字典str_json{name:zhangsan,age:11}json_datajson.loads(str_json)print(json_data)# {name: zhangsan, age: 11}print(type(json_data))# class dict✅ 知识点总结操作方法作用重要参数Python → JSONjson.dumps()将 Python 数据转为 JSON 字符串ensure_asciiFalse防止中文乱码JSON → Pythonjson.loads()将 JSON 字符串还原为 Python 数据仅接受字符串类型用途读取网络数据、结构化存储、数据交换为后续解析 JSONP 做准备—— 二、如何实现数据清洗核心技巧原始数据是JSONP格式jsonp_1629344292311_69436({status:0,msg:success,data:[...]})❌ 问题以jsonp_...(开头)结尾不是合法 JSON直接json.loads()会报错✅ 解决方案三步清洗法# 1. 去除开头的函数包裹名us_dataus_data.replace(jsonp_1629344292311_69436(,)# 2. 去除结尾的括号us_dataus_data[:-2]# 切片获取前面内容# 3. 进行合法 JSON 解析us_dictjson.loads(us_data) 三、代码详解逐行解析核心逻辑importjsonfrompyecharts.chartsimportLinefrompyecharts.optionsimportTitleOpts,LegendOpts,TooltipOpts,LabelOpts,AxisOpts导入说明Line用于折线图options用于配置标题、图例等。✅ 1. 读取文件重要加encodingutf-8withopen(D:/python_testdata/美国.txt,r,encodingutf-8)asf_us:us_dataf_us.read()✅ 为什么encodingutf-8中文文件必须指定编码否则会出现SyntaxError: invalid start byte✅ 2. 清洗数据us_dataus_data.replace(jsonp_1629344292311_69436(,)us_dataus_data[:-2]# 移除最后一个 )注意不是 [-1]✅ 清洗后{status:0,msg:success,...}→ 合法 JSON✅ 3. 转换为字典us_dictjson.loads(us_data) 从此获得 Python 可操作的嵌套字典结构。✅ 4. 提取关键数据这里为了方边观察我们的json文档 我们可以复制我们清洗后的数据 如下图所示并且在网页打开 JSON 在线视图查看器 观察JSON格式 方便我们提取数据为了方便观察 我给你们列出了具体的JSON结构{} 包裹的是 字典对象[] 包裹的是 列表数组update 下面是日期# 获取 trend 字段us_trend_dataus_dict[data][0][trend]# 从上图我们可以看到 data 是一个列表 us_dict[data] → 得到 list# us_dict[data][0] → 取出 第一个也是唯一的一个字典对象# us_dict[data][0][trend] → 取出 trend 字段# 提取日期 (x轴)us_x_dataus_trend_data[updateDate][:314]# 只取 2020 年前 314 天# us_trend_data[updateDate]是list 日期列表用于 X 轴横轴# [:314] 表示取前 314 个元素索引 0 到 313# 提取确诊人数 (y轴)us_y_dataus_trend_data[list][0][data][:314]# list是列表包含 4 个字典每个字典有 name 和 data。我们只要确诊的数据 所以是 [list][0]# [list][0][data]是因为 我们真正要的数据在 data 里面#list: [# {# name: 确诊,# data: [34, 34, 34, ...]# },# {# name: 治愈,# data: [0, 0, 3, ...]# },# {# name: 死亡,# data: [0, 0, 0, ...]# },# {# name: 新增确诊,# data: [23, 0, 0, ...]# }#] 路径解析data[0].trend.updateDate→ 日历日期✅list[0].data→ 每日新增/累计数据✅ 5. 创建图表对象并添加数据lineLine()line.add_xaxis(us_x_data)line.add_yaxis(美国确诊人数,us_y_data,label_optsLabelOpts(is_showFalse))line.add_yaxis(日本确诊人数,jp_y_data,label_optsLabelOpts(is_showFalse))line.add_yaxis(印度确诊人数,id_y_data,label_optsLabelOpts(is_showFalse))✅LabelOpts(is_showFalse)隐藏折线上的数值标签避免图表密集✅ 6. 配置全局选项美化图表line.set_global_opts(title_optsTitleOpts(title疫情走势对比图2020,pos_leftcenter),legend_optsLegendOpts(pos_right10%),tooltip_optsTooltipOpts(triggeraxis,axis_pointer_typeshadow),xaxis_optsAxisOpts(axislabel_optsLabelOpts(rotate45)))配置项作用title_opts设置标题居中显示legend_opts图例右对齐tooltip_opts悬停提示框带阴影辅助线xaxis_optsX轴文字倾斜 45°防止重叠✅ 7. 生成 HTML 文件line.render(疫情趋势图.html) 生成疫情趋势图.html文件双击即可在浏览器打开 四、可视化成果实时查看 五、掌握的完整知识点清单面试可用类别知识点✅ 文件操作open(..., encodingutf-8),with上下文管理器✅ 字符串处理.replace(),[:-2]切片✅ JSON 转换json.loads(),json.dumps()✅ 数据提取字典嵌套访问dict[key][index][key]✅ 折线图Line().add_xaxis(),add_yaxis()✅ 图表美化set_global_opts() 各类Opts✅ 生成 HTMLrender()输出可视文件✅ 常见问题排除问题原因解法JSONDecodeError数据未清洗或编码错误加encodingutf-8清洗jsonp_KeyError: dataJSON 结构异常打印us_dict检查结构图表空白缺少render()确保最后调用render()图例显示乱x 轴文字重叠加rotate45✅ 结语你已经掌握了一个完整的 Python 数据可视化实战案例从 文件操作 → 字符串处理 → JSON 解析 → 图表生成逻辑完整、可复制性强 推荐阅读pyecharts 官方文档ECharts 官方示例 喜欢就点赞 收藏 评论让更多人看到这波干货✅ 我会持续更新更多Python 可视化系列欢迎关注