目录
一、JSON数据格式
1. 什么是JSON
JSON:轻量级的数据交互格式,本质上是带有特定格式的字符串
# JSON格式示例1:字典形式
{"name": "admin", "age": 18}
# JSON格式示例2:列表形式(包含多个字典)
[
{"name": "admin", "age": 18},
{"name": "root", "age": 16},
{"name": "张三", "age": 20}
]
2. JSON的作用
在不同编程语言之间传递数据时,JSON作为通用的数据格式。
3. Python与JSON相互转换
import json
# Python转JSON:json.dumps()
print("=== Python转JSON ===")
data = [{"name": "老王", "age": 16}, {"name": "张三", "age": 20}]
json_data = json.dumps(data)
print(f"Python数据:{data}")
print(f"JSON数据:{json_data}")
print(f"JSON类型:{type(json_data)}") # <class 'str'>
# JSON转Python:json.loads()
print("\n=== JSON转Python ===")
json_str = '[{"name": "老王", "age": 16}, {"name": "张三", "age": 20}]'
python_data = json.loads(json_str)
print(f"JSON字符串:{json_str}")
print(f"Python数据:{python_data}")
print(f"Python类型:{type(python_data)}") # <class 'list'>
输出:
=== Python转JSON ===
Python数据:[{'name': '老王', 'age': 16}, {'name': '张三', 'age': 20}]
JSON数据:[{"name": "\u8001\u738b", "age": 16}, {"name": "\u5f20\u4e09", "age": 20}]
JSON类型:<class 'str'>
=== JSON转Python ===
JSON字符串:[{"name": "老王", "age": 16}, {"name": "张三", "age": 20}]
Python数据:[{'name': '老王', 'age': 16}, {'name': '张三', 'age': 20}]
Python类型:<class 'list'>
4. 处理中文
import json
data = [{"name": "老王", "age": 16}, {"name": "张三", "age": 20}]
# 不处理中文:中文会被转义
json_data1 = json.dumps(data)
print(json_data1) # [{"name": "\u8001\u738b", "age": 16}...]
# 处理中文:使用 ensure_ascii=False
json_data2 = json.dumps(data, ensure_ascii=False)
print(json_data2) # [{"name": "老王", "age": 16}, {"name": "张三", "age": 20}]
二、pyecharts模块介绍
1. 安装pyecharts
pip install pyecharts
2. pyecharts画廊
官方示例:https://gallery.pyecharts.org/#/README
三、pyecharts快速入门
1. 基础折线图
# 导入模块
from pyecharts.charts import Line
from pyecharts import options as opts
# 创建折线图对象
line = Line()
# 添加x轴数据
line.add_xaxis(["1月", "2月", "3月", "4月", "5月", "6月"])
# 添加y轴数据
line.add_yaxis("销售额", [100, 120, 150, 180, 200, 250])
# 设置全局配置
line.set_global_opts(
title_opts=opts.TitleOpts(title="月度销售趋势", pos_left="center"),
xaxis_opts=opts.AxisOpts(name="月份"),
yaxis_opts=opts.AxisOpts(name="销售额(万元)"),
legend_opts=opts.LegendOpts(pos_left="70%"),
)
# 生成HTML文件
line.render("sales.html")
print("折线图已生成:sales.html")
2. 多条折线图
from pyecharts.charts import Line
from pyecharts import options as opts
# 创建折线图对象
line = Line()
# 添加x轴数据
line.add_xaxis(["1月", "2月", "3月", "4月", "5月", "6月"])
# 添加多条y轴数据
line.add_yaxis("产品A", [100, 120, 150, 180, 200, 250])
line.add_yaxis("产品B", [80, 90, 110, 130, 160, 190])
line.add_yaxis("产品C", [60, 70, 85, 100, 120, 140])
# 设置全局配置
line.set_global_opts(
title_opts=opts.TitleOpts(title="产品月度销售对比", pos_left="center"),
xaxis_opts=opts.AxisOpts(name="月份"),
yaxis_opts=opts.AxisOpts(name="销售额(万元)"),
tooltip_opts=opts.TooltipOpts(trigger="axis"), # 鼠标悬停显示
)
line.render("products.html")
print("多条折线图已生成:products.html")
3. 设置线条样式
from pyecharts.charts import Line
from pyecharts import options as opts
line = Line()
line.add_xaxis(["1月", "2月", "3月", "4月", "5月", "6月"])
# 设置线条样式
line.add_yaxis(
"销售额",
[100, 120, 150, 180, 200, 250],
linestyle_opts=opts.LineStyleOpts(width=3, color="red", type_="solid"),
symbol="circle", # 标记点形状:circle, diamond, triangle, rect
symbol_size=10, # 标记点大小
label_opts=opts.LabelOpts(is_show=True), # 显示数值标签
)
line.set_global_opts(
title_opts=opts.TitleOpts(title="销售趋势图", pos_left="center"),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
)
line.render("line_style.html")
print("样式折线图已生成:line_style.html")
四、数据处理
1. 处理原始JSON数据
import json
# 原始数据(带有JSONP回调函数)
raw_data = 'jsonp_1629350871167_29498({"data": [{"trend": {"updateDate": ["2020-01-01", "2020-01-02"], "list": [{"data": [100, 200]}]}}]})'
print("=== 数据清理前 ===")
print(raw_data[:80] + "...")
# 去掉JSONP回调函数前缀
cleaned_data = raw_data.replace('jsonp_1629350871167_29498(', '')
# 去掉末尾的 ");"
cleaned_data = cleaned_data[:-2]
print("\n=== 数据清理后 ===")
print(cleaned_data[:80] + "...")
# 转换为Python字典
data_dict = json.loads(cleaned_data)
print("\n=== 转换后的Python数据 ===")
print(f"数据类型:{type(data_dict)}") # <class 'dict'>
print(f"数据键:{data_dict.keys()}")
2. 提取疫情数据
import json
# 模拟疫情数据(简化版)
data = {
"data": [
{
"trend": {
"updateDate": [
"2020-01-01", "2020-01-02", "2020-01-03",
"2020-01-04", "2020-01-05", "2020-01-06"
],
"list": [
{"name": "美国", "data": [100, 120, 150, 180, 200, 250]},
{"name": "印度", "data": [50, 60, 80, 100, 130, 160]},
{"name": "日本", "data": [20, 25, 30, 35, 40, 45]}
]
}
}
]
}
# 获取趋势数据
trend_data = data["data"][0]["trend"]
# 获取日期(x轴)
x_data = trend_data["updateDate"]
print(f"日期数据:{x_data}")
# 获取各国确诊数据(y轴)
for country in trend_data["list"]:
print(f"{country['name']}:{country['data']}")
# 只获取2020年的数据(前314天)
x_2020 = trend_data["updateDate"][:314]
us_data = trend_data["list"][0]["data"][:314]
india_data = trend_data["list"][1]["data"][:314]
japan_data = trend_data["list"][2]["data"][:314]
print(f"\n2020年数据条数:{len(x_2020)}")
五、创建折线图(完整案例)
案例:2020年印美日新冠累计确诊人数对比图
import json
from pyecharts.charts import Line
from pyecharts import options as opts
# 模拟数据(实际项目中从JSON文件读取)
# 生成2020年日期(1月1日到12月31日)
dates = [f"2020-{m:02d}-{d:02d}" for m in range(1, 13) for d in range(1, 29)]
dates = dates[:314] # 取314天
# 模拟各国确诊数据
us_data = [i * 1000 + (i ** 2) for i in range(314)]
india_data = [i * 800 + (i ** 1.8) for i in range(314)]
japan_data = [i * 200 + (i ** 1.5) for i in range(314)]
print("=== 数据统计 ===")
print(f"日期范围:{dates[0]} 至 {dates[-1]}")
print(f"美国最终确诊数:{us_data[-1]:,}")
print(f"印度最终确诊数:{india_data[-1]:,}")
print(f"日本最终确诊数:{japan_data[-1]:,}")
# 创建折线图
line = Line()
# 添加x轴数据
line.add_xaxis(dates)
# 添加y轴数据(三条折线)
line.add_yaxis(
"美国🇺🇸",
us_data,
linestyle_opts=opts.LineStyleOpts(width=2, color="#EF553B"),
symbol="circle",
symbol_size=5,
label_opts=opts.LabelOpts(is_show=False), # 数据点太多,不显示标签
)
line.add_yaxis(
"印度🇮🇳",
india_data,
linestyle_opts=opts.LineStyleOpts(width=2, color="#636EFA"),
symbol="diamond",
symbol_size=5,
label_opts=opts.LabelOpts(is_show=False),
)
line.add_yaxis(
"日本🇯🇵",
japan_data,
linestyle_opts=opts.LineStyleOpts(width=2, color="#00CC96"),
symbol="triangle",
symbol_size=5,
label_opts=opts.LabelOpts(is_show=False),
)
# 设置全局配置
line.set_global_opts(
title_opts=opts.TitleOpts(
title="2020年 印🇮🇳美🇺🇸日🇯🇵 累计确诊人数对比图",
pos_left="center",
title_textstyle_opts=opts.TextStyleOpts(font_size=18)
),
xaxis_opts=opts.AxisOpts(
name="时间",
name_location="middle",
name_gap=35,
axislabel_opts=opts.LabelOpts(rotate=45, interval=30) # 标签旋转45度,每30个显示一个
),
yaxis_opts=opts.AxisOpts(
name="累计确诊人数",
name_location="middle",
name_gap=50,
axislabel_opts=opts.LabelOpts(formatter="{value}") # 格式化
),
tooltip_opts=opts.TooltipOpts(
trigger="axis", # 鼠标悬停触发
axis_pointer_type="shadow" # 阴影指示器
),
legend_opts=opts.LegendOpts(
pos_left="70%", # 图例位置
pos_top="5%",
item_width=30,
item_height=15
),
datazoom_opts=opts.DataZoomOpts( # 添加缩放控件
range_start=0,
range_end=100,
is_show=True
),
)
# 生成HTML文件
line.render("covid_comparison.html")
print("\n✅ 折线图已生成:covid_comparison.html")
print("请在浏览器中打开该文件查看可视化效果")
六、全局配置项详解
| 配置项 | 类 | 说明 | 常用参数 |
|---|---|---|---|
| 标题配置 | TitleOpts | 设置图表标题 | title, pos_left, pos_top |
| x轴配置 | AxisOpts | 设置x轴 | name, type_, axislabel_opts |
| y轴配置 | AxisOpts | 设置y轴 | name, type_, min_, max_ |
| 图例配置 | LegendOpts | 设置图例 | pos_left, pos_top, orient |
| 提示框配置 | TooltipOpts | 鼠标悬停提示 | trigger, axis_pointer_type |
| 缩放配置 | DataZoomOpts | 数据缩放控件 | range_start, range_end |
| 工具栏配置 | ToolboxOpts | 保存图片等工具 | is_show, feature |
配置示例
from pyecharts.charts import Line
from pyecharts import options as opts
line = Line()
line.add_xaxis(["A", "B", "C", "D"])
line.add_yaxis("数据", [10, 20, 30, 40])
line.set_global_opts(
# 标题配置
title_opts=opts.TitleOpts(
title="主标题",
subtitle="副标题",
pos_left="center",
title_textstyle_opts=opts.TextStyleOpts(font_size=20)
),
# x轴配置
xaxis_opts=opts.AxisOpts(
name="X轴名称",
axislabel_opts=opts.LabelOpts(rotate=45) # 标签旋转
),
# y轴配置
yaxis_opts=opts.AxisOpts(
name="Y轴名称",
min_=0, # 最小值
max_=50, # 最大值
is_show=True
),
# 图例配置
legend_opts=opts.LegendOpts(
pos_left="70%",
pos_top="5%",
orient="vertical" # 垂直排列
),
# 提示框配置
tooltip_opts=opts.TooltipOpts(
trigger="axis",
formatter="{b}: {c}" # 自定义格式
),
# 缩放控件
datazoom_opts=opts.DataZoomOpts(is_show=True),
)
line.render("config_demo.html")
七、系列配置项详解
| 配置项 | 类 | 说明 | 示例 |
|---|---|---|---|
| 线条样式 | LineStyleOpts | 设置线条颜色、宽度 | width=2, color="red" |
| 标记点 | symbol | 点的形状 | "circle", "diamond" |
| 标记点大小 | symbol_size | 点的大小 | symbol_size=8 |
| 标签 | LabelOpts | 是否显示数值 | is_show=True |
| 面积样式 | AreaStyleOpts | 填充面积 | opacity=0.3 |
| 平滑曲线 | is_smooth | 是否平滑 | is_smooth=True |
# 完整系列配置示例 line.add_yaxis( "数据", [10, 20, 30, 40], # 线条样式 linestyle_opts=opts.LineStyleOpts( width=3, # 线宽 color="red", # 颜色 type_="dashed" # 线条类型:solid, dashed, dotted ), # 标记点 symbol="circle", symbol_size=8, # 标签 label_opts=opts.LabelOpts( is_show=True, # 显示数值 position="top" # 位置:top, bottom, left, right ), # 平滑曲线 is_smooth=True, # 面积填充 areastyle_opts=opts.AreaStyleOpts( opacity=0.3 ), )
八、常用工具速查
1. JSON转换
| 操作 | 方法 | 示例 |
|---|---|---|
| Python → JSON | json.dumps() | json.dumps(data, ensure_ascii=False) |
| JSON → Python | json.loads() | json.loads(json_str) |
2. pyecharts导入
from pyecharts.charts import Line # 折线图 from pyecharts import options as opts # 配置项
3. 基础模板
from pyecharts.charts import Line
from pyecharts import options as opts
# 1. 创建图表对象
line = Line()
# 2. 添加数据
line.add_xaxis(x_data)
line.add_yaxis("系列名", y_data)
# 3. 设置配置
line.set_global_opts(
title_opts=opts.TitleOpts(title="标题"),
)
# 4. 生成文件
line.render("output.html")
4. 文件输出
# 生成HTML文件
line.render("文件名.html")
# 在Jupyter Notebook中直接显示
# line.render_notebook()
九、注意事项
-
数据清理:从网络获取的JSON数据可能带有JSONP回调函数,需要先清理
-
中文处理:
json.dumps()时需要添加ensure_ascii=False -
x轴标签过多:使用
axislabel_opts=opts.LabelOpts(rotate=45, interval=30) -
数据点过多:使用
DataZoomOpts添加缩放控件 -
HTML预览:生成的HTML文件需要用浏览器打开查看

6836

被折叠的 条评论
为什么被折叠?



