Python-可视化图表
json
在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互
json数据的格式---(字典或列表-列表中嵌套字典)
{'name':'admin','age':18}
[{'name':'admin','age':18},{'name':'root','age':16},{'name':'张三','age':20}]
python数据和json数据的相互转换
#导入json模块
#准备符合格式json格式要求的python数据
data = [{'name':'老王','age':16},{'name':'张三','age':20}]
#通过json.dumps(data)方法把python数据转化为了json数据
data = json.dumps(data)
#通过json.loads(data)方法把json数据转换为了python数据
data = json.loads(data)
pyecharts模块
网址:https://gallery.pyecharts.org/#/Dataset/dataset_pie
基础折线图
#基础折线图
#导包,导入line功能构建折线图对象
from pyecharts.options import TitleOpts,LegendOpts,ToolboxOpts
from pyecharts.charts import Line
#得到折线图对象
line = Line()
#添加x轴数据
line.add_xaxis(['中国','美国','英国'])
#添加y轴数据
line.add_yaxis('GDP',[30,20,10])
#设置全局配置项
line.set_global_opts(
title_opts=TitleOpts(title='GDP展示',pos_left='center',pos_top='1%'),
legend_opts=LegendOpts(is_show=True),
toolbox_opts=ToolboxOpts(is_show=True)
)
#生成图表
line.render()

全局配置更多见官方网站:pyecharts - A Python Echarts Plotting Library built with love.
数据处理
在数据可视化项目中,数据处理是连接原始数据与最终图表的关键桥梁。本节将围绕如何使用 Python 处理 JSON 数据,详细介绍数据读取、清洗、转换和分析的常见步骤,并提供完整的代码示例。
1. 读取 JSON 数据
Python 内置的 json 模块可以轻松处理 JSON 格式的数据。通常数据源来自本地文件或网络 API。
import json
从本地文件读取 JSON 数据
with open('data/us_data.json', 'r', encoding='UTF-8') as f:
json_str = f.read()
将 JSON 字符串转换为 Python 字典
data_dict = json.loads(json_str)
print(f"数据类型: {type(data_dict)}")
print(f"数据键: {data_dict.keys()}")
2. 数据清洗与提取
原始 JSON 数据往往结构复杂,包含冗余字段。我们需要提取出图表所需的特定数据,并进行清洗(如处理缺失值、格式转换)。
# 假设数据结构为:{"data": [{"trend": {"updateDate": [...], "list": [{"data": [...]}]}}]}
# 提取趋势数据
trend_data = data_dict['data'][0]['trend']
提取日期数据(x轴) - 取2020年的数据(前315个数据点)
x_data = trend_data['updateDate'][:315] # 日期列表
提取数值数据(y轴) - 取对应日期的确认数据
y_data = trend_data['list'][0]['data'][:315] # 数值列表
print(f"x轴数据长度: {len(x_data)}")
print(f"y轴数据长度: {len(y_data)}")
print(f"前5个日期: {x_data[:5]}")
print(f"前5个数值: {y_data[:5]}")
3. 数据转换与格式化
有时原始数据格式不适合直接可视化,需要进行转换:
- 日期格式化:将字符串日期转换为 datetime 对象
- 数值转换:处理字符串数字、科学计数法
- 数据筛选:过滤异常值、选择特定时间范围
from datetime import datetime
日期字符串转换示例
date_objects = []
for date_str in x_data[:10]: # 只转换前10个作为示例
try:
# 假设日期格式为 "2020-01-22"
dt = datetime.strptime(date_str, "%Y-%m-%d")
date_objects.append(dt.strftime("%Y/%m/%d")) # 转换为另一种格式
except ValueError:
date_objects.append(date_str) # 保持原格式
print("转换后的日期:", date_objects)
数值清洗示例:将字符串数字转换为浮点数
cleaned_y_data = []
for value in y_data[:10]:
if isinstance(value, str):
try:
cleaned_y_data.append(float(value))
except ValueError:
cleaned_y_data.append(0.0) # 转换失败则设为0
else:
cleaned_y_data.append(float(value))
print("清洗后的数值:", cleaned_y_data)
4. 数据分析与统计
在可视化前,可以先对数据进行基本的统计分析:
import statistics
基础统计信息
if y_data:
y_numeric = [float(v) for v in y_data if isinstance(v, (int, float, str))]
print("=== 数据统计 ===")
print(f"数据点数: {len(y_numeric)}")
print(f"最大值: {max(y_numeric):.2f}")
print(f"最小值: {min(y_numeric):.2f}")
print(f"平均值: {statistics.mean(y_numeric):.2f}")
print(f"中位数: {statistics.median(y_numeric):.2f}")
计算7日移动平均(平滑数据)
window_size = 7
moving_avg = []
for i in range(len(y_numeric) - window_size + 1):
window = y_numeric[i:i + window_size]
moving_avg.append(sum(window) / window_size)
print(f"7日移动平均计算完成,共{len(moving_avg)}个点")</code></pre>
5. 完整数据处理流程示例
以下是将上述步骤整合的完整示例,可直接用于 pyecharts 数据准备:
import json
from datetime import datetime
import statistics
def process_json_data(file_path):
"""处理JSON数据的完整流程"""
1. 读取数据
with open(file_path, 'r', encoding='utf-8') as f:
json_str = f.read()
2. 解析JSON
data_dict = json.loads(json_str)
3. 提取所需数据
trend_data = data_dict['data'][0]['trend']
4. 获取原始数据
raw_dates = trend_data['updateDate'][:315] # 2020年数据
raw_values = trend_data['list'][0]['data'][:315]
5. 数据清洗和转换
processed_data = []
for date_str, value in zip(raw_dates, raw_values):
# 日期格式化
try:
dt = datetime.strptime(date_str, "%Y-%m-%d")
formatted_date = dt.strftime("%m/%d") # 简化为月/日
except:
formatted_date = date_str
# 数值转换
try:
numeric_value = float(value)
except:
numeric_value = 0.0
processed_data.append({
'date': formatted_date,
'value': numeric_value,
'original_date': date_str
})
6. 分离x轴和y轴数据
x_axis = [item['date'] for item in processed_data]
y_axis = [item['value'] for item in processed_data]
7. 返回处理结果
return {
'x_data': x_axis,
'y_data': y_axis,
'raw_count': len(raw_dates),
'processed_count': len(processed_data),
'max_value': max(y_axis) if y_axis else 0,
'min_value': min(y_axis) if y_axis else 0
}
使用示例
if name == "main":
result = process_json_data('data/us_data.json')
print(f"处理完成!共处理 {result['raw_count']} 条数据")
print(f"x轴数据示例: {result['x_data'][:5]}")
print(f"y轴数据示例: {result['y_data'][:5]}")
print(f"最大值: {result['max_value']}, 最小值: {result['min_value']}")
数据处理要点总结:
错误处理:始终对文件读取、JSON解析、数据转换添加异常处理
数据验证:检查数据长度一致性、类型正确性
性能考虑:大数据集使用生成器或分块处理
可复用性:将处理逻辑封装为函数,便于不同数据源调用
经过上述处理,我们得到了干净、格式统一的 x_data 和 y_data,可以直接传递给 pyecharts 创建折线图。
创建折线图
在前面的「数据处理」章节中,我们已经得到了清洗和格式化后的 x_data(日期列表)和 y_data(数值列表)。本节将使用这些数据,通过 pyecharts 创建一个功能完整的交互式折线图。
完整折线图实战代码
以下代码示例展示了如何使用 pyecharts 构建一个包含标题、坐标轴标签、数据标签、工具箱等完整配置的折线图,并生成可交互的 HTML 文件。
from pyecharts.charts import Line
from pyecharts import options as opts
from pyecharts.globals import ThemeType
假设这是从「数据处理」章节得到的 x_data 和 y_data
这里使用示例数据,实际项目中应替换为 process_json_data 函数的返回结果
x_data = ["01/22", "01/23", "01/24", "01/25", "01/26", "01/27", "01/28", "01/29", "01/30", "01/31"]
y_data = [1.0, 2.0, 5.0, 8.0, 12.0, 20.0, 30.0, 45.0, 60.0, 80.0]
1. 创建折线图对象,并设置主题
line_chart = Line(init_opts=opts.InitOpts(theme=ThemeType.LIGHT, width="1000px", height="600px"))
2. 添加 x 轴数据
line_chart.add_xaxis(xaxis_data=x_data)
3. 添加 y 轴数据系列
line_chart.add_yaxis(
series_name="数据趋势", # 系列名称,会显示在图例中
y_axis=y_data,
# 折线样式配置
linestyle_opts=opts.LineStyleOpts(width=3, color="#5470c6"),
# 标记点样式(数据点)
symbol="circle",
symbol_size=8,
itemstyle_opts=opts.ItemStyleOpts(color="#5470c6", border_width=2),
# 标签配置(在数据点上显示数值)
label_opts=opts.LabelOpts(is_show=True, position="top", formatter="{c}"),
# 区域填充样式(折线下方填充颜色)
areastyle_opts=opts.AreaStyleOpts(opacity=0.1, color="#5470c6"),
# 平滑曲线
is_smooth=True,
)
4. 设置全局配置项
line_chart.set_global_opts(
# 标题配置
title_opts=opts.TitleOpts(
title="2020年数据趋势折线图",
subtitle="基于 JSON 数据处理结果",
title_textstyle_opts=opts.TextStyleOpts(font_size=20, color="#333"),
subtitle_textstyle_opts=opts.TextStyleOpts(font_size=14, color="#666"),
pos_left="center",
pos_top="10px",
),
# 图例配置
legend_opts=opts.LegendOpts(
is_show=True,
pos_left="left",
pos_top="50px",
orient="vertical", # 垂直排列
),
# 工具箱配置(右侧工具栏)
toolbox_opts=opts.ToolboxOpts(
is_show=True,
pos_left="right",
pos_top="10px",
feature={
"saveAsImage": opts.ToolBoxFeatureSaveAsImageOpts(title="保存为图片", type="png", pixel_ratio=2),
"restore": opts.ToolBoxFeatureRestoreOpts(title="还原"),
"dataView": opts.ToolBoxFeatureDataViewOpts(title="数据视图", lang=["数据视图", "关闭", "刷新"]),
"dataZoom": opts.ToolBoxFeatureDataZoomOpts(zoom_title="区域缩放", back_title="还原缩放"),
"magicType": opts.ToolBoxFeatureMagicTypeOpts(
type_=["line", "bar", "stack"], title={"line": "折线图", "bar": "柱状图", "stack": "堆叠"}
),
},
),
# 提示框配置(鼠标悬停时显示)
tooltip_opts=opts.TooltipOpts(
trigger="axis",
axis_pointer_type="cross",
background_color="rgba(245, 245, 245, 0.8)",
border_width=1,
border_color="#ccc",
),
# 坐标轴配置
xaxis_opts=opts.AxisOpts(
name="日期",
name_location="middle",
name_gap=30,
axislabel_opts=opts.LabelOpts(rotate=45), # x 轴标签旋转 45 度,避免重叠
axistick_opts=opts.AxisTickOpts(is_align_with_label=True),
),
yaxis_opts=opts.AxisOpts(
name="数值",
name_location="middle",
name_gap=50,
axislabel_opts=opts.LabelOpts(formatter="{value}"),
splitline_opts=opts.SplitLineOpts(is_show=True, linestyle_opts=opts.LineStyleOpts(type_="dashed")),
),
# 区域缩放配置
datazoom_opts=[
opts.DataZoomOpts(range_start=0, range_end=100), # 底部滑动条
opts.DataZoomOpts(type_="inside", range_start=0, range_end=100), # 内置缩放
],
)
5. 渲染图表并保存为 HTML 文件
output_file = "line_chart.html"
line_chart.render(output_file)
print(f"折线图已生成,文件保存为: {output_file}")
print("请在浏览器中打开该文件查看交互式图表。")
代码详解与配置说明
1. 图表初始化
Line(init_opts=opts.InitOpts(...)):创建折线图对象,可设置主题、画布尺寸等。ThemeType.LIGHT:使用浅色主题,另有DARK、CHALK等可选。
2. 数据系列配置
add_yaxis:添加一个数据系列,关键参数包括:series_name:系列名称,显示在图例中。linestyle_opts:折线样式(宽度、颜色)。label_opts:数据标签配置(is_show=True显示数值)。areastyle_opts:折线下方区域填充,增强视觉层次。is_smooth:平滑曲线,使趋势更柔和。
3. 全局配置项
- 标题:主标题和副标题,可设置位置、字体样式。
- 图例:控制系列名称的显示与位置。
- 工具箱:提供保存图片、数据视图、缩放、图表类型切换等交互功能。
- 提示框:鼠标悬停时显示详细数据。
- 坐标轴:设置轴名称、标签格式、网格线等。
- 区域缩放:通过滑动条或鼠标滚轮缩放查看数据细节。
4. 输出与交互
render("line_chart.html"):生成独立的 HTML 文件,包含完整的 ECharts JavaScript 库。- 生成的 HTML 可在浏览器中直接打开,图表支持缩放、拖拽、悬停查看数值、切换图表类型等交互操作。
与数据处理章节的衔接
在实际项目中,只需将「数据处理」章节中 process_json_data 函数返回的 x_data 和 y_data 替换示例代码中的占位数据即可:
# 导入数据处理函数
from data_processor import process_json_data
处理 JSON 数据,得到 x_data 和 y_data
result = process_json_data("data/us_data.json")
x_data = result["x_data"]
y_data = result["y_data"]
使用处理后的数据创建折线图
line_chart.add_xaxis(xaxis_data=x_data)
line_chart.add_yaxis(series_name="数据趋势", y_axis=y_data, ...)
这样,我们就完成了从 JSON 数据读取、清洗、转换到可视化展示的完整流程。
更多推荐
所有评论(0)