时间趋势类可视化图像总结

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)优势与局限总结

图表类型优势局限
地平线图多序列对比清晰,节省空间;适合长期趋势观察;颜色编码便于快速识别数据类别数据量过大时易显杂乱;不适合展示数据间的层级或占比关系
河流图动态感强,直观呈现比例变化;适合展示数据流动与迁移过程难以精确读取数值;复杂数据可能导致视觉混淆
瀑布图逻辑推导清晰,突出中间步骤贡献;适用于解释数据变化的因果关系不适用于时间序列数据;仅适用于有明确起点和终点的场景
烛形图精准展示数据波动区间;金融领域应用广泛,专业认可度高信息密度高,需一定专业知识理解;非金融场景适用性较弱
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值