1、地平线图
特点:
- 数据展示:可以在有限的空间内展示多个时间序列数据,每个序列通常用不同的颜色或线条样式表示。
- 时间趋势:能够清晰地展示每个时间序列随时间的变化趋势,包括上升、下降、波动等。
- 对比分析:方便对多个时间序列进行对比,观察它们之间的差异和相似之处。
- 紧凑布局:适用于数据量较大的情况,通过紧凑的布局展示多个序列,节省空间。
应用场景:
- 适用于多时间序列数据的趋势对比分析,如经济指标波动、金融资产价格变化、环境参数监测、患者生理指标跟踪等,帮助快速识别模式、相关性和异常变化。
使用python的实现过程及结果:
import numpy as np
import matplotlib.pyplot as plt
# 设置中文字体支持
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
def create_horizon_chart(data, titles=None, bands=3, height_ratio=0.3):
"""
创建地平线图
参数:
data: 二维数组,每行代表一个时间序列
titles: 每个时间序列的标题列表
bands: 分割的色带数量
height_ratio: 每个色带的高度比例
"""
n_series, n_points = data.shape
fig, axes = plt.subplots(n_series, 1, figsize=(12, 2 * n_series), sharex=True)
if n_series == 1:
axes = [axes]
# 计算每个色带的阈值
max_val = np.max(data)
band_height = max_val / bands
# 定义色带颜色(从浅到深)
colors = [
(0.9, 0.9, 1.0), # 浅蓝
(0.6, 0.6, 0.9), # 中蓝
(0.3, 0.3, 0.8), # 深蓝
(1.0, 0.9, 0.9), # 浅红
(0.9, 0.6, 0.6), # 中红
(0.8, 0.3, 0.3), # 深红
]
for i, series in enumerate(data):
ax = axes[i]
ax.set_frame_on(False)
ax.axes.get_yaxis().set_visible(False)
# 添加标题
if titles and i < len(titles):
ax.set_title(titles[i], loc='left', pad=10)
# 绘制每个色带
for b in range(bands):
# 上半部分(正值)
upper_band = np.clip(series - b * band_height, 0, band_height)
ax.fill_between(
range(n_points),
b * height_ratio,
b * height_ratio + upper_band * height_ratio / band_height,
color=colors[b],
alpha=0.8
)
# 下半部分(负值)
lower_band = np.clip(-series - b * band_height, 0, band_height)
ax.fill_between(
range(n_points),
-b * height_ratio,
-b * height_ratio - lower_band * height_ratio / band_height,
color=colors[b + bands],
alpha=0.8
)
# 设置y轴范围
ax.set_ylim(-bands * height_ratio, bands * height_ratio)
# 添加x轴标签(仅底部)
axes[-1].set_xlabel('时间')
plt.tight_layout()
return fig
# 生成示例数据
np.random.seed(42)
n_points = 50 # 时间点数量
n_series = 4 # 序列数量
# 创建具有不同趋势的时间序列
x = np.linspace(0, 10, n_points)
data = np.zeros((n_series, n_points))
data[0] = np.sin(x) * 3 + np.random.normal(0, 0.5, n_points) # 正弦波
data[1] = np.cos(x) * 2 + np.random.normal(0, 0.5, n_points) # 余弦波
data[2] = np.linspace(0, 5, n_points) + np.random.normal(0, 0.5, n_points) # 上升趋势
data[3] = np.linspace(5, 0, n_points) + np.random.normal(0, 0.5, n_points) # 下降趋势
# 示例标题
titles = ["产品A销量趋势", "产品B销量趋势", "客户满意度指数", "市场份额变化"]
# 创建地平线图
fig = create_horizon_chart(data, titles)
plt.show()
2、河流图
特点:
- 河流图是一种特殊的堆叠面积图,围绕中心轴线布局 。其形状类似河流,“河流” 宽度与数据大小成正比,以颜色区分不同类别 。平行流动轴多为时间序列,可展示不同类别数据随时间的变化,能直观呈现各部分占比及动态演变,兼具艺术性与直观性 。
应用场景:
- 河流图广泛应用于多领域数据随时间的动态展示。在经济金融领域,用于呈现各行业产值、金融资产规模等的占比及变化,助于洞察经济结构演变;人口统计方面,可展现不同年龄、地区人口数量及迁移趋势,为政策制定提供依据;市场分析中,能直观呈现品牌市场份额、产品销量变动,辅助企业战略决策;学术研究里,可展示多变量动态关系,助力挖掘数据内在规律。
使用python的实现过程及结果:
import plotly.graph_objects as go
import pandas as pd
# 构造示例数据
data = {
'time': ['2020', '2021', '2022', '2023', '2024'],
'category1': [10, 15, 20, 22, 25],
'category2': [5, 8, 12, 15, 18],
'category3': [3, 6, 9, 11, 13]
}
df = pd.DataFrame(data)
fig = go.Figure()
# 计算累积值用于堆叠
cumulative = pd.DataFrame(0, index=df.index, columns=df.columns)
for i, category in enumerate(df.columns[1:]):
# 计算当前类别在河流图中的上下边界
if i == 0:
lower_bound = pd.Series(0, index=df.index)
else:
lower_bound = cumulative.iloc[:, i]
upper_bound = lower_bound + df[category]
# 更新累积值
cumulative[category] = upper_bound
# 使用Scatter绘制河流图区域
fig.add_trace(go.Scatter(
x=df['time'],
y=upper_bound,
fill='tonexty', # 填充到上一个轨迹
mode='lines',
line=dict(width=0),
name=category
))
# 添加连接线(仅用于美观)
fig.add_trace(go.Scatter(
x=df['time'],
y=lower_bound,
mode='lines',
line=dict(width=0, color='rgba(0,0,0,0)'),
showlegend=False
))
# 调整布局
fig.update_layout(
title='河流图示例',
xaxis_title='时间',
yaxis_title='数值',
showlegend=True,
hovermode='x unified',
plot_bgcolor='white',
margin=dict(l=60, r=60, t=60, b=60)
)
fig.show()
3、瀑布图
特点:
- 瀑布图(Waterfall Chart)通过浮动柱子展示数据的起始值、增减变化及最终结果,通常以蓝色表示增加、红色表示减少,灰色表示初始或最终值。其核心特点是能够清晰展示数值的逐步变化过程及其累积效应,适用于展示数据的构成和演变路径,帮助用户理解各因素对整体变化的贡献。
应用场景:
- 瀑布图常用于展示财务损益、销售分析、预算变化、人口增长分解等场景,能直观呈现从起点到终点的数值变化过程及关键驱动因素。例如:财务报表中展示收入、成本、费用等项目对利润的影响;销售分析中呈现各渠道、产品或地区对总销售额的贡献;项目管理中展示预算的初始值、各项调整及最终预算;人口统计中分解出生、死亡、迁移等因素对总人口变化的影响。
使用python的实现过程及结果:
import plotly.graph_objects as go
# 示例数据 - 财务损益分析
fig = go.Figure(go.Waterfall(
name="2023年损益",
orientation="v",
measure=["absolute", "relative", "relative", "relative", "total"],
x=["初始收入", "产品销售增长", "服务收入", "运营成本", "净利润"],
textposition="outside",
text=["¥10,000", "+¥2,500", "+¥1,500", "-¥3,000", "¥11,000"],
y=[10000, 2500, 1500, -3000, 0], # 最后一个值为0,由total类型自动计算
connector={"line":{"color":"rgb(63, 63, 63)"}},
))
fig.update_layout(
title="2023年度财务损益瀑布图",
showlegend=True,
yaxis=dict(title="金额 (¥)"),
font=dict(family="SimHei", size=14) # 确保中文正常显示
)
fig.show()
4、烛形图
特点:
- 烛形图由一系列类似蜡烛形状的图形构成,每个蜡烛对应一个时间周期(如一天、一周等)。蜡烛主体部分代表开盘价和收盘价,实心(或深色)表示收盘价低于开盘价,空心(或浅色)表示收盘价高于开盘价;蜡烛上下方的细线(影线)分别表示该周期内的最高价和最低价。这种图表能够清晰展示数据在一定时间内的波动范围、开盘收盘情况,直观反映价格或数据的变化趋势及市场情绪。
应用场景:
- 烛形图主要应用于金融市场领域,如股票、期货、外汇等交易数据的可视化,用于分析资产价格在不同时间段内的波动情况,帮助投资者判断市场趋势、买卖信号和市场情绪。同时,在其他领域,若数据具有类似的 “开盘 - 收盘 - 最高 - 最低” 特征,如项目进度的起始与结束时间、任务完成度的区间等,也可借助烛形图展示其动态变化过程和波动区间 。
使用python的实现过程及结果:
import pandas as pd
import numpy as np # 添加 NumPy 导入
import plotly.graph_objects as go
# 生成模拟股票数据
dates = pd.date_range(start='2024-01-01', periods=30, freq='B')
np.random.seed(42)
# 创建价格数据
prices = [100]
for _ in range(29):
change = np.random.normal(0, 1)
prices.append(prices[-1] + change)
# 生成开盘价、最高价、最低价和收盘价
data = {
'Date': dates,
'Open': [p * (1 + np.random.uniform(-0.02, 0.02)) for p in prices],
'High': [p * (1 + np.random.uniform(0.01, 0.03)) for p in prices],
'Low': [p * (1 - np.random.uniform(0.01, 0.03)) for p in prices],
'Close': [p * (1 + np.random.uniform(-0.02, 0.02)) for p in prices]
}
df = pd.DataFrame(data)
# 创建烛形图
fig = go.Figure(data=go.Candlestick(
x=df['Date'],
open=df['Open'],
high=df['High'],
low=df['Low'],
close=df['Close']
))
# 更新布局,设置中文字体
fig.update_layout(
title='股票价格烛形图示例',
yaxis_title='价格 (元)',
xaxis_title='日期',
font=dict(family="SimHei, WenQuanYi Micro Hei, Heiti TC", size=14),
xaxis_rangeslider_visible=False # 可选:隐藏底部滑块
)
# 显示图表
fig.show()
# 也可以将图表保存为HTML文件
# fig.write_html("candlestick_chart.html")
5、折线图
特点:
- 折线图以直线段连接数据点,直观展示数据随时间或有序类别变化的趋势。其特点包括:横轴通常为时间或有序变量,纵轴为数值;能清晰反映数据增减变化、峰值与谷值位置及变化速率;支持多组数据对比,通过不同颜色或线型区分;适合展示连续型数据的变化模式,强调趋势而非精确数值。
应用场景:
- 折线图广泛应用于展示随时间变化的连续性数据趋势。在经济领域,用于呈现 GDP 增长率、通货膨胀率等宏观指标的长期走势;金融市场中,展示股票价格、汇率波动;科学研究里,记录实验数据变化;商业分析中,追踪销售业绩、用户活跃度等关键指标;公共卫生领域,监测疫情发展、疫苗接种率变化等。其优势在于能快速呈现数据变化方向、周期性特征及异常波动,辅助预测未来趋势与决策制定。
使用python的实现过程及结果:
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体支持
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
# 生成示例数据
x = np.linspace(2015, 2025, 11) # 年份数据
y1 = np.random.randint(50, 100, 11) # 产品A销量
y2 = np.random.randint(30, 80, 11) # 产品B销量
y3 = np.random.randint(10, 60, 11) # 产品C销量
# 创建图形和坐标轴
plt.figure(figsize=(12, 6)) # 设置图形大小
# 绘制多条折线
plt.plot(x, y1, marker='o', linestyle='-', color='blue', label='产品A')
plt.plot(x, y2, marker='s', linestyle='--', color='red', label='产品B')
plt.plot(x, y3, marker='^', linestyle='-.', color='green', label='产品C')
# 添加标题和标签
plt.title('2015-2025年各产品销量趋势对比')
plt.xlabel('年份')
plt.ylabel('销量 (万件)')
# 设置x轴刻度为整数年份
plt.xticks(x.astype(int))
# 添加图例和网格
plt.legend()
plt.grid(True, linestyle='--', alpha=0.7)
# 展示图形
plt.tight_layout() # 自动调整布局
plt.show()
6、面积图
特点:
- 视觉强调:填充区域增强了数据量的直观感受,适合展示总量变化。
- 堆叠特性:支持堆叠显示多类别数据,展示各部分对整体的贡献比例。
- 趋势对比:可同时呈现多组数据的趋势,颜色区分便于快速识别类别差异。
- 时间维度:横轴通常为时间,纵轴为数值,突出随时间的累积变化。
应用场景:
- 面积图适用于展示数据的累积变化及其组成结构随时间的动态关系。在商业分析中,常用于呈现不同产品线的收入占比变化、用户增长来源分布;在资源管理领域,展示能源消耗类型的构成比例;在人口统计中,可视化不同年龄段人口数量的历史演变;在项目管理中,跟踪各阶段任务完成量的累积进度。其优势在于既能展示总量趋势,又能体现内部结构的动态变化,辅助决策制定与资源分配。
使用python的实现过程及结果:
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体支持
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
# 生成示例数据
years = np.arange(2015, 2025)
category1 = np.random.randint(10, 30, size=10) # 类别1数据
category2 = np.random.randint(5, 25, size=10) # 类别2数据
category3 = np.random.randint(0, 15, size=10) # 类别3数据
# 创建图形和坐标轴
plt.figure(figsize=(12, 7))
# 绘制堆叠面积图
plt.stackplot(years, category1, category2, category3,
labels=['产品A', '产品B', '产品C'],
colors=['#66B3FF', '#99FF99', '#FFCC99'],
alpha=0.7)
# 添加标题和标签
plt.title('2015-2024年各产品市场份额变化')
plt.xlabel('年份')
plt.ylabel('市场份额 (%)')
# 设置x轴刻度和图例
plt.xticks(years)
plt.legend(loc='upper left')
# 添加网格线
plt.grid(True, linestyle='--', alpha=0.7)
# 展示图形
plt.tight_layout()
plt.show()
7、时间趋势类相关的可视化图像对比总结
(1)图表特点对比
图表类型 | 核心特征 | 视觉表现 |
---|---|---|
地平线图 | 多个时间序列以紧凑的横向条形展示,用颜色区分数据系列,呈现趋势变化 | 水平条形带起伏,颜色鲜明,占用空间小 |
河流图 | 基于堆叠面积图,数据围绕中心轴线流动,宽度反映数值大小,展示比例与趋势 | 形似河流,流动感强,动态效果突出 |
瀑布图 | 通过浮动柱子展示数据从起始值到最终值的增减变化过程,突出中间步骤的贡献 | 阶梯状柱子,用颜色区分增减,逻辑清晰 |
烛形图 | 每个周期数据用类似蜡烛的图形表示,展示开盘、收盘、最高、最低四个关键值 | 蜡烛形状直观反映波动,适合高频数据 |
(2)适用场景对比
图表类型 | 典型应用场景 |
---|---|
地平线图 | 多维度数据趋势对比(如经济指标、医疗数据、环境参数的长期监测) |
河流图 | 数据占比与流动趋势分析(如市场份额变化、人口迁移、资金流向动态) |
瀑布图 | 数据构成与影响因素拆解(如财务损益分析、项目预算调整、绩效贡献度展示) |
烛形图 | 金融市场交易数据可视化(如股票、期货价格走势),或其他需突出极值与区间的数据 |
(3)优势与局限总结
图表类型 | 优势 | 局限 |
---|---|---|
地平线图 | 多序列对比清晰,节省空间;适合长期趋势观察;颜色编码便于快速识别数据类别 | 数据量过大时易显杂乱;不适合展示数据间的层级或占比关系 |
河流图 | 动态感强,直观呈现比例变化;适合展示数据流动与迁移过程 | 难以精确读取数值;复杂数据可能导致视觉混淆 |
瀑布图 | 逻辑推导清晰,突出中间步骤贡献;适用于解释数据变化的因果关系 | 不适用于时间序列数据;仅适用于有明确起点和终点的场景 |
烛形图 | 精准展示数据波动区间;金融领域应用广泛,专业认可度高 | 信息密度高,需一定专业知识理解;非金融场景适用性较弱 |