Matplotlib绘制分组聚合流程图

博客介绍了使用Matplotlib绘制分组聚合流程图,先创建绘制Dataframe的代码,随后开始绘制并展示了结果。

Matplotlib绘制分组聚合流程图

首先创建一个绘制Dataframe的代码:

import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
# 解决中文显示问题
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False


def draw_dataframe(df, loc=None, width=None, ax=None, linestyle=None,
                   textstyle=None):
    loc = loc or [0, 0]
    width = width or 1

    x, y = loc

    if ax is None:
        ax = plt.gca()

    ncols = len(df.columns) + 1
    nrows = len(df.index) + 1

    dx = dy = width / ncols

    if linestyle is None:
        linestyle = {'color': 'black'}

    if textstyle is None:
        textstyle = {'size': 12}

    textstyle.update({'ha': 'center', 'va': 'center'})

    # 画表格的垂直线
    for i in range(ncols + 1):
        plt.plot(2 * [x + i * dx], [y, y + dy * nrows], **linestyle)

    # 画表格的水平线
    for i in range(nrows + 1):
        plt.plot([x, x + dx * ncols], 2 * [y + i * dy], **linestyle)

    # 绘制索引标签
    for i in range(nrows - 1):
        plt.text(x + 0.5 * dx, y + (i + 0.5) * dy,
                 str(df.index[::-1][i]), **textstyle)

    # 绘制列标签
    for i in range(ncols - 1):
        plt.text(x + (i + 1.5) * dx, y + (nrows - 0.5) * dy,
                 str(df.columns[i]), style='italic', **textstyle)

    # 绘制索引的名称
    if df.index.name:
        plt.text(x + 0.5 * dx, y + (nrows - 0.5) * dy,
                 str(df.index.name), style='italic', **textstyle)

    # 插入数据文本
    for i in range(nrows - 1):
        for j in range(ncols - 1):
            plt.text(x + (j + 1.5) * dx,
                     y + (i + 0.5) * dy,
                     str(df.values[::-1][i, j]), **textstyle)

然后开始绘制:

fig = plt.figure(figsize=(20, 6), facecolor='white')
ax = plt.axes([0, 0, 1, 1])
ax.axis('off')

draw_dataframe(data.set_index('deal_date'), [0, 0])
ys = [1.8, 0.5, -0.5]
result = []
for i, (deal_date, split) in enumerate(data.groupby('deal_date')):
    draw_dataframe(split.set_index('deal_date'), [1.4, ys[i]])
    split.loc[split.area == 'A区', 'A区'] = split.order_id
    split.loc[split.area == 'B区', 'B区'] = split.order_id
    split.loc[split.area == 'C区', 'C区'] = split.order_id
    split = split.set_index('deal_date')[['A区', 'B区', 'C区']]
    draw_dataframe(split, [2.7, ys[i]])
    sum = split.count().to_frame(deal_date).T
    sum.index.name = 'deal_date'
    draw_dataframe(sum, [3.8, ys[i] + 0.25])
    result.append(sum)
result = pd.concat(result)
draw_dataframe(result, [5.1, 0.6])

style = dict(fontsize=16, ha='center', weight='bold')
plt.text(0.5, 2.4, "Input", **style)
plt.text(1.9, 2.9, "Split", **style)
plt.text(3.75, 2.9, "Apply(count)", **style)
plt.text(5.6, 1.7, "Combine", **style)

arrowprops = dict(facecolor='black', width=1, headwidth=6)
plt.annotate('', (1.4, 2.3), (1.0, 1.55), arrowprops=arrowprops)
plt.annotate('', (1.4, 1), (1.0, 1), arrowprops=arrowprops)
plt.annotate('', (1.4, -0.1), (1.0, 0.45), arrowprops=arrowprops)

plt.annotate('', (2.7, 2.3), (2.4, 2.3), arrowprops=arrowprops)
plt.annotate('', (2.7, 1), (2.4, 1), arrowprops=arrowprops)
plt.annotate('', (2.7, -0.1), (2.4, -0.1), arrowprops=arrowprops)

plt.annotate('', (5.1, 1.2), (4.8, 2.3), arrowprops=arrowprops)
plt.annotate('', (5.1, 1), (4.8, 1), arrowprops=arrowprops)
plt.annotate('', (5.1, 0.8), (4.8, -0.1), arrowprops=arrowprops)

plt.show()

结果:

image-20210110123338829

<think>我们被要求绘制时空图卷积网络(ST-GCN)的流程图,并询问可用的工具或方法。ST-GCN是一种用于处理时空图数据的模型,通常用于人体动作识别等任务。它结合了图卷积网络(GCN)和时间卷积,以同时捕捉空间结构和时间动态。 根据引用[2]中提到的图卷积网络(GCN)的基本公式,我们可以知道GCN在空间域上通过邻接矩阵聚合邻居信息。而ST-GCN则在此基础上增加了时间维度的卷积。 绘制ST-GCN的流程图,我们需要表达以下关键部分: 1. 输入:通常是一组连续帧的人体骨骼关键点,构成一个时空图(每个节点代表一个关节,边包括空间连接(同一帧内关节之间的连接)和时间连接(相邻帧同一关节的连接))。 2. 网络结构:由多个时空图卷积块(ST-GCN block)组成,每个块包含: - 空间图卷积(Spatial Graph Convolution):对每一帧应用图卷积,聚合空间邻居信息。 - 时间卷积(Temporal Convolution):在时间维度上应用一维卷积,聚合相邻帧的信息。 - 激活函数(如ReLU)和归一化层(如BatchNorm)。 3. 输出:经过多个ST-GCN块后,通过全局平均池化得到整个序列的特征,然后通过全连接层分类。 绘制工具: 1. PPT / Keynote:手绘示意图,适合展示概念。 2. 专业绘图工具:如Visio、Draw.io(在线免费)等,可以绘制标准的流程图。 3. 神经网络可视化工具:如Netron(用于可视化模型结构,但可能不支持ST-GCN的自定义层)、TensorBoard(如果使用TensorFlow,可以查看计算图)等。 4. Python绘图库:如Matplotlib、Seaborn(用于绘制示意图),或者使用Graphviz(通过DOT语言描述图结构)来绘制网络图。 由于ST-GCN的结构相对复杂,我们可以分步骤绘制: 步骤1:绘制单个ST-GCN块的结构 - 输入:时空图(表示为四维张量:批大小×帧数×关节数×特征维度) - 空间图卷积:在每一帧上独立进行图卷积(使用邻接矩阵) - 时间卷积:在时间维度上应用一维卷积(通常使用1D卷积,卷积核沿时间维度滑动) - 激活和归一化 - 输出:与输入同维度的张量 步骤2:绘制整个网络流程图 - 输入层 - 多个ST-GCN块的堆叠 - 全局平均池化层(在时间维度和关节维度上取平均) - 全连接层 - 输出(分类结果) 另外,我们还可以参考原始论文中的结构图。例如,ST-GCN的原始论文(Spatial Temporal Graph Convolutional Networks for Skeleton-Based Action Recognition)中就有网络结构图。 因此,我们可以这样进行: 1. 使用绘图工具(如Draw.io)绘制流程图。 2. 或者使用Python的绘图库(如Matplotlib)来绘制示意图。 下面是一个使用Matplotlib绘制简单示意图的示例(伪代码,非实际运行代码,仅说明思路): - 创建图形和子图 - 绘制多个矩形代表不同层 - 用箭头连接这些层 - 标注每一层的名称 但是,更详细的可视化可能需要更专业的工具。另外,如果使用深度学习框架(如PyTorch)实现了ST-GCN,我们可以使用相应的可视化工具来查看计算图。 下面,我们将提供一种绘制ST-GCN流程图的步骤描述,以及可用的工具建议。 相关问题: 1. ST-GCN中空间图卷积和时间卷积的具体实现细节是什么? 2. 除了ST-GCN,还有哪些时空图神经网络模型? 3. 如何用PyTorch实现ST-GCN?</think>### 如何绘制时空图卷积网络(ST-GCN)的流程图 时空图卷积网络(ST-GCN)是一种用于处理时空图数据的模型,常用于人体动作识别等任务。其流程图应包含以下核心模块: 1. **输入层** - 时空图数据表示:$G = (V, E, A)$ - $V$:节点(如人体关节) - $E$:空间边(关节连接)和时间边(跨帧连接) - $A$:邻接矩阵(引用[2]) 2. **ST-GCN块**(堆叠多个) ```mermaid graph LR A[输入特征] --> B[空间图卷积] B --> C[时间卷积] C --> D[激活函数 ReLU] D --> E[批归一化] E --> F[输出特征] ``` - **空间图卷积**: 使用邻接矩阵聚合邻居信息,公式参考引用[2]: $$H^{(l+1)} = \sigma(\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} H^{(l)} W^{(l)})$$ - **时间卷积**: 在时间维度使用1D卷积,捕捉动作动态 3. **输出层** - 全局平均池化 → 全连接层 → Softmax分类 --- ### 可视化工具与方法 1. **专业绘图工具** - **Draw.io** / **Diagrams.net**(免费在线): 拖拽式操作,提供神经网络模板,可直接导出PNG/SVG。 - **Lucidchart**: 协作式绘图,支持自定义图层和高级形状库。 2. **代码生成可视化** - **PyTorch + TensorBoard**: 通过`torch.utils.tensorboard`的`add_graph()`函数自动生成计算图。 ```python from torch.utils.tensorboard import SummaryWriter writer = SummaryWriter() writer.add_graph(stgcn_model, input_tensor) # 自动可视化模型结构 ``` - **Netron**(模型可视化工具): 直接导入ONNX/PyTorch模型文件生成结构图。 3. **学术绘图规范** - **颜色编码**:空间卷积(蓝色)、时间卷积(绿色)、融合操作(橙色) - **层级标注**:用虚线框标注重复模块,箭头标注数据流向 - 示例图参考:[ST-GCN原始论文](https://arxiv.org/abs/1801.07455) Figure 2 --- ### 绘制步骤 1. **设计模块层级** - 输入 → N个ST-GCN块 → 全局池化 → 分类层 2. **细节展开单个ST-GCN块** - 空间卷积 → 时间卷积 → 残差连接 → 激活/归一化 3. **添加数学符号**(可选) 在卷积操作旁标注公式,如空间卷积的$\tilde{A}$(引用[2]) > **工具推荐组合**:用Draw.io绘制整体框架,用TensorBoard生成计算图细节,最后用Adobe Illustrator调整学术风格。 --- ### 示例流程图(简化版) ```mermaid graph TD A[输入骨骼序列] --> B[ST-GCN块1] B --> C[ST-GCN块2] C --> D[...] D --> E[ST-GCN块N] E --> F[全局平均池化] F --> G[全连接层] G --> H[动作分类] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小明-代码实体

喜欢,就关注;爱,就打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值