时间数据的可视化

实验名称

  时间数据的可视化

实验目的

  • 掌握时间数据在大数据中的应用
  • 掌握时间数据可视化图表表示
  • 利用 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轴清晰展现各系列变化,避免可视化问题。在实际数据分析中,可依据分析需求灵活选择图表类型,提高数据洞察能力。

posted @ 2025-04-01 18:33  柒柒冉  Views(76)  Comments(0)    收藏  举报