基于Microsoft.Extensions.AI 和 Microsoft.Extensions.VectorData构建向量搜索

  1. 流图:数据的河流

如果把传统的堆叠面积图想象成一块块整齐堆叠的积木,那么流图就像一条蜿蜒流淌的河流,河道的宽窄变化自然流畅,波峰波谷过渡平滑。

它特别适合展示多个类别数据随时间的变化趋势,尤其是当你想强调整体流动感和各部分的相对比例变化时。

流图的核心思想是将传统的堆叠面积图进行"平滑"处理。

在matplotlib中,我们可以使用fill_between函数结合样条插值来创建平滑的边缘。

关键在于将堆叠的数据进行累积,然后对累积边界进行平滑处理。

数据准备

x = np.linspace(0, 10, 100)

构造三组波浪数据

y1 = 2 + np.sin(x) # 基础波动

y2 = 2 + np.cos(x - 1.5) # 错位波动

y3 = 2 + np.sin(x + 2) # 再次错位

省略 ...

绘图设置

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))

--- 左图:普通堆叠面积图 (baseline='zero') ---

ax1.stackplot(x, y_data, labels=labels, colors=colors, baseline='zero', alpha=0.8)

省略 ...

--- 右图:流图 (baseline='sym') ---

'sym' 表示对称中心布局

ax2.stackplot(x, y_data, labels=labels, colors=colors, baseline='sym', alpha=0.8)

ax2.axhline(0, color='black', ls='--', alpha=0.1) # 画一条中心参考线

省略 ...

去除右图边框,增加流动感

for spine in ax2.spines.values():

spine.set_visible(False)

plt.tight_layout()

plt.show()

流图解决了一个视觉错觉问题:在普通堆叠面积图中,上面的数据层会因为下面数据层的起伏而被迫"扭曲",很难看出它原本的形状。

流图通过中心布局,减少了这种扭曲,非常适合展示随时间变化的趋势和不同类别权重的波动,这种有机的形态还能给读者带来极强的审美愉悦感。

  1. 地平线图:数据的群山

想象一下远处的地平线上有一排连绵的山脉,每座山的高度代表一个数据值。

地平线图就是这样一种可视化技术,它将时间序列数据压缩在一个很小的垂直空间内,通过颜色和分层来展示数据的变化。

特别适合在有限空间内展示多个时间序列的对比。

地平线图的核心思想是数据分层和颜色渐变。

它将数据值分成若干层(通常是2-3层),每层用一种颜色表示。当数据值超过一层时,就用更深的颜色或不同的颜色填充。这样可以在很小的垂直空间内展示很大的数据范围。

from datetime import timedelta

生成模拟数据:过去10年五大科技公司的股价波动

np.random.seed(42)

生成日期范围:过去10年,每月一个数据点

dates = pd.date_range("2013-01-01", "2023-01-01", freq="ME")

companies = ["苹果", "谷歌", "微软", "亚马逊", "Meta"]

生成各公司的股价模拟数据(标准化到相似范围)

data = {}

for company in companies:

基础趋势:每家公司有不同的增长趋势,但最终都在70-90范围内

省略 ...

转换为DataFrame

df = pd.DataFrame(data, index=dates)

创建对比图表

fig, axes = plt.subplots(2, 1, figsize=(14, 10))

============ 传统堆叠面积图 ============

colors = ["#FF6B6B", "#4ECDC4", "#45B7D1", "#FFD166", "#9B5DE5"]

为堆叠面积图重新归一化数据

df_normalized = df.div(df.sum(axis=1), axis=0) * 100

y_cumulative = np.zeros(len(df))

for i, company in enumerate(companies):

axes[0].fill_between(

df.index,

y_cumulative,

y_cumulative + df_normalized[company].values,

color=colors[i],

alpha=0.7,

label=company,

edgecolor="white",

linewidth=0.5,

)

y_cumulative += df_normalized[company].values

省略 ...

============ 地平线图:股价波动对比 ============

生成股价变化百分比数据(更能体现波动对比)

np.random.seed(42)

price_changes = {}

for company in companies:

生成均值附近波动的变化数据

省略 ...

关键参数:定义"波段"

BAND_HEIGHT = 3.0 # 每个颜色波段代表的变化率幅度 (%)

NUM_BANDS = 3 # 正负方向各使用的波段层数

df = pd.DataFrame(price_changes, index=dates)

为每家公司计算并绘制地平线

for i, company in enumerate(companies):

公司的基准Y轴位置(水平线)

省略 ...

分层与绘制:从第1层到第NUM_BANDS层

for band in range(NUM_BANDS):

--- 处理正偏差(上涨)---

计算当前层的数据:偏差值减去已绘制层的高度,并限制在本层高度内

省略 ...

--- 处理负偏差(下跌)---

对负值取绝对值,进行类似处理

省略 ...

美化图表

省略 ...

6. 添加图例

import matplotlib.patches as mpatches

legend_patches = []

省略 ...

plt.tight_layout(h_pad=5)

plt.show()

地平线图是空间利用大师。当你有 20 个股票或者 50 个城市的温度需要放在一张图里对比时,普通的面积图会挤成一团乱麻。

地平线图可以将每个序列压缩成一个窄窄的横条,但在保持视觉分辨率的同时,还能让你看清极值(通过深颜色)。

  1. 总结

数据可视化不仅是科学,也是艺术。流图和地平线图这两种面积图变体,分别从"流动之美"和"空间效率"两个角度拓展了面积图的可能性。

它们证明了,通过对基础图表的创意改造,我们可以让数据讲述更丰富、更生动的故事。姆窒猩窃

相关推荐
lFAy7Ha3P3 小时前
PixelMentor:一个开源网站 · 调用AI视觉能力分析图片 · 提供影视后期修改意见
分享
Bau2aoic93 小时前
Skills 编写学习
分享
EUL8FUCEU3 小时前
Maomi.Core | 一个好用的模块化和自动服务注册框架
分享
rV3u0zV4U3 小时前
存储那么贵,何不白嫖飞书云文件空间
分享
kas9P0mBj3 小时前
Jenkins 学习总结
分享
gr180eoY53 小时前
OPUS编解码器在audio DSP上的移植和应用
分享
GCRK1f25f3 小时前
.NET 新特性概览与相关文章索引
分享
VEKlWXO3U4 小时前
再次革新 .NET 的构建和发布方式(三)
分享
kort02i1s4 小时前
Langchain .. 学习 --- LCEL和Runnable
分享