目录
#数据可视化
#python
时间趋势类可视化图表在数据分析和决策支持中扮演着至关重要的角色,它们通过直观展示数据随时间的变化规律,帮助用户快速识别模式、异常及关键节点。本文系统总结了四类核心图表——地平线图、河流图、瀑布图和烛形图——的特点、适用场景及实现工具。地平线图通过将时间序列数据分层展示,适用于多维度时间序列数据的比较分析;河流图则通过流量的变化展示数据在时间上的迁移和演变,适用于展示数据在时间上的流动和分布;瀑布图通过条形的高度变化展示数据在时间上的累积和变化,适用于展示数据在时间上的累积效应;烛形图通过烛形的高度和颜色变化展示数据在时间上的波动和趋势,适用于展示股票、金融等领域的价格波动。这些图表各有特点,适用于不同的场景,通过合适的工具实现,可以帮助用户更深入地理解数据,发现潜在的价值和机会。
一、地平线图
1、概念
地平线图(Horizon Chart)是一种数据可视化技术,通过紧凑且分层的格式展示时间序列数据,特别适合在有限的垂直空间内比较多个数据集。其核心设计理念是将时间序列数据分层展示,并通过颜色编码(通常是同色系)来区分不同的层次,从而提高数据的可读性和信息密度。地平线图结合了山脊线图(Ridgeline Plots)和面积图矩阵(Small-multiple Area Charts)的优点,能够直观地展示数据的变化趋势、周期性特征以及异常值,同时有效减少视觉杂乱,帮助用户快速识别模式、比较不同时间序列数据的变化规律。这种图表特别适用于需要同时分析多个时间序列数据的场景,例如金融、气象、环境监测等领域。
2、特点
地平线图(Horizon Chart)是一种专门设计用于紧凑展示多个时间序列数据的可视化技术,具有以下显著特点:
-
紧凑型设计:地平线图通过分层展示时间序列数据,在有限的垂直空间内能够同时展示多个数据集,极大地提高了信息密度,适合用于多维度数据的比较分析。
-
颜色编码:它使用颜色(通常是同色系)来区分不同的数据层次,并通过颜色深浅变化来表示数据值的大小,从而帮助用户快速识别数据的变化趋势和异常值。
-
负值与正值的直观展示:地平线图能够清晰区分正负值,通常将负值以阴影或不同颜色显示,并置于基线“地平线”上方,使数据的正负变化一目了然。
-
减少视觉杂乱:通过减少线条和重叠,地平线图有效避免了传统图表中常见的视觉杂乱问题,提升了图表的可读性。
-
适合多时间序列数据:地平线图特别适合展示和分析多个时间序列数据,例如金融市场的价格波动、气象数据的趋势变化等,帮助用户快速发现数据中的模式和关键节点。
这些特点使得地平线图成为分析多维度时间序列数据的有力工具,尤其适用于需要高效利用空间并减少视觉干扰的场景。
3、应用场景
地平线图(Horizon Chart)是一种高效的时间序列数据可视化工具,其核心特点在于通过紧凑的分层设计和颜色编码,能够在有限的垂直空间内展示多个时间序列数据。以下是地平线图的主要应用场景:
-
金融领域:
地平线图特别适合展示股票、期货等金融市场的价格波动。它能够清晰地展示多个股票或指数的时间序列数据,帮助分析师快速识别价格趋势、波动规律以及异常值。例如,在股票交易中,用户可以通过地平线图同时监控多个股票的价格变化,从而发现潜在的投资机会或风险。 -
气象和环境监测:
在气象学中,地平线图可用于展示温度、降水量、风速等数据随时间的变化。这种图表能够帮助气象学家分析气候模式、预测天气变化,以及识别极端天气事件。此外,在环境监测中,地平线图也可用于分析污染物的浓度变化,为环境保护提供数据支持。 -
能源管理:
地平线图能够展示能源消耗或生产的时间序列数据,例如电力需求、太阳能发电量等。通过这种图表,能源管理人员可以直观地了解能源使用的高峰和低谷,从而优化能源分配和调度。 -
物联网(IoT)数据监控:
在物联网领域,地平线图可以用于展示传感器数据的实时变化,例如温度、湿度、压力等。通过紧凑的分层设计,用户能够同时监控多个传感器数据,快速发现设备运行中的异常情况。 -
学术研究和数据分析:
地平线图在时间序列数据的比较分析中表现出色,适用于展示实验数据、社会经济指标等。例如,研究人员可以使用地平线图分析不同实验组的时间序列数据,从而发现数据中的模式和趋势。
这些应用场景充分体现了地平线图在处理多时间序列数据时的优势,其紧凑的设计和颜色编码能够帮助用户快速识别数据的变化规律和关键节点,从而为决策提供有力支持。
4、案例实现
1、手动分层

(1)数据分层与颜色含义
-
分层:图表明显分为多个水平层,一般来说,这种分层是依据数据值的范围划分的。通常会把数据的最大值到最小值区间等分为若干部分,每一部分对应一层。从图中大致可看出至少有 3 层(不考虑正负方向区分) 。
-
颜色:使用了蓝色系和橙色系两种颜色。在常见的数据可视化场景中,蓝色系往往代表正值区间的数据,橙色系代表负值区间的数据。颜色的深浅变化可能表示数据在不同层的分布或量级差异,比如颜色越深可能表示该层数据值越接近对应区间的边界。
(2)数据变化趋势
-
波动情况:从每一层内的图形轮廓看,各层数据都存在不同程度的波动。图形的起伏表示在 2023 年时间跨度内,数据值在各层所定义的区间内上下变动。例如,某些区域图形凸起较高,说明在对应时间点数据值在该层内达到相对较大的值;凹陷处则表示数据值相对较小。
-
层间对比:不同层的数据波动情况相互独立又有所关联。比如在某些时间点,不同层可能同时出现凸起或凹陷,暗示在这些时刻数据整体有上升或下降趋势;也可能出现部分层上升,部分层下降的情况,反映出数据在不同区间的变化不一致。
(3)数据特征总结
-
极值情况:通过观察最上层和最下层的图形,能大致推测数据的最大值和最小值出现的时间点及大致量级。最上层若有明显的高峰,可能对应数据的最大值;最下层的低谷可能对应数据的最小值。
-
周期性:从整体图形看,若存在周期性变化,可能会呈现出相似的波动模式反复出现。
代码如下:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.colors import LinearSegmentedColormap
# 生成示例数据(时间序列)
np.random.seed(42)
dates = pd.date_range(start="2023-01-01", periods=365, freq="D")
values = np.cumsum(np.random.randn(365)) * 10 # 模拟波动数据
# 参数设置
bands = 3 # 分层数
colors_positive = ['#f7fbff', '#c6dbef', '#6baed6'] # 正值颜色(浅蓝到深蓝)
colors_negative = ['#fff5eb', '#fee6ce', '#fdae6b'] # 负值颜色(浅橙到深橙)
# 创建子图
fig, axes = plt.subplots(nrows=bands*2, figsize=(12, 6), sharex=True)
plt.subplots_adjust(hspace=0)
# 数据分层处理
max_value = np.max(values)
min_value = np.min(values)
band_height = (max_value - min_value) / bands
# 绘制每一层
for i in range(bands):
# 处理正值层
upper = max_value - i * band_height
lower = max_value - (i + 1) * band_height
mask_positive = (values >= lower) & (values <= upper)
axes[i].fill_between(dates, lower, np.where(mask_positive, values, lower),
color=colors_positive[i], edgecolor='none')
axes[i].set_ylim(lower, upper)
axes[i].axis('off')
# 处理负值层
lower_neg = min_value + i * band_height
upper_neg = min_value + (i + 1) * band_height
mask_negative = (values >= lower_neg) & (values <= upper_neg)
axes[bands + i].fill_between(dates, lower_neg, np.where(mask_negative, values, lower_neg),
color=colors_negative[i], edgecolor='none')
axes[bands + i].set_ylim(lower_neg, upper_neg)
axes[bands + i].axis('off')
# 添加标题和标签
plt.suptitle("Horizon Chart of Time Series Data (2023)", y=0.92)
plt.xlabel("Date")
plt.show()
2、交互式地平线图(Plotly)
(1)数据分层与特征
-
分层情况:图中数据被分成多个水平带(Band),当前鼠标悬停显示的是 “Band 1” 。这种分层是将数据的取值范围进行划分,不同的带代表不同的数据区间,便于观察数据在不同区间内的变化。
-
数据波动:各层内数据呈现出明显的波动特征。例如在年中(7 月左右)有一个明显的峰值,说明在该时间段数据值在对应层内有较大的增长;而在其他时间段,如 3 - 5 月、9 - 11 月等,也有不同程度的起伏,反映出数据的不稳定性。
(2)交互式元素作用
-
数据提示:当鼠标悬停在图表上时,出现数据提示框,显示具体日期(如 Apr 30, 2023 )和对应数值(如 -21.89278 )以及所在的 Band 信息。这一功能方便用户快速获取特定时间点的数据细节,增强了图表的交互性和信息获取效率。
-
图表操作:图表右上角可能存在一些常见的 Plotly 交互按钮,如放大、缩小、平移等功能,用户可以通过这些操作对图表进行更细致的观察,聚焦感兴趣的时间段或数据区间。
(3)数据趋势分析
-
整体趋势:从图表整体来看,数据没有明显的长期上升或下降趋势,更多呈现出随机波动的特点。不过在某些局部时间段,如年初到 3 月、9 月之后等,数据有相对持续下降的态势;而在 7 月左右有一个明显的上升波动。
代码如下:
import plotly.graph_objects as go
import pandas as pd
import numpy as np
# 生成数据
dates = pd.date_range("2023-01-01", periods=365, freq="D")
values = np.cumsum(np.random.randn(365)) * 10
# 分层处理函数
def create_horizon_bands(data, bands=3):
max_val = data.max()
min_val = data.min()
band_height = (max_val - min_val) / bands
traces = []
for i in range(bands):
# 正值层
upper = max_val - i * band_height
lower = upper - band_height
trace = go.Scatter(
x=dates, y=np.clip(data, lower, upper),
fill='tozeroy',
line=dict(width=0),
fillcolor=f'rgba(91, 156, 214, {0.2 + i * 0.2})',
name=f'Band {i + 1}'
)
traces.append(trace)
return traces
# 创建图表
fig = go.Figure(create_horizon_bands(values))
fig.update_layout(
title="Interactive Horizon Chart with Plotly",
xaxis_title="Date",
yaxis_title="Value",
showlegend=False
)
fig.show()
二、河流图
1、概念
河流图(Streamgraph),又称为“主题河流图”(ThemeRiver),是一种特殊的堆积面积图,通过类似河流流动的带状图形展示不同类别数据随时间的变化情况。它的核心特点在于用河流的宽度和颜色来表示数据的大小和类别,从而直观地反映数据在时间上的迁移、演变及波动。河流图特别适合展示大量数据的动态变化,尤其适用于类别数据波动较大或需要突出变化趋势的场景,例如新闻事件的热度变化、金融市场的波动分析等。
2、特点
河流图(Streamgraph)是一种基于堆积面积图变形而来的数据可视化图表,其核心特点包括以下几个方面:
-
直观的流动感:河流图通过类似河流流动的带状图形展示数据,具有强烈的视觉流动感,能够直观反映数据随时间的变化趋势。
-
宽度和颜色的信息表达:河流的宽度与数据的大小成正比,而颜色则用于区分不同的类别。这种设计使得用户可以快速识别数据的大小和类别信息。
-
动态变化的展示:河流图特别适合展示大量数据的动态变化,尤其是类别数据波动较大的场景。例如,新闻事件的热度变化、金融市场的波动分析等。
-
堆积与层次感:与普通堆积面积图不同,河流图的带状区块沿时间轴垂直堆叠,形成层次感,便于观察不同类别数据在时间上的叠加和演变。
-
美观性与可读性:河流图不仅外观美观,而且通过流畅的曲线和颜色区分,能够提高数据的可读性,尤其是在数据波动较大的情况下,其可视化效果更为明显。
河流图通过其独特的视觉设计和信息表达方式,在展示动态数据变化方面具有显著优势,但泛用性相对较低,适用于特定场景。
3、应用场景
河流图是一种通过带状流动感展示数据随时间变化的可视化图表,其独特的视觉设计和信息表达能力使其在多个领域具有广泛的应用场景。以下是其主要应用场景的总结:
1. 趋势分析
-
用途:河流图能够直观展示多个类别数据随时间的变化趋势,适合分析不同类别数据在时间上的波动和演变。
-
实例:
-
不同产品的销量变化:通过不同颜色的条带展示各产品在一段时间内的销量波动。
-
新闻事件的热度变化:分析某一主题在社交媒体或新闻平台上的热度随时间的变化趋势。
-
2. 影响因素分析
-
用途:河流图可以展示多个影响因素在时间上的叠加和变化,帮助用户识别关键驱动因素。
-
实例:
-
金融市场的波动:分析不同投资组合或股票类别在特定时间段内的表现。
-
人口流动:展示不同地区人口随时间的迁移和变化情况。
-
3. 动态数据展示
-
用途:特别适合展示大量动态数据的波动情况,尤其是类别波动幅度较大的场景。
-
实例:
-
音乐流行趋势:通过条带的宽窄和颜色展示不同音乐风格在特定年代的流行程度。
-
交通流量分析:展示不同路段在一天内的小时流量变化。
-
4. 美观性与交互性
-
用途:河流图不仅美观,还适合通过交互设计提升数据的可读性和分析深度。
-
实例:
-
数字孪生大屏:在智慧城市或工业监测中,河流图用于展示实时数据流,并结合交互功能突出关键数据点。
-
商品类目分析:通过交互设计,用户可以点击或悬停条带查看某一时间点的具体数据值。
-
5. 适用场景与局限性
-
适用场景:河流图特别适合展示多类别、波动幅度较大的时间序列数据,尤其在数据存在重叠或交互时表现突出。
-
局限性:由于其泛用性较低,不适合需要精确对比或数据类型较少的场景,且在使用时可能需要结合交互设计以增强可读性。
河流图通过其直观的流动感和层次感,在趋势分析、影响因素分析以及动态数据展示等领域表现出色。然而,其泛用性较低,适合特定的数据类型和场景。通过结合交互设计,可以进一步提升其应用价值,帮助用户深入理解数据随时间的变化规律和潜在趋势。
4、案例实现
1、使用 Plotly Express 生成河流图
(1)数据类别与特征
-
类别区分:图中通过不同层次区分了 A、B、C、D、E 五个类别。每个类别在不同时间点的相对比例通过图形的高度体现。
-
波动情况:各分类数据都呈现出波动变化。例如在某些时间点,各分类的图形高度有明显起伏,说明相对比例在这些时刻有较大变化。从交互提示框可知,2023 年 6 月 2 日,类别 A - E 分别有不同的相对比例数值,如 A 为 64、B 为 73 等 ,显示出不同类别在同一时刻的比例差异。
(2)交互式元素作用
-
数据提示:鼠标悬停出现的数据提示框,能展示特定日期(如 Jun 2, 2023 )各分类(Category)对应的相对比例数值(Relative Proportion )。这便于用户快速获取某一时刻详细数据信息,增强了数据解读的便利性和准确性。
-
图表操作:虽然图中未明确展示,但通常这类交互式河流图可能具备放大、缩小、平移等功能,方便用户聚焦特定时间段或详细观察数据细节。
(3)数据趋势分析
-
整体趋势:从整体上看,各分类相对比例没有呈现出单一的长期上升或下降趋势,而是在不同时间段有不同的波动变化。不同分类在不同时间点占据主导地位,反映出各类别间相对比例的动态变化。
代码如下:
import plotly.express as px
import pandas as pd
import numpy as np
# 生成示例数据(长格式:时间、类别、值)
np.random.seed(42)
dates = pd.date_range("2023-01-01", periods=365, freq="D")
categories = ["A", "B", "C", "D", "E"]
data = []
for date in dates:
base_value = np.random.randint(50, 100)
for cat in categories:
# 生成带随机波动的类别值
value = base_value + np.random.randint(-20, 20)
data.append({"Date": date, "Category": cat, "Value": value})
df = pd.DataFrame(data)
# 生成河流图(通过调整基线实现河流效果)
fig = px.area(
df,
x="Date",
y="Value",
color="Category",
line_group="Category",
title="Streamgraph of Multi-Category Time Trends",
labels={"Value": "Relative Proportion"},
# 关键参数:设置基线为 "zero" 会生成普通堆积图,需通过居中数据模拟河流图
)
# 手动调整基线(居中数据)
for trace in fig.data:
trace.update(
line=dict(width=0.5, color="white"), # 添加白色边界线增强可读性
stackgroup="river", # 强制堆叠到同一组
groupnorm="", # 禁用标准化
mode="lines", # 仅显示线(填充由 area 处理)
)
# 添加动态缩放和布局优化
fig.update_layout(
xaxis=dict(
rangeslider=dict(visible=True), # 启用时间范围滑动条
type="date"
),
hovermode="x unified", # 悬停时显示所有类别值
height=600,
colorway=px.colors.qualitative.Pastel # 使用柔和的配色方案
)
# 显示图表
fig.show()
2、使用 Matplotlib 定制河流图
(1)数据类别与特征
-
类别区分:图中用不同颜色区分了 A(粉色)、B(绿色)、C(橙色)、D(棕色)、E(灰色)五个类别。每个类别在不同时间点的数据值通过图形的垂直高度体现。
-
波动情况:各分类数据波动明显。例如,绿色的 B 类别在 2023 年 3 - 7 月期间波动较大,数值有明显起伏;橙色的 C 类别在 2023 年 5 - 7 月也有显著波动。不同类别在同一时间点的波动情况不同,反映出各类别数据变化的独立性和差异性。
(2)数据趋势分析
-
整体趋势:从整体看,各分类数据没有呈现出统一的上升或下降趋势。部分类别在某些时间段上升,而在其他时间段下降。如 B 类别在年初到 3 月左右呈下降趋势,之后又有波动上升;C 类别在 5 - 7 月上升,随后下降。
-
主导类别变化:不同时间段主导类别的数据占比不同。例如在年初,B 类别占据较大比重;在 2023 年 5 - 7 月,C 类别占比较大;在年中之后,B 类别又逐渐占据主导地位。这种变化反映了不同类别在不同时间段的相对重要性。
(3)特殊点分析
-
在 2023 年 7 月左右,多个类别(如 B、C、D)都出现了明显的波动转折点。
代码如下:
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from matplotlib import cm
# 生成示例数据(宽格式:每列为一个类别)
dates = pd.date_range("2023-01-01", periods=365, freq="D")
categories = ["A", "B", "C", "D", "E"]
data = {cat: np.cumsum(np.random.randn(365)) * 10 + 100 for cat in categories}
df = pd.DataFrame(data, index=dates)
# 居中数据(模拟河流图基线)
df_centered = df.sub(df.mean(axis=1), axis=0) # 每个时间点减去均值
# 创建画布
fig, ax = plt.subplots(figsize=(12, 6))
# 生成颜色映射
colors = cm.Pastel1(np.linspace(0, 1, len(categories)))
# 绘制堆叠区域(基线居中)
ax.stackplot(
df_centered.index,
df_centered.T.values,
labels=categories,
colors=colors,
edgecolor="white",
linewidth=0.5
)
# 优化布局
ax.set_title("Matplotlib Streamgraph", fontsize=14)
ax.legend(loc='upper left', bbox_to_anchor=(1, 1))
ax.xaxis.set_tick_params(rotation=45)
plt.tight_layout()
# 显示图表
plt.show()
三、瀑布图
1、概念
瀑布图(Waterfall Plot)是一种由麦肯锡独创的商业图表,属于柱形图的变种,因其柱体堆叠交错形似瀑布而得名。它通过展示数据流程和演变过程,能够直观地呈现数据的增减变化,尤其适用于解释从一个初始值到最终值的详细变化路径。例如,在财务分析中,瀑布图常用于展示利润构成、预算变化或成本分析,通过正负柱形清晰表达各因素对总值的贡献或影响。这种图表通过其直观的视觉设计,帮助用户快速识别关键驱动因素,从而在经营分析、财务报表等场景中发挥重要作用。
2、特点
瀑布图是一种直观且实用的数据可视化工具,具有以下显著特点:
-
绝对值与相对值结合:瀑布图通过结合绝对值和相对值,能够清晰地展示数据从初始值到终止值的增减变化过程,帮助用户快速理解数据的演变路径。
-
正负柱形设计:图表使用正柱形表示数据的增加,负柱形表示数据的减少,直观地呈现各因素对总值的贡献或影响。
-
初始值与终止值明确:瀑布图通常包含一个初始值和一个终止值,通过柱形的堆叠和交错,展示数据在中间步骤中的变化,使整体变化过程一目了然。
-
动态过程的可视化:瀑布图能够清晰地展示从初始值到最终值的所有变化,使数据的动态过程更加直观。
-
增减关系清晰:通过正负柱形的分离,增量和减量直观分开,便于分析变化的来源。
-
直观性:通过正负柱形设计,用户可以快速识别数据的增减变化及其对整体的影响。
-
易于理解:结合绝对值和相对值,瀑布图能够清晰地展示数据变化路径,为数据驱动的决策提供支持。
这些特点使得瀑布图在展示数据变化、分析数据增减来源等方面具有独特的优势,是一种高效的数据可视化工具。
3、应用场景
瀑布图是一种直观展示数据变化过程的数据可视化工具,其应用场景广泛,尤其在以下领域具有显著优势:
1. 财务分析
-
利润分析:瀑布图常用于展示公司利润从初始值到最终值的变化过程,通过正负柱形直观地显示收入和支出对利润的贡献或影响。例如,分析企业利润增长或亏损的原因,如收入增加、成本节约或支出增加等。
-
预算管理:用于突出显示项目预算的变更,帮助管理者理解预算超支或节约的来源,从而优化资源分配。
2. 经营分析
-
库存与销售分析:瀑布图可以清晰地展示一段时间内库存或销售量的变化,帮助管理者识别库存积压或销售增长的关键因素。
-
产品收益比较:通过瀑布图,可以直观地比较不同产品的收益变化,为产品策略调整提供数据支持。
3. 其他领域
-
项目成本分析:瀑布图能够展示项目成本从预算到实际支出的变化过程,便于分析成本超支或节约的原因。
-
综合数据变化展示:适用于任何需要展示数据从初始值到终止值变化过程的场景,例如展示产品价值随时间的变化。
瀑布图通过结合绝对值和相对值,直观地展示数据的增减变化及其对整体的影响,适用于财务分析、经营分析以及项目成本管理等场景。其优势在于能够清晰地呈现数据变化路径,帮助用户快速识别关键因素并作出数据驱动的决策。
4、案例实现
使用Plotly 生成交互式瀑布图
(1)数据类别与特征
-
类别区分:图中不同颜色和标签代表不同的数据类别。蓝色代表增长类数据,如 “Initial”“Revenue”“Final”“New Init”“Extra Revenue”“Final 2024” ;红色代表减少类数据,如 “Cost”“Extra Cost” 。
-
数值变化:从 2023 - Q1 的 “Initial” 值开始,后续各阶段数据根据正负值进行累计加减。例如,2023 - Q2 的 “Cost” 为负值,使累计值下降;2023 - Q3 的 “Revenue” 为正值,又使累计值上升。
(2)数据趋势分析
-
整体趋势:整体上数据呈现逐步增长的趋势。从起始的 “Initial” 值,经过各季度的增减变化,到 2024 - Q4 的 “Final 2024” 达到一个较高的值。
-
关键节点:2024 - Q1 的 “New Init” 带来较大幅度增长;2024 - Q2 的 “Extra Cost” 使增长趋势短暂回落;随后 2024 - Q3 的 “Extra Revenue” 又推动数值上升,最终在 2024 - Q4 达到最高点。
(3)图表设计分析
-
颜色使用:蓝色和红色对比鲜明,能快速区分数据的增减情况,便于读者理解数据变化方向。
-
布局与标注:图表布局简洁,各阶段标签清晰标注在对应柱体上方,方便读者识别各阶段数据类别和时间节点。
代码如下:
import plotly.graph_objects as go
import pandas as pd
# 生成示例数据(时间分阶段累计变化)
data = {
"date": ["2023-Q1", "2023-Q2", "2023-Q3", "2023-Q4", "2024-Q1", "2024-Q2", "2024-Q3", "2024-Q4"],
"value": [120, -30, 80, 50, 150, -40, 90, 70], # 各阶段变化值(正为增长,负为减少)
"category": ["Initial", "Cost", "Revenue", "Final", "New Init", "Extra Cost", "Extra Revenue", "Final 2024"] # 阶段标签
}
df = pd.DataFrame(data)
# 创建瀑布图对象
fig = go.Figure(go.Waterfall(
name="Year 2023 - 2024",
orientation="v",
x=df['date'], # 时间阶段
y=df['value'],
textposition="outside",
text=df['category'],
connector={"line": {"color": "#999999", "width": 1.5}}, # 连接线颜色和宽度微调
decreasing={"marker": {"color": "#FF6B6B"}}, # 负值颜色调整为更柔和的红色
increasing={"marker": {"color": "#6195ED"}}, # 正值颜色调整为更清新的蓝色
totals={"marker": {"color": "#4CAF50"}} # 总栏颜色微调
))
# 动态布局配置
fig.update_layout(
title={
'text': "Time - Based Waterfall Chart (2023 - 2024 Quarterly)",
'font': {'size': 20, 'family': 'Arial, sans-serif'},
'x': 0.5 # 标题居中
},
xaxis_title={
'text': "Time Period",
'font': {'size': 16, 'family': 'Arial, sans-serif'}
},
yaxis_title={
'text': "Value (Units)",
'font': {'size': 16, 'family': 'Arial, sans-serif'}
},
waterfallgap=0.3, # 柱子间距
showlegend=False,
plot_bgcolor='white', # 设置背景为白色
paper_bgcolor='white', # 纸张背景为白色
font={'color': '#333333'} # 整体字体颜色
)
# 显示图表
fig.show()
四、烛形图
1、概念
烛形图,又称蜡烛图或K线图,是一种常用于金融领域的技术分析工具,起源于18世纪的日本,由粮食商人本间宗久发明,用于展示特定时间段内的价格波动情况。每根烛形图由实体、影线和颜色组成,包含四个关键数据点:开盘价、收盘价、最高价和最低价。其中,实体部分表示开盘价与收盘价之间的范围,影线则展示最高价和最低价。颜色通常用于区分价格走势,例如红色或白色代表价格上涨,绿色或黑色代表价格下跌。烛形图通过这些元素直观地展示价格的变化趋势和波动范围,帮助投资者识别市场趋势、反转信号以及潜在的交易机会。
2、特点
烛形图(Candlestick Chart),又称蜡烛图或K线图,是一种常用于金融领域的技术分析工具,具有以下显著特点:
-
直观性:烛形图通过实体和影线的组合,清晰展示特定时间段内的价格波动情况。实体部分表示开盘价与收盘价之间的范围,影线则反映最高价和最低价,这种结构使价格变化一目了然。
-
多维度信息:每根烛形图包含四个关键数据点——开盘价、收盘价、最高价和最低价,能够全面呈现价格波动的细节,帮助用户快速理解市场动态。
-
颜色区分趋势:烛形图通常使用颜色(如红色或绿色)来区分价格走势。红色或白色代表价格上涨,绿色或黑色代表价格下跌,这种设计便于用户直观识别市场趋势。
-
模式识别功能:烛形图支持识别特定的价格模式(如早晨之星、黄昏之星等),这些模式常被用于预测市场趋势的变化,是投资者制定交易策略的重要依据。
-
广泛应用:烛形图广泛应用于股票、期货、外汇等金融市场的技术分析中,是投资者分析市场波动、制定交易计划的重要工具。
通过这些特点,烛形图不仅能够直观展示价格波动,还能帮助用户深入分析市场趋势,从而做出更科学的投资决策。
3、应用场景
烛形图(Candlestick Chart)作为一种经典的时间趋势可视化工具,在金融领域有着广泛的应用场景。以下是其主要应用场景的详细说明:
1. 金融市场技术分析
-
股票市场:烛形图是股票交易中分析价格波动的重要工具。投资者通过观察开盘价、收盘价、最高价和最低价的变化,能够快速识别市场趋势和关键转折点。
-
外汇市场:在外汇交易中,烛形图常用于展示货币对的汇率波动,帮助交易者判断买卖时机,识别价格反转信号。
-
期货市场:期货价格波动较大,烛形图能够清晰地呈现价格走势,支持交易者制定交易策略。
-
大宗商品市场:如原油、黄金等商品的价格动态,也常通过烛形图进行分析,帮助投资者捕捉市场机会。
2. 加密货币市场
-
在加密货币交易中,烛形图被广泛用于分析比特币、以太坊等数字货币的价格波动。其直观性帮助交易者快速识别价格模式,如“早晨之星”或“黄昏之星”,从而预测市场趋势。
3. 市场情绪分析
-
烛形图通过价格走势和特定模式(如锤头线、十字星等)反映市场情绪。例如,长上影线可能表明市场看涨情绪减弱,而长下影线则可能预示价格支撑较强。这种分析对交易者评估市场情绪和制定策略至关重要。
4. 模式识别与策略制定
-
烛形图支持识别经典的价格模式,如“吞没形态”“乌云盖顶”等,这些模式常被用于预测市场趋势变化。交易者可以利用这些模式制定买卖策略,提高交易成功率。
5. 其他领域
-
除了金融领域,烛形图还适用于需要分析时间序列数据的场景,例如:
-
经济数据可视化:展示经济指标(如GDP、失业率)随时间的变化。
-
能源市场分析:分析电力价格或天然气价格的波动规律。
-
烛形图凭借其直观性和强大的信息承载能力,在金融市场、加密货币交易以及市场情绪分析等领域中发挥着重要作用。它不仅帮助用户快速识别价格波动模式,还能为投资决策提供科学依据,是金融分析中不可或缺的工具。
4、案例实现
使用Python的mplfinance
库,绘制包含开盘价、最高价、最低价和收盘价的烛形图,效果如下:
1. 数据特征
-
时间范围:2023 年 1 月 1 日至 1 月 10 日(10 个交易日)
-
价格波动:
-
开盘价 (Open):随机生成在 100-200 之间
-
最高价 (High):比开盘价高 0-20
-
最低价 (Low):比开盘价低 0-20
-
收盘价 (Close):相对于开盘价浮动 - 10 至 + 10
-
-
随机性:使用
np.random.seed(42)
确保数据可复现,但整体呈现随机波动特性
2. 烛形图形态
-
颜色含义:
-
红色 (K 线图中通常为阳线):收盘价高于开盘价(代码中设置
up='r'
) -
绿色 (K 线图中通常为阴线):收盘价低于开盘价(代码中设置
down='g'
)
-
-
K 线结构:
-
实体部分:开盘价与收盘价之间的矩形区域
-
影线:最高价与最低价之间的竖线
-
上影线:最高价与实体顶部的连线
-
下影线:最低价与实体底部的连线
-
-
3. 技术指标
-
移动平均线:
-
MA5(短期):5 日移动平均线,代码中通过
mav=(5,10)
设置 -
MA10(中期):10 日移动平均线
-
-
信号分析:
-
当短期均线向上穿越长期均线时,可能形成 "金叉"(看涨信号)
-
当短期均线向下穿越长期均线时,可能形成 "死叉"(看跌信号)
-
代码如下:
import pandas as pd
import numpy as np
import mplfinance as mpf
from datetime import datetime
# 1. 创建示例数据
np.random.seed(42) # 保证结果可复现
dates = pd.date_range(start='2023-01-01', periods=10, freq='D')
open_prices = np.random.uniform(100, 200, size=10)
high_prices = open_prices + np.random.uniform(0, 20, size=10)
low_prices = open_prices - np.random.uniform(0, 20, size=10)
close_prices = open_prices + np.random.uniform(-10, 10, size=10)
# 构建DataFrame
data = pd.DataFrame({
'Date': dates,
'Open': open_prices,
'High': high_prices,
'Low': low_prices,
'Close': close_prices
})
# 2. 确保日期为datetime类型并按时间排序
data['Date'] = pd.to_datetime(data['Date'])
data = data.sort_values('Date').reset_index(drop=True)
# 3. 设置日期为索引(可选)
data.set_index('Date', inplace=True)
# 4. 配置图表样式
mc = mpf.make_marketcolors(up='r', down='g', inherit=True)
style = mpf.make_mpf_style(marketcolors=mc, gridcolor='gray', gridstyle='dotted')
# 5. 绘制烛形图
mpf.plot(data, type='candle', style=style, title='Time Trend Candlestick Chart Example',
ylabel='price', volume=False, mav=(5, 10))
# 显示图表
mpf.show()
五、甘特图
1、概念
甘特图是一种以条形图形式展示项目进度信息的图表,它以横轴表示时间,纵轴表示任务或活动,每个条形代表一个任务,其长度表示该任务的持续时间,条形在横轴上的位置表示任务的开始和结束时间。甘特图通过清晰地展示各项任务的计划进度和实际进度,帮助项目管理者进行任务调度、资源分配和进度控制,从而有效跟踪项目执行情况并及时调整计划。
2、特点
甘特图是一种直观的项目管理工具,具有以下主要特点:
-
直观性:甘特图通过条形图的形式清晰地展示任务的开始时间、结束时间和持续时间,帮助用户快速理解项目进度和任务安排。
-
时间管理:它以时间为核心,强调计划产量与计划时间的对应关系,便于管理者监控任务的执行情况。
-
任务依赖性管理:甘特图能够展示任务之间的依赖关系,便于合理安排任务顺序,避免任务冲突。
-
进度跟踪与控制:通过对比实际进度与计划进度,甘特图能够帮助项目管理者及时发现偏差,并作出调整。
-
资源分配与优化:甘特图支持资源分配的可视化,帮助项目团队高效利用资源,避免资源浪费。
-
促进沟通与协作:甘特图通过清晰的视觉呈现,提高了项目计划的透明度,有助于团队成员之间的沟通与协作。
3、应用场景
甘特图是一种直观且强大的项目管理工具,其应用场景广泛,以下是甘特图的主要应用场景:
1. 项目管理
-
项目计划阶段:在项目启动时,甘特图可以清晰地规划各个任务的时间节点,帮助识别关键路径,确定项目的整体进度安排。
-
进度跟踪与控制:通过甘特图,项目经理可以实时监控任务的执行情况,及时发现偏差并调整计划7。
-
资源分配与优化:甘特图支持资源分配的可视化,帮助团队高效利用资源,避免浪费。
2. 软件开发
-
在软件开发中,甘特图可以用于规划开发、测试和发布等各个阶段的时间安排,确保任务之间的依赖关系得到妥善处理。
3. 建筑工程
-
在建筑工程领域,甘特图常用于安排施工、采购和验收等环节,确保工程按计划推进。
4. 市场营销
-
在市场营销项目中,甘特图可以用于规划活动、推广和反馈等任务的时间安排,帮助团队高效协作。
5. 个人计划
-
甘特图不仅适用于大型项目,还可以用于个人计划,例如时间管理、学习计划或日常任务安排。通过甘特图,个人可以更清晰地规划时间,提高效率。
6. 团队协作
-
甘特图通过清晰的视觉呈现,提高了项目计划的透明度,有助于团队成员之间的沟通与协作,确保任务按计划完成。
甘特图以其直观性和灵活性,广泛应用于项目管理、软件开发、建筑工程、市场营销以及个人计划等领域。通过甘特图,用户可以更高效地规划任务、跟踪进度、分配资源,从而提升整体效率。
4、案例实现
-
任务条:每个任务对应一个水平的条形。例如,需求分析任务从 2023 - 01 - 01 开始,到 2023 - 01 - 07 结束,历时 7 天。条形的长度由任务的时间跨度决定(
x=[row['End'] - row['Start']]
) ,起始位置由开始时间决定(base=row['Start']
) 。 -
颜色与样式:任务条的颜色为半透明的绿色(
rgba(50, 171, 96, 0.6)
) ,边框为不透明的绿色(rgba(50, 171, 96, 1.0)
) ,宽度为 2 。 -
进度显示:在每个任务条上通过
text=f"进度: {row['Progress']}%"
显示任务的进度百分比。比如原型设计任务进度为 80% ,开发实现任务进度为 65% 等。 -
交互信息:当鼠标悬停在任务条上时,通过
hovertext
显示详细信息,包括任务名称、开始时间、结束时间、历时天数和进度百分比。
代码如下:
import plotly.graph_objects as go
import pandas as pd
# ===================== 数据准备 =====================
df = pd.DataFrame([
{"Task": "需求分析", "Start": "2023-01-01", "End": "2023-01-07", "Progress": 100},
{"Task": "原型设计", "Start": "2023-01-08", "End": "2023-01-15", "Progress": 80},
{"Task": "开发实现", "Start": "2023-01-16", "End": "2023-02-10", "Progress": 65},
{"Task": "测试验收", "Start": "2023-02-11", "End": "2023-02-25", "Progress": 30},
{"Task": "上线部署", "Start": "2023-02-26", "End": "2023-03-05", "Progress": 0}
])
# 转换日期格式
df['Start'] = pd.to_datetime(df['Start'])
df['End'] = pd.to_datetime(df['End'])
# ===================== 创建甘特图 =====================
fig = go.Figure()
# 添加任务条(带进度)
for _, row in df.iterrows():
fig.add_trace(go.Bar(
x=[row['End'] - row['Start']], # 时间跨度
y=[row['Task']],
base=row['Start'], # 起始时间
orientation='h',
name=row['Task'],
marker=dict(
color='rgba(50, 171, 96, 0.6)',
line=dict(color='rgba(50, 171, 96, 1.0)', width=2)
),
# 显示进度条叠加效果
insidetextanchor='middle',
text=f"进度: {row['Progress']}%",
hoverinfo="text",
hovertext=f"""
任务: {row['Task']}<br>
开始: {row['Start'].strftime('%Y-%m-%d')}<br>
结束: {row['End'].strftime('%Y-%m-%d')}<br>
历时: {(row['End'] - row['Start']).days}天<br>
进度: {row['Progress']}%
"""
))
# ===================== 布局配置 =====================
fig.update_layout(
title=dict(
text="📊 项目进度甘特图 (带进度追踪)",
x=0.5,
font=dict(size=24)
),
xaxis=dict(
title="时间轴",
tickformat="%Y-%m-%d",
rangeslider=dict(visible=True)
),
yaxis=dict(title="任务名称", autorange="reversed"),
barmode="stack", # 确保任务条不重叠
height=600,
width=1400,
hovermode="y unified"
)
# 显示图表
fig.show()
六、日历热力图
1、概念
日历热力图是一种结合了热力图与日历格式的数据可视化工具,通过颜色编码的小色块在日历格式中展示数据。横轴通常表示时间(如日期或月份),纵轴表示时间序列中的另一个维度(如星期或小时),每个小色块的颜色深浅根据对应时间点的数据值变化,从而直观展示数据在时间上的分布与变化趋势。日历热力图适用于分析长时间周期内的数据模式,例如每日活动量、销售额或代码提交量等。
2、特点
日历热力图是一种直观且强大的数据可视化工具,其特点主要体现在以下几个方面:
-
结合日历与热力图:
日历热力图将日历格式与热力图相结合,横轴通常表示时间(如日期或月份),纵轴表示时间序列中的另一个维度(如星期或小时)。每个小色块对应一个时间单元,通过颜色深浅展示数据值的大小,从而直观地呈现数据在时间上的分布和变化趋势。 -
颜色编码展示数据:
它采用颜色编码的方式,通常使用单一基色(如蓝色)的不同明暗度来表示数据值的大小。颜色越深,表示该时间点的数据值越大,反之则越小。这种设计使数据的分布和变化趋势一目了然。 -
适用于长时间周期分析:
日历热力图特别适合展示长时间周期(如月或年)内的数据模式。通过将数据聚合到日历格网中,它能够清晰地揭示季节性、周期性或特定时间点的数据特征,例如每日活动量、销售额或代码提交量等。 -
支持多种视图和聚合方式:
它支持单一日历视图和连续日历视图两种模式。单一日历视图适用于分析特定时间周期内的数据模式,而连续日历视图则能展示跨年份或周的数据变化。此外,用户可以选择不同的聚合方法(如计数、总和、平均值等)来汇总数据,从而满足多样化的分析需求。 -
应用场景广泛:
日历热力图广泛应用于多个领域,如项目管理、销售分析、用户行为分析以及代码贡献统计等。例如,GitHub贡献图就是典型的日历热力图,通过颜色深浅展示用户每日的代码提交量。
总结来说,日历热力图通过将时间序列数据与视觉化的颜色编码相结合,为用户提供了清晰、直观且高效的数据分析工具,尤其适合长时间周期内数据模式的分析与洞察。
3、应用场景
日历热力图是一种强大的数据可视化工具,其应用场景广泛,适用于多个领域。以下是日历热力图的主要应用场景及其具体案例:
1. 项目管理
-
任务进度监控:通过日历热力图,可以直观展示项目任务的完成情况。例如,不同颜色的深浅可以表示任务完成程度或工作量的大小,帮助项目管理者快速识别进度滞后的任务并调整计划。
-
资源分配优化:通过分析任务在时间上的分布,可以合理分配资源,避免资源浪费或过度集中。
2. 用户行为分析
-
活跃度分析:在产品运营中,日历热力图常用于展示用户每日的活跃度。例如,通过颜色深浅表示每日登录次数或操作频率,帮助产品团队优化用户体验。
-
用户行为模式识别:通过分析用户在不同日期的行为特征,可以洞察用户的使用习惯,从而制定更精准的运营策略。
3. 销售与市场分析
-
销售趋势分析:日历热力图可以清晰地展示每日或每月的销售额,帮助销售团队发现销售高峰和低谷,从而调整销售策略。
-
市场活动效果评估:通过分析活动期间的销售额或用户增长情况,可以评估市场活动的实际效果。
4. 代码贡献统计
-
GitHub贡献图:GitHub使用日历热力图展示用户的代码提交情况,颜色越深表示提交量越大。这种可视化方式帮助开发者直观了解自己的工作节奏和贡献模式。
5. 环境与公共数据分析
-
空气质量监测:通过日历热力图展示每日的空气质量指数(AQI),可以直观反映不同月份或季节的空气质量变化趋势。
-
交通流量分析:展示每日或每周的交通流量变化,帮助交通管理部门优化调度和规划。
6. 个人健康管理
-
运动数据追踪:例如,通过颜色深浅展示每日步数或运动时长,帮助用户了解自己的运动习惯并制定更科学的锻炼计划。
7. 其他领域
-
教育领域:分析学生每日的学习时长或作业完成情况,帮助教师和家长更好地了解学生的学习状态。
-
金融行业:展示每日交易量或收益情况,帮助投资者识别市场趋势。
日历热力图通过将时间序列数据与颜色编码相结合,为用户提供了一种直观且高效的数据分析工具。它适用于项目管理、用户行为分析、销售与市场分析、代码贡献统计、环境监测以及个人健康管理等多个领域,能够帮助用户快速发现数据中的模式、趋势和异常情况,从而支持决策优化和策略调整。
4、案例实现
使用 plotly
生成交互式日历热力图,效果如下:
-
坐标轴:
-
x 轴:为月份,使用中文月份标签(一月 - 十二月) ,添加了月度分隔线(
gridcolor='rgba(200, 200, 200, 0.5)'
) ,刻度字体大小为 14 。 -
y 轴:为日期,数值范围 1 - 31 ,日期从上到下递增(
autorange="reversed"
) ,添加了日期网格线(gridcolor='rgba(230, 230, 230, 0.5)'
) ,刻度字体大小为 12 。
-
-
颜色编码:颜色方案采用
RdBu_r
红蓝反转色阶,右侧颜色条表示事件频次,深色代表高频次,浅色代表低频次,频次数值范围大致在 42 - 56 。 -
周末高亮:周末日期(周六和周日)通过添加半透明红色矩形(
fillcolor="rgba(255, 220, 220, 0.5)"
) 进行高亮显示。 -
交互信息:鼠标悬停时,显示日期(
%{customdata[0]}
)和事件频次(%{z:.1f}
) ,展示格式如 “日期:具体日期
事件频次:具体数值” 。
代码如下:
import plotly.express as px
import pandas as pd
import numpy as np
# 生成示例数据
dates = pd.date_range("2023-01-01", "2023-12-31", freq="D")
values = np.random.poisson(lam=50, size=len(dates)) # 泊松分布模拟事件频次
df = pd.DataFrame({"Date": dates, "Value": values})
# 提取日期组件
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
df['Day'] = df['Date'].dt.day
df['DayOfWeek'] = df['Date'].dt.dayofweek # 0=周一,6=周日
df['Weekend'] = df['DayOfWeek'].isin([5, 6]) # 标记周末
# 生成月份标签映射
month_labels = {
1: '一月', 2: '二月', 3: '三月', 4: '四月',
5: '五月', 6: '六月', 7: '七月', 8: '八月',
9: '九月', 10: '十月', 11: '十一月', 12: '十二月'
}
df['MonthLabel'] = df['Month'].map(month_labels)
# 绘制交互式热力图
fig = px.density_heatmap(
df,
x=df['MonthLabel'], # 使用中文月份标签
y=df['Day'],
z="Value",
histfunc="avg",
color_continuous_scale="RdBu_r", # 使用红蓝反转色阶,更适合展示高低值对比
title="2023年每日事件频次日历热力图",
labels={
"x": "月份",
"y": "日期",
"color": "事件频次"
},
hover_data={
'MonthLabel': False, # 不在悬停中显示
'Day': True,
'DayOfWeek': False,
'Weekend': False,
'Date': True, # 显示完整日期
'Value': True # 显示事件频次
}
)
# 布局优化
fig.update_layout(
font_family="SimHei", # 使用更通用的中文字体
height=700,
width=1000,
title=dict(
text="2023年每日事件频次日历热力图",
font=dict(size=24),
x=0.5,
y=0.95
),
xaxis=dict(
title="",
tickfont=dict(size=14),
showgrid=True,
gridwidth=2,
gridcolor='rgba(200, 200, 200, 0.5)' # 添加月度分隔线
),
yaxis=dict(
title="日期",
autorange="reversed", # 日期从上到下递增
tickmode="array",
tickvals=list(range(1, 32)),
tickfont=dict(size=12),
showgrid=True,
gridwidth=1,
gridcolor='rgba(230, 230, 230, 0.5)'
),
coloraxis_colorbar=dict(
title="事件频次",
thickness=20,
len=0.8,
yanchor="middle",
y=0.5,
ticks="outside",
tickformat=".0f" # 整数格式化
)
)
# 高亮显示周末
for _, row in df[df['Weekend']].iterrows():
fig.add_shape(
type="rect",
x0=row['MonthLabel'],
x1=row['MonthLabel'],
y0=row['Day']-0.5,
y1=row['Day']+0.5,
line=dict(width=0),
fillcolor="rgba(255, 220, 220, 0.5)",
layer="below"
)
# 添加悬停模板
fig.update_traces(
hovertemplate='日期: %{customdata[0]}<br>事件频次: %{z:.1f}<extra></extra>'
)
# 显示图表
fig.show()
七、螺旋图
1、概念
螺旋图是一种基于阿基米德螺旋坐标系的图表,它以螺旋形状展示数据,从中心向外延伸,常用于绘制随时间变化的数据。螺旋图通过将时间序列数据沿螺旋线展开,能够有效节省空间,适合展示长时间跨度的数据趋势和周期性特征。例如,它可以用于展示年度或更长时间内的销售数据、气象变化等,帮助用户快速识别数据中的模式或异常情况,同时使复杂的时间序列数据更易于理解和分析。
2、特点
螺旋图是一种基于阿基米德螺旋坐标系的图表,具有以下主要特点:
-
独特的螺旋结构:螺旋图以螺旋形状展示数据,从中心向外延伸,适合表示长时间跨度的数据趋势,同时节省空间。
-
灵活的几何形式:螺旋图可以使用条形、线条或数据点等多种几何对象,沿螺旋路径展示数据,适合不同类型的数据可视化需求。
-
展示周期性特征:螺旋图能够清晰地展示数据的周期性模式,例如年度或季节性变化,帮助用户快速识别数据中的规律或异常情况。
-
高效的数据压缩:通过将时间序列数据沿螺旋线展开,螺旋图能够将长时间跨度的数据压缩在较小的空间内,便于观察和分析。
-
适用场景广泛:螺旋图常用于展示销售数据、气象变化等长时间序列数据,特别适合需要展示复杂时间序列的场景。
这些特点使得螺旋图成为一种高效且直观的数据可视化工具,尤其在需要展示周期性和长时间跨度数据时表现出色。
3、应用场景
螺旋图是一种基于阿基米德螺旋坐标系的数据可视化工具,其独特的结构和特性使其在多种场景中具有显著的应用价值。以下是螺旋图的主要应用场景及其特点:
1. 长时间序列数据的展示
-
特点:螺旋图能够将长时间跨度的数据压缩在较小的空间内,通过螺旋形状展示数据趋势,从而节省空间并提高数据密度。
-
适用场景:例如展示股票市场的逐日收盘价、气象变化趋势或历史销售数据。这些场景中,螺旋图能够清晰展示数据的整体变化趋势,同时避免线性图表因时间跨度大而显得拥挤。
2. 周期性数据的可视化
-
特点:螺旋图能够直观地展示数据的周期性特征,例如年度或季节性变化。当螺旋图的每一圈刻度差与数据周期一致时,周期性规律会非常明显。
-
适用场景:例如展示年度销售数据、季节性气候特征或周期性市场波动。这种展示方式便于用户快速识别规律或异常情况。
3. 复杂时间序列数据的分析
-
特点:螺旋图通过将时间序列数据沿螺旋路径展开,能够同时展示数据的趋势和周期性特征,特别适合处理复杂的时间序列数据。
-
适用场景:例如在金融领域分析股票价格波动,或在气象学中分析温度、降水等时间序列数据。
4. 节省空间的数据展示
-
特点:螺旋图通过卷曲的时间轴设计,能够在有限的图表空间内展示更多的数据点,非常适合空间受限的场景。
-
适用场景:例如在移动设备或小尺寸屏幕上展示大数据集,或者在需要同时展示多个数据集的仪表盘中使用。
5. 制造业和服务业中的优化
-
特点:螺旋图能够帮助分析生产流程中的周期性规律,从而优化生产效率。
-
适用场景:例如在制造业中分析生产周期,或在服务业中优化客户服务流程。
螺旋图以其独特的螺旋结构和高效的数据压缩能力,特别适合展示长时间跨度、周期性或复杂的时间序列数据。在金融、气象、制造业等领域,它能够帮助用户快速识别数据规律、优化流程并提高决策效率。这些特点使得螺旋图成为一种直观且强大的数据可视化工具。
4、案例实现
使用 Plotly 实现交互式螺旋图,效果如下:
-
数据点:每个数据点代表一天的数据,点的颜色根据数值(Value)通过
Plasma
颜色渐变方案确定,数值范围通过右侧颜色条展示。点的大小为 6 ,透明度为 0.7 。 -
年份区分:不同年份的数据点分别绘制,通过图例(legend)区分,图例显示年份名称。如 2020 - 2023 年的数据在图中以不同颜色的螺旋线展示。
-
交互信息:鼠标悬停在数据点上时,显示日期(如 2023 - 02 - 17 )和对应数值(如 10.73 ) 。
-
年份标签:在螺旋图上添加环形年份标签,位于对应年份螺旋线的起始位置(12 月位置) ,字体颜色为白色,大小为 12 。
-
月份刻度线:以虚线形式添加月份刻度线,从原点出发,延伸到螺旋图外,帮助用户更直观地了解时间分布。
代码如下:
import plotly.graph_objects as go
import pandas as pd
import numpy as np
# ===================== 生成示例数据 =====================
dates = pd.date_range("2020-01-01", "2023-12-31", freq="D")
values = np.cos(np.linspace(0, 8*np.pi, len(dates))) * 15 + np.random.normal(0, 3, len(dates))
df = pd.DataFrame({"Date": dates, "Value": values})
# ===================== 计算极坐标参数 =====================
df["Year"] = df["Date"].dt.year
df["DayOfYear"] = df["Date"].dt.dayofyear
years = df["Year"].unique()
# 半径和角度计算
radius_step = 2 # 每年半径增量
radius = (df["Year"] - years.min()) * radius_step + 1
theta = 2 * np.pi * df["DayOfYear"] / 365.25
# 转换为笛卡尔坐标
df["X"] = radius * np.cos(theta)
df["Y"] = radius * np.sin(theta)
# ===================== 创建交互式螺旋图 =====================
fig = go.Figure()
# 按年绘制螺旋线
for year in years:
mask = df["Year"] == year
fig.add_trace(go.Scattergl(
x=df[mask]["X"],
y=df[mask]["Y"],
mode='markers',
marker=dict(
size=6,
color=df[mask]["Value"],
colorscale='Plasma',
showscale=True,
opacity=0.7
),
name=str(year),
hovertext=df[mask]["Date"].dt.strftime("%Y-%m-%d") + "<br>Value: " + df[mask]["Value"].round(2).astype(str),
hoverinfo="text"
))
# ===================== 布局配置 =====================
fig.update_layout(
title="Interactive Spiral Chart (2020-2023)",
width=900,
height=900,
template="plotly_dark",
showlegend=True,
xaxis=dict(showgrid=False, zeroline=False, visible=False),
yaxis=dict(showgrid=False, zeroline=False, visible=False),
coloraxis_colorbar=dict(title="Value")
)
# 添加环形年份标签
for year in years:
angle = 0 # 标签角度(调整到12月位置)
r = (year - years.min()) * radius_step + 1
fig.add_annotation(
x=r * np.cos(angle),
y=r * np.sin(angle),
text=str(year),
showarrow=False,
font=dict(size=12, color="white")
)
# 添加月份刻度线
month_angles = np.linspace(0, 2*np.pi, 12, endpoint=False)
for angle in month_angles:
fig.add_shape(
type="line",
x0=0, y0=0,
x1=1.2*max(radius)*np.cos(angle),
y1=1.2*max(radius)*np.sin(angle),
line=dict(color="gray", width=1, dash="dot")
)
fig.show()
八、季节分解图
1、概念
季节分解图是一种将时间序列数据分解为趋势、季节性和残差三部分的可视化工具。通过这种分解,可以清晰地识别数据中的长期趋势、周期性变化以及随机波动。具体来说,趋势部分表示数据随时间的总体变化方向(如上升或下降),季节性部分反映周期性规律(如月度或年度波动),而残差部分则是无法由趋势和季节性解释的随机成分。这种图表常用于分析具有周期性特征的时间序列数据,例如气象变化、销售数据或经济指标,从而帮助用户更好地理解数据规律并优化预测模型。
2、特点
季节分解图具有以下特点:
-
三部分分解:季节分解图将时间序列数据分解为趋势、季节性和残差三个部分。趋势部分反映数据随时间的总体变化方向(如上升或下降),季节性部分揭示周期性规律(如月度或年度波动),而残差部分则是无法由趋势和季节性解释的随机成分。
-
灵活性和适应性:季节分解方法(如STL分解法)允许季节性成分随时间变化,且变化速率可由用户控制。这种灵活性使其能够处理复杂的时间序列数据,例如季节性周期长度不固定或季节性强度随时间变化的情况。
-
抗干扰能力:该方法对离群点的干扰具有较强的鲁棒性,能够有效分离出数据的真实趋势和季节性特征,避免异常值对分析结果的影响。
-
广泛适用性:季节分解图适用于多种领域,包括经济、气象、商业等,常用于分析具有周期性特征的时间序列数据。例如,通过分解销售数据,可以识别出销售趋势和季节性波动,从而优化库存管理和市场策略。
-
可视化支持:分解结果可以通过图表直观展示,帮助用户快速理解数据的组成成分及其变化规律,为预测和决策提供依据。
总之,季节分解图是一种强大的数据分析工具,通过分解复杂的时间序列数据,揭示其内在规律,并为预测和优化提供重要支持。
3、应用场景
季节分解图是一种强大的数据分析工具,其应用场景广泛,涵盖经济、气象、商业等多个领域。以下是其主要应用场景的总结:
1. 经济领域
-
分析经济周期性波动:通过季节分解图,可以将经济数据(如GDP、零售销售等)分解为趋势、季节性和残差三部分,从而揭示经济增长趋势和季节性规律。例如,分析季度零售销售数据,可以识别出消费旺季和淡季,为制定销售策略提供依据。
-
预测经济指标:在预测失业率、通货膨胀等指标时,季节分解图有助于剔除季节性波动,使预测更加准确。
2. 气象领域
-
研究气候模式:季节分解图可以用于分析气温、降水量等气象数据,分离出长期趋势(如全球变暖趋势)和季节性变化(如夏季高温、冬季降雪)。这种分析有助于研究气候变化规律。
-
优化气象预报:通过分解历史气象数据,可以更精准地识别季节性特征,提高气象预报的准确性。
3. 商业领域
-
库存管理:通过分析销售数据的季节性波动,企业可以合理安排库存,避免旺季缺货或淡季积压。例如,零售商可以提前为节假日销售高峰备货。
-
市场策略制定:季节分解图可以帮助企业识别市场需求的高峰和低谷,从而调整促销活动或产品推广计划。
4. 供应链管理
-
优化物流与生产计划:通过分解时间序列数据,企业可以更好地理解生产和运输的季节性需求,从而优化供应链流程,降低成本。
5. 其他领域
-
能源需求分析:例如,电力公司通过季节分解图分析用电量数据,识别夏季空调使用高峰和冬季取暖需求,从而优化发电计划。
-
公共卫生:在流行病分析中,季节分解图可用于研究疾病传播的季节性规律,为防疫措施提供数据支持。
季节分解图通过将时间序列数据分解为趋势、季节性和残差三部分,帮助用户清晰地识别数据的周期性规律和长期趋势。这种分析工具在多个领域都具有重要应用价值,为数据驱动的决策提供了强有力的支持。
4、案例实现
使用 plotly
实现交互式季节分解图,效果如下:
-
子图布局:通过
make_subplots
创建 4 行 1 列的子图布局,子图垂直间距为 0.06 ,每个子图有对应的标题,禁用副轴(specs=[[{"secondary_y": False}]]*4
) 。 -
数据轨迹:
-
原始数据(Observed):蓝色线条,展示实际观测到的时间序列数据,反映了数据的整体波动情况。
-
趋势项(Trend):绿色线条,呈现数据的长期趋势,通过线性拟合得到,体现了数据随时间的增长或下降趋势。
-
季节性(Seasonality):红色线条,展示数据的季节性波动规律,反映每年周期性的变化模式。
-
残差(Residual):紫色线条,是原始数据减去趋势项和季节性项后的剩余部分,包含了无法由趋势和季节性解释的随机波动。
-
-
交互信息:鼠标悬停时显示日期(如 2019 - 07 - 03 )和对应数值(如 24.94 ) 。
代码如下:
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
import plotly.graph_objects as go
from plotly.subplots import make_subplots
from statsmodels.tsa.seasonal import seasonal_decompose
# ===================== 生成示例数据 =====================
# 创建日期范围(2018-2020年,每日数据)
dates = pd.date_range(start="2018-01-01", periods=365*3, freq="D")
# 构建合成数据(含趋势+季节性+噪声)
np.random.seed(42)
trend = np.linspace(0, 50, len(dates)) # 线性趋势
seasonality = 10 * np.sin(2 * np.pi * dates.dayofyear/365) # 年周期性
noise = np.random.normal(0, 3, len(dates)) # 随机噪声
values = trend + seasonality + noise
# 转换为DataFrame
df = pd.DataFrame({
"Date": dates,
"Value": values
}).set_index("Date")
# ===================== 季节分解处理 =====================
# 执行分解(加法模型)
result = seasonal_decompose(
df["Value"],
model="additive", # 可选 "multiplicative" 乘法模型
period=365, # 年周期
extrapolate_trend='freq' # 处理边缘趋势
)
# ===================== 创建交互式图表 =====================
fig = make_subplots(
rows=4, cols=1,
shared_xaxes=True,
vertical_spacing=0.06,
subplot_titles=("原始数据 (Observed)", "趋势项 (Trend)",
"季节性 (Seasonality)", "残差 (Residual)"),
specs=[[{"secondary_y": False}]]*4 # 禁用副轴
)
# 添加各分量轨迹
components = [
(result.observed, "#1f77b4", "Observed", 1),
(result.trend, "#2ca02c", "Trend", 2),
(result.seasonal, "#d62728", "Seasonality", 3),
(result.resid, "#9467bd", "Residual", 4)
]
for data, color, name, row in components:
fig.add_trace(
go.Scatter(
x=data.index,
y=data,
mode="lines",
name=name,
line=dict(color=color, width=1.5),
hoverinfo="x+y",
hovertemplate="日期: %{x|%Y-%m-%d}<br>值: %{y:.2f}<extra></extra>"
),
row=row, col=1
)
# ===================== 布局配置 =====================
fig.update_layout(
title=dict(
text="时间序列季节分解图(2018-2020)",
x=0.5,
font=dict(size=24, family="Microsoft YaHei")
),
height=900,
template="plotly_white",
margin=dict(t=100),
hovermode="x unified",
showlegend=False
)
# 配置坐标轴
for row in range(1,5):
fig.update_yaxes(title_text="数值", row=row, col=1)
fig.update_xaxes(
rangeslider=dict(visible=True), # 底部添加范围滑动条
row=4, col=1
)
# 隐藏冗余标签
for row in range(1,4):
fig.update_xaxes(showticklabels=False, row=row, col=1)
# ===================== 输出结果 =====================
fig.show()
九、对比总结
图表类型 | 特点 | 应用场景 | 联系与区别 |
---|---|---|---|
地平线图 | 分色带展示,节省垂直空间,突出异常值 适合展示多个时间序列数据 | 时间序列数据可视化,如股票价格、气象数据等 | 与河流图相似,均适合展示时间序列数据,但地平线图更强调紧凑性和异常值突出,而河流图更注重数据流的变化。 |
河流图 | 带状图形展示数据流,宽度与数据大小成正比 适合展示类别数据随时间的变化 | 数据流分析,如用户行为、网络流量、事件流等 | 与地平线图类似,但更注重数据流的动态变化,适合展示多类别数据的波动情况。 |
瀑布图 | 浮动列展示数据增减变化 直观反映数据在不同时期或因素下的变化 | 财务分析、预算管理、经营分析 | 与其他图表相比,瀑布图更专注于展示数据的增减变化,适用于需要明确数据变化来源的场景。 |
烛形图 | 展示开盘价、收盘价、最高价和最低价 适合展示价格波动 | 金融领域,如股票、外汇、期货等价格波动分析 | 与地平线图和河流图不同,烛形图专注于价格波动,而其他图表更注重时间序列的整体趋势。 |
甘特图 | 横轴为时间,纵轴为任务,条形展示任务进度 适合项目管理 | 项目进度管理、任务调度、资源分配 | 甘特图与其他图表的主要区别在于其任务导向,而非时间序列数据的展示。 |
日历热力图 | 结合日历和热力图,展示随时间变化的指标 适合展示周期性数据 | 销售数据、用户活跃度、生产效率等 | 与螺旋图类似,适合展示周期性数据,但日历热力图更强调日历格式的直观性。 |
螺旋图 | 螺旋形展示数据,适合长时间序列和周期性数据 节省空间,展示数据趋势 | 金融、气象、制造业等长时间跨度数据的展示 | 与季节分解图类似,适合展示周期性数据,但螺旋图更强调数据的可视化效果,而季节分解图更注重数据分析。 |
季节分解图 | 分解为趋势、季节性和残差三部分 适合分析周期性规律 | 经济、气象、公共卫生等领域的时间序列数据分析 | 与螺旋图类似,适合展示周期性数据,但季节分解图更注重数据的分解和分析,而非可视化效果。 |
这些图表在展示时间趋势和数据分析方面各有特点:
-
时间序列可视化:地平线图、河流图、日历热力图、螺旋图适合展示时间序列数据,但侧重点不同,如地平线图强调紧凑性,河流图强调数据流动态,日历热力图强调周期性。
-
数据分析:瀑布图、季节分解图更注重数据的分解和分析,瀑布图适合展示数据的增减变化,季节分解图适合揭示周期性规律。
-
任务管理:甘特图专注于任务进度管理,与其他图表的功能区分明显。
-
价格波动:烛形图专注于价格波动,适用于金融领域。
这些图表通过不同的方式帮助用户理解时间趋势和数据分析,适用于不同的场景和需求。