时间数据的可视化
实验名称
时间数据的可视化
实验目的
- 掌握时间数据在大数据中的应用
- 掌握时间数据可视化图表表示
- 利用 Python 程序实现堆叠柱形图可视化
实验原理
时间是一个非常重要的维度与属性。时间序列数据存在于社会的各个领域, 如:天文观测数据、气象图像、临床诊断记录等。诊断记录包括病人的每次看病的 病情记录以及心电图等扫描仪器的数据记录等。金融和商业交易记录如股市每天的 交易价格及交易量、超市中每种商品的销售情况等。不管是延续性还是暂时性的时 间数据,可视化的最终的目的就是从中发现趋势。时间型数据包含时间属性,不仅 要表达数据随时间变化的规律,还需表达数据分布的时间规律。它可以分为连续性 和离散型时间数据。
这里就讲述下离散型数据的堆叠柱形图,堆叠柱形图的几何形状和常规柱形图 很相似,在柱形图中,数据值为并行排列,而在堆叠柱图则是一个个叠加起来的。 它的特点就是如果数据存在子分类,并且这些子分类相加有意义的话,此时就可以 使用堆叠柱形图来表示。本次实验结合本章讲述的堆叠柱形图的列子,这里我们要 画的是极坐标系-堆叠柱状图,也是南丁格尔玫瑰图。由于半径和面积的关系是平方 的关系,南丁格尔玫瑰图会将数据的比例大小夸大,尤其适合对比大小相近的数 值;由于圆形有周期的特性,所以玫瑰图也适用于表示一个周期内的时间概念,比 如星期、月份。下面就用 Python 程序来实现。
实验环境
OS:Windows
Python:v3.6
实验步骤
1. 下载数据源
下载数据源(http://datasets.flowingdata.com/hot-dog-places.csv)历年热狗大胃 王比赛的前三名的成绩。
| 2000 | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 |
| 25 | 50 | 50.5 | 44.5 | 53.5 | 49 | 54 | 66 | 59 | 68 | 54 |
| 24 | 31 | 26 | 30.5 | 38 | 37 | 52 | 63 | 59 | 64.5 | 43 |
| 22 | 23.5 | 25.5 | 29.5 | 32 | 32 | 37 | 49 | 42 | 55 | 37 |
里面的数据格式如下: 把hot-dog-places.csv文件保存在自己的目录里面。比如(C:/Users/Administrator/Desktop/hot-dog-places.csv)
2. 打开cmd ,安装Python所需要的第三方的包,输入pip install pyecharts

3. 打开Python3.6 IDEL


点击new File

在上面的界面开始编写程序。程序代码如下:
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 = "C:/Users/Administrator/Desktop/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 # 假设你想读取第 n 行的数据作为 radius 和 y1, y2, y3 例如,读取第 1 行(索引从 0 开始) 19 n = 0 # 第 1行 20 21 # 读取指定行的数据 22 radius = data_rows[n] # 第 n 行作为 radius 23 24 # 读取后续行的数据 25 y1 = data_rows[n + 1] # 第 n+1 行作为 y1 26 y2 = data_rows[n + 2] # 第 n+2 行作为 y2 27 y3 = data_rows[n + 3] # 第 n+3 行作为 y3 28 29 # 将字符串数据转换为浮点数(如果需要) 30 y1 = [float(value) for value in y1] 31 y2 = [float(value) for value in y2] 32 y3 = [float(value) for value in y3] 33 34 # 自定义颜色 35 color1 = "#FF0000" # 红色 36 color2 = "#00FF00" # 绿色 37 color3 = "#0000FF" # 蓝色 38 39 # 创建第一个极坐标系堆叠柱状图 40 polar1 = Polar(init_opts=opts.InitOpts(width="1200px", height="600px")) 41 polar1.add_schema(angleaxis_opts=opts.AngleAxisOpts(data=radius)) 42 polar1.add("A", y1, type_="bar", stack=True, itemstyle_opts=opts.ItemStyleOpts(color=color1)) 43 polar1.add("B", y2, type_="bar", stack=True, itemstyle_opts=opts.ItemStyleOpts(color=color2)) 44 polar1.add("C", y3, type_="bar", stack=True, itemstyle_opts=opts.ItemStyleOpts(color=color3)) 45 polar1.set_global_opts(title_opts=opts.TitleOpts(title="极坐标系-堆叠柱状图示例1")) 46 47 # 创建第二个极坐标系堆叠柱状图 48 polar2 = Polar(init_opts=opts.InitOpts(width="1200px", height="600px")) 49 polar2.add_schema(radiusaxis_opts=opts.RadiusAxisOpts(data=radius)) 50 polar2.add("A", y1, type_="bar", stack=True, itemstyle_opts=opts.ItemStyleOpts(color=color1)) 51 polar2.add("B", y2, type_="bar", stack=True, itemstyle_opts=opts.ItemStyleOpts(color=color2)) 52 polar2.add("C", y3, type_="bar", stack=True, itemstyle_opts=opts.ItemStyleOpts(color=color3)) 53 polar2.set_global_opts(title_opts=opts.TitleOpts(title="极坐标系-堆叠柱状图示例2")) 54 55 # 指定HTML文件的保存路径 56 output_filename = "C:/Users/Administrator/Desktop/11.html" 57 58 # 生成HTML文件 59 page.add(polar1) 60 page.add(polar2) 61 page.render(output_filename) 62 63 print(f"HTML文件已生成:{output_filename}")
4. 开始编写程序实现极坐标的堆叠柱形图
最后呈现的图形如下: (这里我们画了两种极坐标的堆叠柱形图,一个是半径表示时间,一个是圆边表示时间。并把两张图显示在一个11.html 里面,由于截不下,在此分别截取)。


python中,画图表的包包含了好几种,上面使用了其中的一种(pyechars)。
5.对于该数据,以下使用了不同的图表方式来展示。(相关代码及结果)
(1)堆叠面积图和矩形树图
import pandas as pd import matplotlib.pyplot as plt import plotly.express as px # 数据整理 data = { 'Year': [2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010], 'Series1': [25, 50, 50.5, 44.5, 53.5, 49, 54, 66, 59, 68, 54], 'Series2': [24, 31, 26, 30.5, 38, 37, 52, 63, 59, 64.5, 43], 'Series3': [22, 23.5, 25.5, 29.5, 32, 32, 37, 49, 42, 55, 37] } # 创建DataFrame df = pd.DataFrame(data) # 绘制堆叠面积图 plt.figure(figsize=(10, 6)) plt.stackplot(df['Year'], df['Series1'], df['Series2'], df['Series3'], labels=['Series1', 'Series2', 'Series3']) plt.xlabel('Year') plt.ylabel('Value') plt.title('Stacked Area Chart') plt.legend(loc='upper left') plt.show() # 绘制矩形树图(Treemap) # 将数据整理为适合Treemap的格式 df_long = df.melt(id_vars=['Year'], var_name='Series', value_name='Value') # 使用Plotly绘制Treemap fig = px.treemap(df_long, path=['Series', 'Year'], values='Value', title='Treemap of Data Series') fig.show()


堆叠面积图(Stacked Area Chart):图像展示了从2000年到2010年三个数据系列(Series1、Series2、Series3)的变化情况。每个系列用不同的颜色表示:Series1为蓝色,Series2为橙色,Series3为绿色。图像的纵轴表示数值(Value),横轴表示年份(Year)。
矩形树图(Treemap):图像展示了三个数据系列(Series1、Series2、Series3)在不同年份的数值分布。每个系列用不同的颜色表示:Series1为蓝色,Series2为红色,Series3为绿色。每个矩形的大小表示对应年份的数值大小,矩形内的标签显示年份。随着鼠标的移动,就会显示出相关的信息。
堆叠面积图适合展示多个数据系列随时间的变化趋势,可以直观地看到每个系列的累积效果。矩形树图适合展示数据的分布情况,可以直观地看到每个系列在不同年份的数值大小。这两种图表各有优势,可以根据具体的分析需求选择合适的图表类型。
(2)多轴折线图
import pandas as pd import matplotlib.pyplot as plt # 数据整理 data = { 'Year': [2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010], 'Series1': [25, 50, 50.5, 44.5, 53.5, 49, 54, 66, 59, 68, 54], 'Series2': [24, 31, 26, 30.5, 38, 37, 52, 63, 59, 64.5, 43], 'Series3': [22, 23.5, 25.5, 29.5, 32, 32, 37, 49, 42, 55, 37] } # 创建DataFrame df = pd.DataFrame(data) # 绘制多轴折线图 fig, ax1 = plt.subplots(figsize=(10, 6)) # Series1 color = 'tab:red' ax1.set_xlabel('Year') ax1.set_ylabel('Series1', color=color) lns1 = ax1.plot(df['Year'], df['Series1'], color=color, label='Series1') ax1.tick_params(axis='y', labelcolor=color) # 创建第二个y轴 ax2 = ax1.twinx() color = 'tab:blue' ax2.set_ylabel('Series2', color=color) lns2 = ax2.plot(df['Year'], df['Series2'], color=color, label='Series2') ax2.tick_params(axis='y', labelcolor=color) # 创建第三个y轴 ax3 = ax1.twinx() # 偏移第三个y轴的位置 ax3.spines['right'].set_position(('outward', 60)) color = 'tab:green' ax3.set_ylabel('Series3', color=color) lns3 = ax3.plot(df['Year'], df['Series3'], color=color, label='Series3') ax3.tick_params(axis='y', labelcolor=color) # 添加图例 lns = lns1 + lns2 + lns3 labs = [l.get_label() for l in lns] ax1.legend(lns, labs, loc='upper left') # 设置标题 plt.title('Multi-Axis Line Chart') # 显示图表 plt.show()

多轴折线图(Multi-Axis Line Chart):图像展示了从2000年到2010年三个数据系列(Series1、Series2、Series3)的变化情况。每个系列用不同的颜色表示:Series1为红色,Series2为蓝色,Series3为绿色。图像的纵轴表示数值(Series1和Series3共用左侧纵轴,Series2使用右侧纵轴),横轴表示年份(Year)。多轴折线图适合展示多个数据系列随时间的变化趋势,特别是当这些系列的数值范围差异较大时。通过使用多个 y 轴,可以更清晰地展示每个系列的变化情况,避免数值范围差异导致的可视化问题。图像中的图例帮助区分不同的数据系列,颜色编码使得每个系列的变化趋势更加直观。这种图表类型在数据分析和报告中非常有用,因为它可以同时展示多个相关数据系列的变化趋势,便于比较和分析。
总结
本次实验围绕时间数据展开,涵盖理论知识学习、多种图表实践绘制等内容,有效达成实验目的,收获颇丰。通过本次实验,对时间数据应用与可视化理解有所加深,时间数据在众多领域广泛存在,可视化目的在于挖掘趋势和时间规律。通过实验,深入理解离散型时间数据特点,明确堆叠柱形图适用于数据有子分类且相加有意义的场景。南丁格尔玫瑰图作为特殊堆叠柱形图,利用半径与面积平方关系夸大比例,适合对比相近数值,借助圆形周期特性可表示周期内时间概念,拓宽了对时间数据可视化的认知。同时,对Python绘图的技能也有所提升,掌握使用pyecharts库绘制极坐标系-堆叠柱状图(南丁格尔玫瑰图)的方法,包括数据读取、类型转换、图表创建、样式设置及保存为HTML文件等步骤。学会运用matplotlib和plotly.express库绘制堆叠面积图、矩形树图和多轴折线图,能够根据不同图表特点和数据特性选择合适库进行可视化展示,提升数据可视化实践能力。堆叠面积图能直观展示多个数据系列随时间的变化趋势和累积效果,矩形树图适合呈现数据分布情况,多轴折线图则在数据系列数值范围差异较大时,借助多个y轴清晰展现各系列变化,避免可视化问题。在实际数据分析中,可依据分析需求灵活选择图表类型,提高数据洞察能力。

浙公网安备 33010602011771号