欢迎来到汐汐的博客

时间数据的可视化

一、实验目的

1、掌握时间数据在大数据中的应用
2、掌握时间数据可视化图表表示
3、利用Python程序实现堆叠柱形图可视化

二、实验原理

      时间是一个非常重要的维度与属性。时间序列数据存在于社会的各个领域,如:天文观测数据、气象图像、临床诊断记录等。诊断记录包括病人的每次看病的病情记录以及心电图等扫描仪器的数据记录等。金融和商业交易记录如股市每天的交易价格及交易量、超市中每种商品的销售情况等。不管是延续性还是暂时性的时间数据,可视化的最终的目的就是从中发现趋势。时间型数据包含时间属性,不仅要表达数据随时间变化的规律,还需表达数据分布的时间规律。它可以分为连续性和离散型时间数据。这里就讲述下离散型数据的堆叠柱形图,堆叠柱形图的几何形状和常规柱形图很相似,在柱形图中,数据值为并行排列,而在堆叠柱图则是一个个叠加起来的。它的特点就是如果数据存在子分类,并且这些子分类相加有意义的话,此时就可以使用堆叠柱形图来表示。本次实验结合本章讲述的堆叠柱形图的列子,这里我们要画的是极坐标系-堆叠柱状图,也是南丁格尔玫瑰图。由于半径和面积的关系是平方的关系,南丁格尔玫瑰图会将数据的比例大小夸大,尤其适合对比大小相近的数值;由于圆形有周期的特性,所以玫瑰图也适用于表示一个周期内的时间概念,比如星期、月份。下面就用 Python 程序来实现。

三、实验环境

     OS:Windows
     Python:v3.11.5

四、实验步骤

1、下载数据源(http://datasets.flowingdata.com/hot-dog-places.csv)历年热狗大胃王比赛的前三名的成绩。
里面的数据格式如下:
把hot-dog-places.csv文件保存在自己的目录里面。比如(D:\数据可视化\)
2. 打开cmd ,安装Python所需要的第三方的包,输入pip install pyecharts
3. 打开Python3.11.5 IDEL

点击 new File
在上面的界面开始编写程序。
4. 开始编写程序实现极坐标的堆叠柱形图
 1 from pyecharts.charts import Polar, Page
 2 from pyecharts import options as opts
 3 import csv
 4 
 5 # 创建一个页面对象
 6 page = Page()
 7 
 8 # 指定CSV文件的绝对路径
 9 filename = "D:/数据可视化/hot-dog-places.csv"
10 
11 # 读取CSV文件中的数据
12 data_rows = []
13 with open(filename, encoding='utf-8') as f:
14     reader = csv.reader(f)
15     for row in reader:
16         data_rows.append(row)
17 
18 # 假设CSV文件的第一行是表头,从第二行开始是数据
19 # 如果CSV文件没有表头,请移除以下两行代码
20 header = data_rows[0]
21 data_rows = data_rows[1:]
22 
23 # 提取数据列
24 radius = [row[0] for row in data_rows]
25 y1 = [float(row[1]) for row in data_rows]
26 y2 = [float(row[2]) for row in data_rows]
27 y3 = [float(row[3]) for row in data_rows]
28 
29 # 创建第一个极坐标系堆叠柱状图
30 polar1 = Polar(init_opts=opts.InitOpts(width="1200px", height="600px"))
31 polar1.add_schema(angleaxis_opts=opts.AngleAxisOpts(data=radius))
32 polar1.add("A", y1, type_="bar", stack=True)
33 polar1.add("B", y2, type_="bar", stack=True)
34 polar1.add("C", y3, type_="bar", stack=True)
35 polar1.set_global_opts(title_opts=opts.TitleOpts(title="极坐标系-堆叠柱状图示例1"))
36 
37 # 创建第二个极坐标系堆叠柱状图
38 polar2 = Polar(init_opts=opts.InitOpts(width="1200px", height="600px"))
39 polar2.add_schema(radiusaxis_opts=opts.RadiusAxisOpts(data=radius))
40 polar2.add("A", y1, type_="bar", stack=True)
41 polar2.add("B", y2, type_="bar", stack=True)
42 polar2.add("C", y3, type_="bar", stack=True)
43 polar2.set_global_opts(title_opts=opts.TitleOpts(title="极坐标系-堆叠柱状图示例2"))
44 
45 # 指定HTML文件的保存路径
46 output_filename = "D:/数据可视化/output.html"
47 
48 # 生成HTML文件
49 page.add(polar1)
50 page.add(polar2)
51 page.render(output_filename)
52 
53 print(f"HTML文件已生成:{output_filename}")
最后呈现的图形如下:
(这里我们画了两种极坐标的堆叠柱形图,一个是半径表示时间,一个是圆边表示时间。并把两张图显示在一个 render.html 里面)
Python 中画图表的包有好几种这里我们就用了其中一种(pyecharts)。
5. 对于该数据集,请换一种合适的图表(雷达图)方式展示,并写出相关代码。
 
 1 import csv
 2 import os
 3 import webbrowser
 4 import matplotlib.pyplot as plt
 5 import numpy as np
 6 from matplotlib import rcParams
 7 
 8 # 设置中文字体支持
 9 rcParams['font.sans-serif'] = ['SimHei']  # 用于支持中文显示
10 rcParams['axes.unicode_minus'] = False  # 用于显示负号
11 
12 # 指定CSV文件的绝对路径
13 file_path = r"D:\数据可视化\hot-dog-places.csv"
14 output_dir = r"D:\数据可视化"
15 output_file = os.path.join(output_dir, "radar_chart.png")
16 html_file = os.path.join(output_dir, "radar_chart.html")
17 
18 # 确保输出目录存在
19 os.makedirs(output_dir, exist_ok=True)
20 
21 # 读取CSV文件
22 data_rows = []
23 try:
24     with open(file_path, 'r', encoding='utf-8') as f:
25         reader = csv.reader(f)
26         for row in reader:
27             data_rows.append(row)
28 except FileNotFoundError:
29     print(f"错误:文件 {file_path} 不存在!")
30     exit()
31 
32 # 提取表头和数据行
33 header = data_rows[0]
34 data_rows = data_rows[1:]
35 
36 # 提取维度和数据
37 categories = header
38 values = []
39 for row in data_rows:
40     numeric_row = []
41     for value in row:
42         try:
43             numeric_value = float(value)
44             numeric_row.append(numeric_value)
45         except ValueError:
46             numeric_row.append(0)
47     values.append(numeric_row)
48 
49 # 计算最大值用于归一化
50 max_value = np.max(values)
51 
52 # 归一化数据
53 values_normalized = np.array(values) / max_value
54 
55 # 创建雷达图
56 fig, ax = plt.subplots(figsize=(8, 8), subplot_kw={'polar': True})
57 
58 # 绘制雷达图
59 for i, val in enumerate(values_normalized):
60     # 确保 val 和 angles 的长度一致
61     angles = np.linspace(0, 2 * np.pi, len(categories), endpoint=False).tolist()
62     val = val.tolist()
63     val += val[:1]  # 闭合多边形
64     angles += angles[:1]
65     
66     # 确保 val 和 angles 的长度一致
67     if len(val) != len(angles):
68         print(f"警告:系列{i+1}的数据长度与角度长度不一致,已自动调整。")
69         # 调整 val 的长度以匹配 angles
70         val = val[:len(angles)]
71     
72     ax.fill(angles, val, alpha=0.25, label=f'系列{i+1}')
73     ax.plot(angles, val, label=f'系列{i+1}')
74 
75 # 设置雷达图的刻度和标签
76 ax.set_yticklabels([])
77 ax.set_xticks(angles[:-1])
78 ax.set_xticklabels(categories)
79 
80 # 设置标题和图例
81 ax.set_title('雷达图')
82 ax.legend(loc='upper right')
83 
84 # 保存为PNG文件
85 plt.savefig(output_file, dpi=300)
86 plt.close()
87 
88 # 创建HTML文件以在浏览器中查看
89 with open(html_file, 'w', encoding='utf-8') as f:
90     f.write(f'<html><body><img src="{output_file}" alt="雷达图"></body></html>')
91 
92 # 在浏览器中打开HTML文件
93 webbrowser.open(html_file)
94 print(f"图表已保存至:{output_file}")
95 print(f"HTML文件已生成:{html_file}")

呈现图形如下:

热力图:

 1 import csv
 2 import os
 3 import webbrowser
 4 import matplotlib.pyplot as plt
 5 import numpy as np
 6 from matplotlib import rcParams
 7 
 8 # 设置中文字体支持
 9 rcParams['font.sans-serif'] = ['SimHei']  # 用于支持中文显示
10 rcParams['axes.unicode_minus'] = False  # 用于显示负号
11 
12 # 指定CSV文件的绝对路径
13 file_path = r"D:\数据可视化\hot-dog-places.csv"
14 output_dir = r"D:\数据可视化"
15 output_file = os.path.join(output_dir, "heatmap.png")
16 html_file = os.path.join(output_dir, "heatmap.html")
17 
18 # 确保输出目录存在
19 os.makedirs(output_dir, exist_ok=True)
20 
21 # 读取CSV文件
22 data_rows = []
23 try:
24     with open(file_path, 'r', encoding='utf-8') as f:
25         reader = csv.reader(f)
26         for row in reader:
27             data_rows.append(row)
28 except FileNotFoundError:
29     print(f"错误:文件 {file_path} 不存在!")
30     exit()
31 
32 # 提取表头和数据行
33 header = data_rows[0]
34 data_rows = data_rows[1:]
35 
36 # 提取维度和数据
37 categories = header
38 values = []
39 for row in data_rows:
40     numeric_row = []
41     for value in row:
42         try:
43             numeric_value = float(value)
44             numeric_row.append(numeric_value)
45         except ValueError:
46             numeric_row.append(0)
47     values.append(numeric_row)
48 
49 # 创建热力图
50 fig, ax = plt.subplots(figsize=(10, 8))
51 im = ax.imshow(values, cmap='viridis', aspect='auto')
52 
53 # 设置刻度和标签
54 ax.set_xticks(np.arange(len(categories)))
55 ax.set_xticklabels(categories)
56 ax.set_yticks(np.arange(len(data_rows)))
57 ax.set_yticklabels([f'系列{i+1}' for i in range(len(data_rows))])
58 
59 # 添加颜色条
60 fig.colorbar(im, ax=ax)
61 
62 # 设置标题
63 ax.set_title('热力图')
64 
65 # 保存为PNG文件
66 plt.savefig(output_file, dpi=300)
67 plt.close()
68 
69 # 创建HTML文件以在浏览器中查看
70 with open(html_file, 'w', encoding='utf-8') as f:
71     f.write(f'<html><body><img src="{output_file}" alt="热力图"></body></html>')
72 
73 # 在浏览器中打开HTML文件
74 webbrowser.open(html_file)
75 print(f"图表已保存至:{output_file}")
76 print(f"HTML文件已生成:{html_file}")

呈现结果图如下:

 

 五、实验心得

        通过本次时间数据可视化实验,我掌握了堆叠柱形图(南丁格尔玫瑰图)、热力图和雷达图的实现方法及其应用场景。堆叠柱形图适合展示多类别数据的总和及比例,热力图通过颜色直观展示数据分布规律,雷达图则适合多维数据的比较。实验中,我使用 `pyecharts` 库实现了极坐标系的堆叠柱形图,并通过调整参数解决了图表显示问题。此外,热力图和雷达图让我认识到颜色和多维数据在可视化中的重要性。本次实验不仅加深了我对时间数据可视化方法的理解,还提升了我根据数据类型和需求选择合适图表的能力。未来,我计划进一步探索更多可视化工具和方法,结合实际业务场景解决更多复杂问题。

 
posted @ 2025-04-01 13:36  识字三千  阅读(57)  评论(0)    收藏  举报