这里写目录
数据可视化实验报告:数据可视化交互
一、引言与实验原理
在设计可视化系统或选取交互方式时,除完成基础任务外,还需遵循核心原则以保障用户体验。例如,交互延迟需控制在用户可接受范围内,并有效降低交互成本,这些原则对交互效果起着决定性作用。
本次实验聚焦文本数据可视化,通过生成词云图片与传统统计技术进行对比分析。交互原则、分类及常见技术(尤其是典型交互技术)的熟练运用,是设计优质可视化应用的关键。需注意的是,交互技术本身无优劣之分,其选择需紧密结合具体场景与应用需求。
二、实验目的与实验环境
(一)实验目的
- 理解数据可视化的核心原则(如准确性、简洁性、一致性)。
- 掌握数据可视化的分类体系(如静态可视化、动态交互可视化)。
- 熟练运用Python的Pyecharts库实现常见可视化技术(如条形图、饼图、地理图表)。
- 对全国城市空气质量数据进行多维度可视化分析,并与传统统计方法进行对比。
(二)实验环境
- 操作系统:Windows 11
- Python版本:3.11.5
- 主要工具库:Pyecharts(数据可视化)、Pandas(数据处理)
三、实验步骤
(一)数据可视化的核心原则
数据可视化旨在通过视觉设计实现复杂数据的直观呈现,其核心原则包括:
- 准确性:确保数据呈现真实反映原始信息,避免比例扭曲或冗余干扰。例如,合理设置图表坐标轴刻度,保证视觉元素与数据本质一致。
- 简洁性:剔除冗余装饰,聚焦核心信息。通过精简配色、清晰标签和简洁布局降低认知负担,如使用单色系柱状图替代复杂3D图表。
- 一致性:统一色彩、字体、符号等视觉元素,增强跨图表的认知关联性,提升专业度与用户理解效率。
- 美学与功能平衡:采用自然配色与合理对比提升视觉吸引力,同时避免过度设计导致信息失真。例如,使用色盲友好配色并结合纹理标记,兼顾美观与可访问性。
- 交互性与叙事性:通过悬停提示、动态筛选等交互功能支持用户自主探索数据;借助时间轴动画、逻辑叙事等方式引导用户理解数据内涵,实现从数据展示到决策支持的跨越。
(二)实验任务
实验1:AQI横向对比条形图
- 任务:使用Pyecharts绘制各城市AQI值的横向条形图,要求按AQI降序排列,添加全局标题“城市AQI对比”及坐标轴标签,用MarkLine标记均值线(参考值:80),并通过颜色区分高于/低于均值的城市。
- 代码与结果:
from pyecharts import options as opts
from pyecharts.charts import Bar
# 读取数据文件
data_path = r"E:\technology\The_eight_theaper\data.txt"
with open(data_path, "r", encoding="utf-8") as f:
data_str = f.read().strip()
# 解析数据
data_list = [item.strip(' "') for item in data_str.split(",") if item.strip()]
cities = []
aqi_values = []
for i in range(0, len(data_list), 2):
if i+1 < len(data_list): # 确保有对应的AQI值
cities.append(data_list[i])
aqi_values.append(int(data_list[i+1]))
# 按AQI从高到低排序
combined = list(zip(cities, aqi_values))
sorted_combined = sorted(combined, key=lambda x: x[1], reverse=True)
sorted_cities, sorted_aqi = zip(*sorted_combined)
# 创建横向条形图
bar = (
Bar(init_opts=opts.InitOpts(width="1200px", height="800px"))
.add_xaxis(list(sorted_cities))
.add_yaxis(
"AQI指数",
list(sorted_aqi),
label_opts=opts.LabelOpts(position="right"),
itemstyle_opts=opts.ItemStyleOpts(
color=lambda params: "#FF4500" if params.value > 80 else "#32CD32"
),
)
.reversal_axis()
.set_global_opts(
title_opts=opts.TitleOpts(title="城市AQI对比"),
xaxis_opts=opts.AxisOpts(name="AQI指数"),
yaxis_opts=opts.AxisOpts(name="城市"),
datazoom_opts=[opts.DataZoomOpts(type_="inside")], # 添加缩放功能
)
.set_series_opts(
markline_opts=opts.MarkLineOpts(
data=[opts.MarkLineItem(y=80, name="AQI均值")],
linestyle_opts=opts.LineStyleOpts(
color="#000000",
width=2,
type_="dashed" # 注意这里是type_而不是linetype
),
label_opts=opts.LabelOpts(position="middle", formatter="均值: 80"),
)
)
)
# 渲染图表
bar.render("1.html")
print("图表已成功生成:1.html")
实验结果:

实验2:AQI等级分布饼图
- 任务:基于AQI等级(优/良/轻度污染/中度污染/重度污染)绘制饼图,要求显示各等级城市数量占比,标签展示百分比与等级名称,突出显示最大扇区,并添加点击事件以弹出城市列表。
- 代码与结果:
# 代码片段(完整代码见原报告) pie.set_series_opts( tooltip_opts=opts.TooltipOpts( trigger="item", formatter=JsCode("function(params){...}") ) ) pie.render("2.html")

实验3:多城市AQI对比仪表盘
- 任务:使用Tab组件构建多图表仪表盘,包含AQI前10城市条形图、西北与东部城市散点对比(含回归线)、地区AQI趋势折线图,所有图表共享暗黑主题。
- 代码与结果:
import pandas as pd
import numpy as np
from pyecharts import options as opts
from pyecharts.charts import Bar, Tab, Scatter, Line
from pyecharts.commons.utils import JsCode
from scipy import stats
with open(r'E:\technology\The_eight_theaper\data.txt', 'r', encoding='utf-8') as f:
data = [x.strip() for x in f.read().strip().split(',')]
data = [x for x in data if x]
cities = [city.strip('"') for city in data[::2] if city.strip('"')]
aqi_values = [int(x) for x in data[1::2] if x.strip()]
if len(cities) != len(aqi_values):
print(f"警告:城市数量({len(cities)})和AQI值数量({len(aqi_values)})不匹配")
else:
print(f"数据读取成功:共{len(cities)}个城市")
df = pd.DataFrame({'City': cities, 'AQI': aqi_values})
def assign_region(city):
northwest_provinces = ['西安', '延安', '咸阳', '铜川', '渭南', '宝鸡', # 陕西
'兰州', '嘉峪关', '金昌', # 甘肃
'西宁', # 青海
'银川', '石嘴山', # 宁夏
'乌鲁木齐', '克拉玛依', '库尔勒'] # 新疆
east_provinces = ['北京', '天津', # 直辖市
'石家庄', '唐山', '秦皇岛', '邯郸', '邢台', '保定', '张家口', '承德', '沧州', '廊坊', '衡水', # 河北
'上海', # 上海
'南京', '无锡', '徐州', '常州', '苏州', '南通', '连云港', '淮安', '盐城', '扬州', '镇江', '泰州', '宿迁', # 江苏
'杭州', '宁波', '温州', '嘉兴', '湖州', '绍兴', '金华', '衢州', '舟山', '台州', '丽水', # 浙江
'福州', '厦门', '泉州', # 福建
'济南', '青岛', '淄博', '枣庄', '东营', '烟台', '潍坊', '济宁', '泰安', '威海', '日照', # 山东
'广州', '深圳', '珠海', '汕头', '韶关', '惠州', '东莞', '中山', '江门', # 广东
'海口', '三亚'] # 海南
if city in northwest_provinces:
return '西北'
elif city in east_provinces:
return '东部'
else:
return '其他'
df['Region'] = df['City'].apply(assign_region)
theme_style = {
"backgroundColor": "#ffffff",
"textStyle": {"color": "#333"},
"title": {"textStyle": {"color": "#333"}},
}
def create_bar_chart():
top_10 = df.nlargest(10, 'AQI')
bar = (
Bar()
.add_xaxis(top_10['City'].tolist())
.add_yaxis("AQI指数", top_10['AQI'].tolist())
.reversal_axis()
.set_global_opts(
title_opts=opts.TitleOpts(title="AQI前10城市排名"),
xaxis_opts=opts.AxisOpts(name="城市"),
yaxis_opts=opts.AxisOpts(name="AQI指数")
)
)
return bar
def create_scatter_chart():
northwest = df[df['Region'] == '西北']
east = df[df['Region'] == '东部']
scatter = (
Scatter()
.add_xaxis(list(range(len(northwest))))
.add_yaxis("西北城市", northwest['AQI'].tolist(),
markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]))
.add_yaxis("东部城市", east['AQI'].tolist(),
markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]))
.set_global_opts(
title_opts=opts.TitleOpts(title="西北与东部城市AQI对比"),
xaxis_opts=opts.AxisOpts(name="城市序号"),
yaxis_opts=opts.AxisOpts(name="AQI指数")
)
)
return scatter
def create_line_chart():
region_aqi = df.groupby('Region')['AQI'].mean()
line = (
Line()
.add_xaxis(region_aqi.index.tolist())
.add_yaxis("地区平均AQI", region_aqi.values.tolist(),
markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")]))
.set_global_opts(
title_opts=opts.TitleOpts(title="各地区AQI指数对比"),
xaxis_opts=opts.AxisOpts(name="地区"),
yaxis_opts=opts.AxisOpts(name="平均AQI指数")
)
)
return line
tab = Tab()
tab.add(create_bar_chart(), "AQI前10城市")
tab.add(create_scatter_chart(), "西北vs东部城市对比")
tab.add(create_line_chart(), "地区AQI趋势")
tab.render('3.html')
- AQI前十城市排名:

- 西北VS东部城市对比:


实验4:2D地理AQI可视化
- 任务:利用Geo组件在中国地图上标记城市位置,通过颜色深浅表示AQI值高低,直观展示空间分布。
- 代码与结果:
from pyecharts import options as opts
from pyecharts.charts import Geo
from pyecharts.globals import GeoType, ThemeType
import re
# 原始数据字符串
data_str = '''"海门", 9
"鄂尔多斯", 12
"招远", 12
"舟山", 12
"齐齐哈尔", 14
"盐城", 15
"赤峰", 16
"青岛", 18
"乳山", 18
"金昌", 19
"泉州", 21
"莱西", 21
"日照", 21
"胶南", 22
"南通", 23
"拉萨", 140
"云浮", 24
"梅州", 25
"文登", 25
"上海", 25
"攀枝花", 25
"威海", 25
"承德", 25
"厦门", 26
"汕尾", 26
"潮州", 26
"丹东", 27
"太仓", 27
"曲靖", 27
"烟台", 28
"福州", 29
"瓦房店", 30
"即墨", 30
"抚顺", 31
"玉溪", 31
"张家口", 31
"阳泉", 31
"莱州", 32
"湖州", 32
"汕头", 32
"昆山", 33
"宁波", 33
"湛江", 33
"揭阳", 34
"荣成", 34
"连云港", 35
"葫芦岛", 35
"常熟", 36
"东莞", 36
"河源", 36
"淮安", 36
"泰州", 36
"南宁", 37
"营口", 37
"惠州", 37
"江阴", 37
"蓬莱", 37
"韶关", 38
"嘉峪关", 38
"广州", 38
"延安", 38
"太原", 39
"清远", 39
"中山", 39
"昆明", 39
"寿光", 40
"盘锦", 40
"长治", 41
"深圳", 41
"珠海", 42
"宿迁", 43
"咸阳", 43
"铜川", 44
"平度", 44
"佛山", 44
"海口", 44
"江门", 45
"章丘", 45
"肇庆", 46
"大连", 47
"临汾", 47
"吴江", 47
"石嘴山", 49
"沈阳", 50
"苏州", 50
"茂名", 50
"嘉兴", 51
"长春", 51
"胶州", 52
"银川", 52
"张家港", 52
"三门峡", 53
"锦州", 54
"南昌", 54
"柳州", 54
"三亚", 54
"自贡", 56
"吉林", 56
"阳江", 57
"泸州", 57
"西宁", 57
"宜宾", 58
"呼和浩特", 58
"成都", 58
"大同", 58
"镇江", 59
"桂林", 59
"张家界", 59
"宜兴", 59
"北海", 60
"西安", 61
"金坛", 62
"东营", 62
"牡丹江", 63
"遵义", 63
"绍兴", 63
"扬州", 64
"常州", 64
"潍坊", 65
"重庆", 66
"台州", 67
"南京", 67
"滨州", 70
"贵阳", 71
"无锡", 71
"本溪", 71
"克拉玛依", 72
"渭南", 72
"马鞍山", 72
"宝鸡", 72
"焦作", 75
"句容", 75
"北京", 79
"徐州", 79
"衡水", 80
"包头", 80
"绵阳", 80
"乌鲁木齐", 84
"枣庄", 84
"杭州", 84
"淄博", 85
"鞍山", 86
"溧阳", 86
"库尔勒", 86
"安阳", 90
"开封", 90
"济南", 92
"德阳", 93
"温州", 95
"九江", 96
"邯郸", 98
"临安", 99
"兰州", 99
"沧州", 100
"临沂", 103
"南充", 104
"天津", 105
"富阳", 106
"泰安", 112
"诸暨", 112
"郑州", 113
"哈尔滨", 114
"聊城", 116
"芜湖", 117
"唐山", 119
"平顶山", 119
"邢台", 119
"德州", 120
"济宁", 120
"荆州", 127
"宜昌", 130
"义乌", 132
"丽水", 133
"洛阳", 134
"秦皇岛", 136
"株洲", 143
"石家庄", 147
"莱芜", 148
"常德", 152
"保定", 153
"湘潭", 154
"金华", 157
"岳阳", 169
"长沙", 175
"衢州", 177
"廊坊", 193
"菏泽", 194
"合肥", 229
"武汉", 273
"大庆", 279'''
# 解析数据
data_list = []
for line in data_str.split('\n'):
line = line.strip()
if not line:
continue
city = re.findall(r'"(.*?)"', line)[0]
aqi = int(re.search(r',\s*(\d+)', line).group(1))
data_list.append((city, aqi))
# 完整城市坐标字典(包含所有数据中的城市)
city_coords = {
"海门": (121.15, 31.89), "鄂尔多斯": (109.78, 39.61), "招远": (120.38, 37.35),
"舟山": (122.21, 29.99), "齐齐哈尔": (123.97, 47.33), "盐城": (120.13, 33.38),
"赤峰": (118.87, 42.28), "青岛": (120.33, 36.07), "乳山": (121.52, 36.89),
"金昌": (102.18, 38.52), "泉州": (118.58, 24.90), "莱西": (120.53, 36.86),
"日照": (119.46, 35.42), "胶南": (120.19, 35.88), "南通": (120.85, 32.08),
"拉萨": (91.11, 29.97), "云浮": (112.02, 22.93), "梅州": (116.10, 24.55),
"文登": (122.05, 37.20), "上海": (121.48, 31.22), "攀枝花": (101.71, 26.58),
"威海": (122.10, 37.50), "承德": (117.93, 40.97), "厦门": (118.10, 24.46),
"汕尾": (115.37, 22.78), "潮州": (116.63, 23.68), "丹东": (124.37, 40.13),
"太仓": (121.10, 31.45), "曲靖": (103.79, 25.51), "烟台": (121.39, 37.52),
"福州": (119.30, 26.08), "瓦房店": (121.94, 39.62), "即墨": (120.45, 36.38),
"抚顺": (124.20, 41.88), "玉溪": (102.52, 24.35), "张家口": (114.88, 40.82),
"阳泉": (113.57, 37.85), "莱州": (120.05, 37.17), "湖州": (120.10, 30.86),
"汕头": (116.69, 23.39), "昆山": (120.95, 31.39), "宁波": (121.56, 29.86),
"湛江": (110.35, 21.27), "揭阳": (116.58, 23.56), "荣成": (122.41, 37.10),
"连云港": (119.16, 34.59), "葫芦岛": (120.82, 40.72), "常熟": (120.74, 31.64),
"东莞": (113.75, 23.04), "河源": (114.68, 23.73), "淮安": (119.15, 33.50),
"泰州": (119.90, 32.49), "南宁": (108.33, 22.84), "营口": (122.18, 40.65),
"惠州": (114.40, 23.09), "江阴": (120.26, 31.91), "蓬莱": (120.75, 37.80),
"韶关": (113.62, 24.84), "嘉峪关": (98.28, 39.77), "广州": (113.23, 23.16),
"延安": (109.48, 36.60), "太原": (112.53, 37.87), "清远": (113.03, 23.70),
"中山": (113.38, 22.52), "昆明": (102.73, 25.04), "寿光": (118.73, 36.86),
"盘锦": (122.07, 41.11), "长治": (113.08, 36.18), "深圳": (114.07, 22.62),
"珠海": (113.52, 22.30), "宿迁": (118.30, 33.96), "咸阳": (108.72, 34.35),
"铜川": (109.11, 35.09), "平度": (119.97, 36.77), "佛山": (113.11, 23.05),
"海口": (110.35, 20.02), "江门": (113.06, 22.58), "章丘": (117.53, 36.72),
"肇庆": (112.44, 23.05), "大连": (121.62, 38.92), "临汾": (111.50, 36.08),
"吴江": (120.63, 31.16), "石嘴山": (106.39, 39.04), "沈阳": (123.38, 41.80),
"苏州": (120.62, 31.32), "茂名": (110.92, 21.68), "嘉兴": (120.76, 30.77),
"长春": (125.35, 43.88), "胶州": (120.03, 36.26), "银川": (106.27, 38.47),
"张家港": (120.55, 31.88), "三门峡": (111.19, 34.76), "锦州": (121.15, 41.13),
"南昌": (115.89, 28.68), "柳州": (109.40, 24.33), "三亚": (109.51, 18.25),
"自贡": (104.77, 29.33), "吉林": (126.57, 43.87), "阳江": (111.95, 21.85),
"泸州": (105.39, 28.91), "西宁": (101.74, 36.56), "宜宾": (104.56, 29.77),
"呼和浩特": (111.65, 40.82), "成都": (104.06, 30.67), "大同": (113.30, 40.08),
"镇江": (119.45, 32.20), "桂林": (110.28, 25.29), "张家界": (110.47, 29.11),
"宜兴": (119.82, 31.36), "北海": (109.12, 21.49), "西安": (108.95, 34.27),
"金坛": (119.56, 31.74), "东营": (118.49, 37.46), "牡丹江": (129.58, 44.60),
"遵义": (106.93, 27.70), "绍兴": (120.58, 30.01), "扬州": (119.42, 32.39),
"常州": (119.95, 31.79), "潍坊": (119.10, 36.62), "重庆": (106.55, 29.57),
"台州": (121.42, 28.66), "南京": (118.78, 32.04), "滨州": (117.95, 37.36),
"贵阳": (106.71, 26.57), "无锡": (120.29, 31.59), "本溪": (123.73, 41.30),
"克拉玛依": (84.87, 45.59), "渭南": (109.50, 34.52), "马鞍山": (118.48, 31.70),
"宝鸡": (107.15, 34.38), "焦作": (113.29, 35.24), "句容": (119.16, 31.95),
"北京": (116.40, 39.90), "徐州": (117.12, 34.22), "衡水": (115.72, 37.73),
"徐州": (117.12, 34.22), "衡水": (115.72, 37.73), "包头": (109.80, 40.65),
"绵阳": (104.73, 31.48), "乌鲁木齐": (87.68, 43.77), "枣庄": (117.57, 34.85),
"杭州": (120.19, 30.26), "淄博": (118.05, 36.78), "鞍山": (122.85, 41.12),
"溧阳": (119.48, 31.45), "库尔勒": (86.06, 41.68), "安阳": (114.35, 36.10),
"开封": (114.35, 34.79), "济南": (117.02, 36.65), "德阳": (104.37, 31.13),
"温州": (120.65, 28.01), "九江": (115.97, 29.71), "邯郸": (114.47, 36.60),
"临安": (119.72, 30.23), "兰州": (103.73, 36.03), "沧州": (116.83, 38.30),
"临沂": (118.35, 35.05), "南充": (106.08, 30.80), "天津": (117.20, 39.13),
"富阳": (119.95, 30.07), "泰安": (117.13, 36.18), "诸暨": (120.23, 29.75),
"郑州": (113.65, 34.76), "哈尔滨": (126.63, 45.75), "聊城": (115.97, 36.45),
"芜湖": (118.38, 31.33), "唐山": (118.02, 39.63), "平顶山": (113.29, 33.75),
"邢台": (114.48, 37.05), "德州": (116.30, 37.45), "济宁": (116.59, 35.38),
"荆州": (112.23, 30.33), "宜昌": (111.30, 30.70), "义乌": (120.06, 29.32),
"丽水": (119.92, 28.45), "洛阳": (112.44, 34.70), "秦皇岛": (119.57, 39.95),
"株洲": (113.10, 27.83), "石家庄": (114.48, 38.03), "莱芜": (117.67, 36.19),
"常德": (111.69, 29.05), "保定": (115.48, 38.85), "湘潭": (112.91, 27.87),
"金华": (119.64, 29.10), "岳阳": (113.09, 29.37), "长沙": (113.00, 28.21),
"衢州": (118.88, 28.97), "廊坊": (116.70, 39.53), "菏泽": (115.48, 35.24),
"合肥": (117.27, 31.86), "武汉": (114.31, 30.52), "大庆": (124.93, 46.58),
}
# ---------------------- 绘制 Geo 图表 ----------------------
def create_geo_aqi():
c = (
Geo(init_opts=opts.InitOpts(
theme=ThemeType.CHALK,
width="3600px",
height="2400px",
page_title="中国城市AQI地理分布"
))
.add_schema(
maptype="china", # 中国地图
itemstyle_opts=opts.ItemStyleOpts(
color="#F0F0F0", # 地图背景色
border_color="#DDDDDD"
),
label_opts=opts.LabelOpts(is_show=False) # 隐藏地图标签
)
)
# 手动注册所有城市坐标
for city, (lon, lat) in city_coords.items():
c.add_coordinate(city, lon, lat)
# 过滤有效数据
valid_data = [(city, aqi) for city, aqi in data_list if city in city_coords]
if not valid_data:
print("警告:无有效数据可展示")
return None
# 添加散点图(带AQI数值标签)
c.add(
series_name="城市AQI",
type_=GeoType.SCATTER,
data_pair=valid_data,
symbol_size=lambda x: x * 0.3, # 按AQI值缩放标记大小
label_opts=opts.LabelOpts(
is_show=True,
formatter="{b}: {c}", # 显示城市名和AQI值
position="right"
),
)
# 添加热力图
c.add(
series_name="AQI热力分布",
type_=GeoType.HEATMAP,
data_pair=valid_data,
blur_size=20, # 调整热力图模糊度
)
# 添加涟漪效果(突出高AQI城市)
c.add(
series_name="高AQI涟漪",
type_=GeoType.EFFECT_SCATTER,
data_pair=valid_data,
symbol_size=lambda x: x * 0.5, # 更大的基础尺寸
effect_opts=opts.EffectOpts(
scale=4, # 涟漪扩散倍数
period=4, # 涟漪周期
color="#FF4D4F" # 红色涟漪
),
)
# 设置全局配置
c.set_global_opts(
title_opts=opts.TitleOpts(
title="中国城市AQI二维地理可视化",
subtitle="(点大小/颜色反映AQI值,涟漪代表高污染区域)",
pos_left="center",
title_textstyle_opts=opts.TextStyleOpts(color="#2c3440")
),
visualmap_opts=opts.VisualMapOpts(
is_piecewise=False,
max_=max(aqi for _, aqi in valid_data),
min_=min(aqi for _, aqi in valid_data),
range_color=[
"#B5E8FF", "#66CDFF", "#00B0F0", # 低AQI颜色
"#007FFF", "#0040FF", "#4B0082", # 中AQI颜色
"#8B00FF", "#FF00FF", "#FF0000" # 高AQI颜色
],
range_text=["严重污染", "优"],
pos_right="5%",
pos_top="10%",
textstyle_opts=opts.TextStyleOpts(color="#404040")
),
legend_opts=opts.LegendOpts(is_show=False),
tooltip_opts=opts.TooltipOpts(
trigger="item",
formatter="{b}<br>AQI: {c}"
)
)
return c
# ---------------------- 渲染图表 ----------------------
if __name__ == "__main__":
geo_chart = create_geo_aqi()
if geo_chart:
geo_chart.render("4.html")
print("图表已生成,文件路径:4.html")
else:
print("生成图表失败")

实验5:3D地理AQI可视化
- 任务:结合Geo3D与Bar3D组件,在地球模型上以柱体高度表示AQI值,配置光照效果突出中国区域,实现三维空间数据展示。
- 代码与结果:
# 代码片段(完整代码见原报告) styler = pdk.Deck(layers=[earth_surface, border_layer, aqi_layer], ...) styler.to_html("5.html")
四、总结与心得
本次实验基于Python的Pyecharts库,对全国城市空气质量数据进行了多维度可视化分析,涵盖条形图、饼图、地理图表等多种类型,并融入交互功能设计(如动态提示、多图表联动)。通过实践,深入理解了数据可视化的准确性、简洁性等核心原则,掌握了从数据清洗、图表绘制到交互实现的完整流程。
1086

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



