目录
时间序列可视化图表:数据动态趋势的直观呈现
在当今数据驱动的时代,理解时间序列数据的动态趋势和特征对于做出准确的决策至关重要。近期,我运用 Python 及其相关库,深入研究了地平线图、河流图、瀑布图、烛形图以及日历热图等时间序列可视化图表,旨在从不同角度挖掘时间序列数据背后隐藏的信息。
地平线图:数据波动的宏观洞察
特点(优势)
- 宏观趋势展现:通过颜色和填充区域的组合,能够以一种简洁的方式展示数据在较长时间跨度内的宏观趋势,使观察者快速把握数据的整体波动情况。
- 正负区分清晰:利用不同的颜色映射区分数据的正负值,清晰地展示数据在零刻度线上下的波动,有助于分析数据的增长和下降趋势。
劣势
- 细节信息有限:由于强调宏观趋势,对于数据的细节信息展示不足,难以从图中获取具体的数值和短期的微小波动。
- 颜色解读依赖经验:颜色的含义需要一定的经验和背景知识来解读,对于不熟悉该图表的人来说,可能需要花费一定的时间来理解。
应用场景
在气象领域,分析某地区多年的气温变化趋势,通过地平线图可以快速了解该地区气温在不同年份的整体波动情况,以及气温上升和下降的时间段。
实验过程及结果
利用 numpy 生成某地区多年的气温模拟数据,使用 matplotlib 库绘制地平线图。通过不同的颜色映射展示气温的正负值,逐段绘制填充区域以呈现数据的波动。结果图清晰展示了该地区多年气温的整体变化趋势,如哪些年份气温偏高,哪些年份气温偏低。
运行结果
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
def plot_horizon_chart(ax, years, temps, pos_cmap_name='YlOrRd', neg_cmap_name='PuBu'):
# 加载颜色映射
pos_cmap = plt.get_cmap(pos_cmap_name)
neg_cmap = plt.get_cmap(neg_cmap_name)
# 处理正数部分:归一化并获取颜色
positive = np.where(temps > 0, temps, 0)
norm_pos = mpl.colors.Normalize(vmin=0, vmax=positive.max())
colors_pos = pos_cmap(norm_pos(positive))
# 处理负数部分:归一化并获取颜色
negative = np.where(temps < 0, temps, 0)
norm_neg = mpl.colors.Normalize(vmin=negative.min(), vmax=0)
colors_neg = neg_cmap(norm_neg(negative))
# 逐段绘制填充区域(波峰波谷效果)
for i in range(len(years) - 1):
x = [years[i], years[i + 1]]
# 绘制正数区间
if positive[i] > 0 or positive[i + 1] > 0:
y_pos = [positive[i], positive[i + 1]]
# 插值颜色,使渐变更平滑
color_pos = (colors_pos[i] + colors_pos[i + 1]) / 2
ax.fill_between(x, [0, 0], y_pos, color=color_pos, alpha=0.8)
# 绘制负数区间
if negative[i] < 0 or negative[i + 1] < 0:
y_neg = [negative[i], negative[i + 1]]
color_neg = (colors_neg[i] + colors_neg[i + 1]) / 2
ax.fill_between(x, y_neg, [0, 0], color=color_neg, alpha=0.8)
# 绘制零刻度线
ax.axhline(0, color='black', lw=0.8)
ax.set_xlabel('年份', fontsize=12)
ax.set_ylabel('气温 (℃)', fontsize=12)
ax.set_title('某地区多年气温变化地平线图', fontsize=14)
ax.grid(True, linestyle='--', alpha=0.7)
# 生成包含正负的模拟数据
years = np.arange(2000, 2025)
temps = 5 + np.sin((years - 2000) * 0.6) * 8 + np.random.normal(0, 2, len(years))
# 绘制图形
fig, ax = plt.subplots(figsize=(12, 8))
plot_horizon_chart(ax, years, temps)
plt.show()
河流图:多变量时间序列的动态展示
特点(优势)
- 多变量对比:能够同时展示多个变量随时间的变化情况,通过不同颜色的区域堆叠,直观地比较各变量之间的相对大小和变化趋势。
- 动态趋势呈现:随着时间的推移,各变量的区域面积变化展示了其动态的增长或下降趋势,有助于发现各变量之间的相互关系和协同变化。
劣势
- 重叠区域解读困难:当多个变量的区域重叠时,可能会导致部分区域的信息被遮挡,难以准确读取每个变量的具体数值。
- 变量数量限制:如果变量数量过多,图表会变得复杂,可读性降低,影响对数据的理解。
应用场景
在经济领域,分析多个行业的市场份额随时间的变化情况,河流图可以清晰地展示各行业在不同时间段的相对规模和发展趋势。
实验过程及结果
使用 numpy 生成多个城市的气温模拟数据,通过 pandas 整理成 DataFrame,利用 plotly.express 库绘制河流图。设置不同的颜色来区分各个城市,优化布局以提高图表的可读性。结果图直观地展示了多个城市多年气温的变化趋势,以及各城市之间气温变化的差异。
运行结果
import numpy as np
import pandas as pd
import plotly.express as px
# 模拟年份数据
years = np.arange(2000, 2025)
# 模拟多个城市的气温数据(这里创建5个城市示例)
num_cities = 5
data = {
'年份': years
}
for i in range(num_cities):
# 不同的相位和振幅,使每个城市气温变化有差异
base_temp = 10 + np.sin((years - 2000) * 0.5 + i * 0.5) * (4 + i)
temps = base_temp + np.random.normal(0, 1.5, len(years))
data[f'城市_{i + 1}'] = temps
# 创建 DataFrame
df = pd.DataFrame(data)
# 绘制河流图
fig = px.area(df, x='年份', y=[col for col in df.columns if col != '年份'],
labels={'value': '气温 (℃)', 'variable': '城市'},
title='多个城市多年气温变化河流图',
color_discrete_sequence=px.colors.qualitative.Set1) # 使用多色离散序列
# 优化布局
fig.update_layout(
xaxis_title='年份',
yaxis_title='气温 (℃)',
legend_title='城市',
hovermode='x unified'
)
# 显示图表
fig.show()
瀑布图:数据累计变化的清晰展示
特点(优势)
- 累计变化展示:清晰地展示数据在各个阶段的累计变化情况,通过柱子的高度和方向,直观地呈现每个阶段的增减变化以及最终的累计结果。
- 关键节点突出:能够突出显示数据变化的关键节点和转折点,帮助分析人员快速识别数据变化的原因和影响因素。
劣势
- 数据依赖特定顺序:瀑布图的绘制依赖于数据的特定顺序,对于数据顺序敏感,如果顺序发生变化,可能会导致图表的解读产生偏差。
- 复杂数据展示困难:当数据的变化阶段较多或变化较为复杂时,瀑布图可能会变得冗长和复杂,影响对数据的整体理解。
应用场景
在财务领域,分析公司在不同业务阶段的利润变化情况,瀑布图可以清晰地展示每个阶段的利润增减以及最终的净利润,帮助管理层评估业务的盈利能力和成本控制情况。
实验过程及结果
定义不同销售阶段及其对应的利润变化值,计算累计值并确定每个阶段的起止值,使用 plotly.graph_objects 库创建瀑布图。设置图表的布局和样式,添加注释以明确每个阶段的利润变化。结果图清晰地展示了产品在不同销售阶段的利润变化情况,以及最终的利润结果。
运行结果
import plotly.graph_objects as go
# 定义不同销售阶段及其对应的利润变化值
stages = ['初始利润', '销售增长', '成本增加', '促销费用', '税收', '最终利润']
values = [10000, 5000, -2000, -1500, -1000, None]
# 计算累计值
cumulative = [values[0]]
for i in range(1, len(values) - 1):
cumulative.append(cumulative[-1] + values[i])
cumulative.append(cumulative[-1])
# 确定每个阶段的起止值
measures = ['absolute'] + ['relative'] * (len(stages) - 2) + ['total']
# 创建瀑布图
fig = go.Figure(go.Waterfall(
name="产品利润",
orientation="v",
measure=measures,
x=stages,
y=values,
textposition="outside",
text=[f"${val}" if val is not None else f"${cumulative[-1]}" for val in values],
connector={"line": {"color": "rgb(63, 63, 63)"}},
))
# 设置图表布局
fig.update_layout(
title="产品不同销售阶段的利润变化瀑布图",
xaxis_title="销售阶段",
yaxis_title="利润(美元)",
showlegend=False
)
# 显示图表
fig.show()
烛形图:金融数据的经典展示
特点(优势)
- 金融信息丰富:烛形图能够同时展示金融数据的开盘价、最高价、最低价和收盘价,通过不同颜色和形状的蜡烛表示价格的涨跌情况,提供了丰富的金融市场信息。
- 趋势判断直观:通过观察蜡烛的形态和排列,可以直观地判断金融资产的价格趋势和市场情绪,帮助投资者做出决策。
劣势
- 解读需要专业知识:烛形图的解读需要一定的金融知识和经验,对于不熟悉金融市场的人来说,可能难以理解其含义。
- 短期波动影响大:烛形图主要反映短期的价格波动情况,对于长期趋势的判断可能存在一定的局限性。
应用场景
在金融投资领域,分析股票、期货等金融资产的价格走势,烛形图是投资者常用的工具之一,帮助他们把握市场的短期波动和长期趋势。
实验过程及结果
使用 numpy 生成股票的模拟交易数据,包括开盘价、收盘价、最高价和最低价,通过 pyecharts 库创建烛形图。设置图表的布局和样式,添加注释以明确每个交易日的价格信息。结果图直观地展示了股票在一段时间内的价格走势,以及价格的波动情况。
运行结果
# 先安装 pyecharts,若未安装请取消下一行注释并运行
#!pip install pyecharts
from pyecharts.charts import Candlestick
from pyecharts import options as opts
import pandas as pd
import numpy as np
# 生成模拟数据
np.random.seed(42)
dates = pd.date_range(start='2024-01-01', periods=20)
open_prices = np.random.rand(20) * 100 + 100
close_prices = open_prices + np.random.randn(20) * 5
high_prices = np.maximum(open_prices, close_prices) + np.random.rand(20) * 3
low_prices = np.minimum(open_prices, close_prices) - np.random.rand(20) * 3
# 整理数据格式,pyecharts 的 Candlestick 需要每个数据项为 [open, high, low, close]
data = [[open_, high_, low_, close_] for open_, high_, low_, close_ in zip(open_prices, high_prices, low_prices, close_prices)]
# 创建 Candlestick 图表
candlestick = (
Candlestick()
.add_xaxis(dates.strftime("%Y-%m-%d").tolist()) # 转换日期格式为字符串
.add_yaxis("股票价格", data)
.set_global_opts(
title_opts=opts.TitleOpts(title="股票烛形图", subtitle="模拟交易数据"),
xaxis_opts=opts.AxisOpts(name="日期"),
yaxis_opts=opts.AxisOpts(name="价格"),
legend_opts=opts.LegendOpts(is_show=True)
)
)
# 渲染图表(可输出为 HTML 文件)
candlestick.render("./candlestick_chart.html")
日历热图:时间序列数据的直观日历展示
特点(优势)
- 时间关联直观:以日历的形式展示时间序列数据,将数据与具体的日期直接关联起来,使观察者能够直观地看到数据在不同日期的变化情况。
- 异常值突出:通过颜色的深浅表示数据的大小,能够突出显示数据中的异常值和特殊情况,便于发现数据中的规律和趋势。
劣势
- 数据密度限制:由于日历的布局限制,每个日期的展示空间有限,对于数据密度较大的情况,可能无法详细展示每个日期的具体数据。
- 缺乏趋势连续性:日历热图主要展示每个日期的数据情况,对于数据的长期趋势和连续性展示不足,需要结合其他图表进行分析。
应用场景
在销售领域,分析每日的销售额数据,日历热图可以直观地展示不同日期的销售情况,帮助销售人员发现销售高峰和低谷,以及销售的季节性规律。
实验过程及结果
使用 numpy 生成 2024 年全年的模拟数据,通过 pandas 整理成日期和数值的列表,利用 pyecharts 库创建日历热图。设置颜色映射和图表布局,添加注释以明确每个日期的数据含义。结果图直观地展示了 2024 年全年数据的变化情况,以及数据的异常值和特殊日期。
运行结果
from pyecharts.charts import Calendar
from pyecharts import options as opts
import pandas as pd
import numpy as np
from datetime import datetime
# 生成 2024 年全年的模拟数据(每日数据)
start_date = datetime(2024, 1, 1)
end_date = datetime(2024, 12, 31)
dates = pd.date_range(start=start_date, end=end_date, freq='D').tolist()
values = np.sin(np.linspace(0, 6 * np.pi, len(dates))) * 50 + 100 # 模拟周期性波动数据
values += np.random.normal(0, 5, len(dates)) # 添加随机噪声
# 整理数据格式:[[日期字符串, 数值], ...]
data = [[date.strftime("%Y-%m-%d"), round(val, 2)] for date, val in zip(dates, values)]
# 创建日历热图
calendar = (
Calendar()
.add(
series_name="", # 无图例名称
yaxis_data=data, # 明确传入 yaxis_data
calendar_opts=opts.CalendarOpts(
range_=["2024"] # 显示年份
)
)
.set_global_opts(
title_opts=opts.TitleOpts(title="2024年时间序列日历热图", subtitle="数据波动可视化"),
visualmap_opts=opts.VisualMapOpts(
max_=150,
min_=50,
range_color=["#B5E8FF", "#66CDFF", "#00BFFF", "#009ACD", "#007BA1"] # 蓝色系渐变
)
)
)
# 渲染图表(生成 HTML 文件)
calendar.render("./calen日历热图.pydar_heatmap.html")
总结表格
图表类型 | 优势 | 劣势 | 本文的应用场景 | 本文的实验过程及结果 |
---|---|---|---|---|
地平线图 | 宏观趋势展现,正负区分清晰 | 细节信息有限,颜色解读依赖经验 | 气象领域分析多年气温变化趋势 | 用 numpy 生成数据,matplotlib 绘制,展示多年气温整体变化趋势 |
河流图 | 多变量对比,动态趋势呈现 | 重叠区域解读困难,变量数量限制 | 经济领域分析多行业市场份额变化 | 用 numpy、pandas 整理数据,plotly.express 绘制,展示多城市气温变化差异 |
瀑布图 | 累计变化展示,关键节点突出 | 数据依赖特定顺序,复杂数据展示困难 | 财务领域分析业务利润变化 | 定义数据和计算累计值,plotly.graph_objects 绘制,展示销售阶段利润变化 |
烛形图 | 金融信息丰富,趋势判断直观 | 解读需要专业知识,短期波动影响大 | 金融投资领域分析资产价格走势 | 用 numpy 生成数据,pyecharts 绘制,展示股票价格走势和波动 |
日历热图 | 时间关联直观,异常值突出 | 数据密度限制,缺乏趋势连续性 | 销售领域分析每日销售额 | 用 numpy 生成数据,pyecharts 绘制,展示全年数据变化和异常值 |
总结:
本次实验围绕多种数据可视化图表展开,运用不同的 Python 库创建了各具特色的图表。利用 plotly.graph_objects 库绘制了瀑布图,展示了产品不同销售阶段的利润变化;借助 pyecharts 库生成了烛形图和日历热图,前者模拟展示了股票价格走势,后者可视化呈现了 2024 年时间序列数据的波动;使用 matplotlib 库绘制了地平线图,直观呈现某地区多年气温的正负变化;通过 plotly.express 库绘制河流图,展示了多个城市多年的气温变化情况。这些图表的实现丰富了数据可视化的手段,有助于更直观地理解和分析不同类型的数据。