Python实战:基于Matplotlib的脊髓横断面解剖图程序化生成
最近在神经科学和医学影像处理领域经常需要处理和分析脊髓横断面的图像数据。无论是进行神经解剖学研究、教学演示还是开发基于AI的病理诊断辅助工具一个清晰、准确的脊髓横断面结构图都是至关重要的基础。然而手动绘制或从复杂影像中精确分割出脊髓的各个功能区域如灰质、白质、中央管不仅耗时而且对专业知识要求极高。本文将围绕“脊髓横断面”这一主题提供一套从基础概念理解到利用Python进行数字化重建与可视化的完整实战方案。我们将使用matplotlib和numpy等库模拟生成一个标准的人类脊髓颈膨大处横断面示意图。通过本文你将掌握脊髓横断面的核心解剖学结构。使用代码参数化定义这些结构几何形状的方法。生成高质量、可定制化插图的完整流程。如何将生成的图像用于报告、演示或作为更复杂图像处理模型的输入。本文内容适合生物医学工程、神经科学入门的学生以及需要处理医学影像数据的开发者。即使没有深厚的解剖学背景也能跟随步骤理解核心概念并复现结果。1. 脊髓横断面解剖学基础在开始编码之前我们必须先理解所要描绘的对象。脊髓位于椎管内其横断面结构在不同节段颈段、胸段、腰段、骶段有所差异但基本模式一致。我们以典型的颈膨大负责上肢神经支配处的横断面为例进行说明。一个标准的脊髓横断面主要由以下结构组成白质位于外围颜色较浅主要由上行感觉和下行运动的有髓神经纤维束组成。可分为前索、外侧索和后索。灰质位于中央呈“H”形或蝴蝶形颜色较深包含神经元的胞体、树突和突触。可分为前角含有运动神经元其轴突组成前根支配骨骼肌。后角与感觉信息的中继和整合有关接受后根传入的感觉神经纤维。中间带含有中间神经元在颈膨大和腰膨大处尤为发达包含侧角交感神经节前神经元胞体所在处仅存在于胸腰段。中央管位于灰质中央内含脑脊液。前正中裂与后正中沟分别为脊髓腹侧正中的深裂和背侧正中的浅沟是重要的表面标志。前根与后根脊神经的组成部分通常在离体的横断面图中不显示其全长仅显示根部。理解这些结构的相对位置和形状是我们用几何图形进行数学建模的基础。2. 环境准备与工具说明我们将使用 Python 进行绘图主要依赖NumPy进行数学计算Matplotlib进行图形绘制。这是一种轻量级、可复现且高度可定制的方法。环境要求操作系统Windows / macOS / Linux 均可。Python 版本 3.7。必要库numpy用于生成坐标点数组。matplotlib核心绘图库。项目结构创建一个简单的项目文件夹即可例如spinal_cord_section。我们将在一个 Python 脚本中完成所有工作。spinal_cord_section/ ├── generate_spinal_cord.py # 主脚本文件 └── output/ # 可选用于保存生成图片的文件夹安装依赖如果你还没有安装这些库可以使用 pip 进行安装pip install numpy matplotlib3. 核心思路与图形建模我们的目标是创建一个程序化的示意图而不是处理真实医学影像。核心思路是用基本的几何形状椭圆、多边形、圆来近似表示解剖结构。定义画布和比例确定整个脊髓断面的大致尺寸例如模拟一个宽约12mm高约18mm的断面。绘制白质轮廓用一个椭圆或圆角矩形来代表脊髓的外缘。绘制灰质“H”形区域这是最复杂的部分。我们可以用两个相对的梯形前角、后角加上一个连接它们的矩形灰质连合来构建。添加中央管在灰质连合中心画一个小圆或椭圆。标记沟和裂在前方和后方添加细长的三角形或楔形来表示前正中裂和后正中沟。添加标签和图例使用文本标注各个结构使图像具有教育意义。我们将通过调整坐标点和形状参数来控制所有结构的精确位置和形态。4. 完整实战生成脊髓横断面示意图接下来我们一步步实现代码。我们将创建一个高度可配置的函数允许调整脊髓的大小、颜色和各个部分的尺寸。4.1 创建主脚本并导入库首先创建generate_spinal_cord.py文件并导入必要的库。# generate_spinal_cord.py import numpy as np import matplotlib.pyplot as plt import matplotlib.patches as mpatches from matplotlib.path import Path # 设置中文字体可选如需显示中文标签 # plt.rcParams[font.sans-serif] [SimHei, Arial Unicode MS, DejaVu Sans] # plt.rcParams[axes.unicode_minus] False def draw_spinal_cord_section(ax, scale1.0): 在提供的matplotlib轴对象上绘制脊髓横断面图。 参数: ax (matplotlib.axes.Axes): 绘图轴对象。 scale (float): 整体缩放因子默认1.0。 # 基础尺寸可根据scale调整 cord_width 12 * scale # 脊髓整体宽度 (mm) cord_height 18 * scale # 脊髓整体高度 (mm) # 1. 绘制白质轮廓 - 使用椭圆近似 white_matter mpatches.Ellipse((0, 0), widthcord_width, heightcord_height, edgecolordarkgray, facecolorwhitesmoke, linewidth2, zorder1) ax.add_patch(white_matter) # 2. 绘制灰质 - “H”形或蝴蝶形 # 定义灰质关键点坐标相对位置 gray_width 6 * scale gray_height 10 * scale anterior_horn_width 2.5 * scale posterior_horn_width 2.0 * scale horn_length 3.5 * scale # 灰质连合中央部分 gray_commissure mpatches.Rectangle((-gray_width/2, -0.5*scale), gray_width, 1*scale, edgecolordarkslategray, facecolorlightgray, linewidth1.5, zorder2) ax.add_patch(gray_commissure) # 前角左侧和右侧 # 使用多边形模拟前角形状 # 左前角 left_anterior_horn mpatches.Polygon([ (-gray_width/2, 0.5*scale), (-gray_width/2 - anterior_horn_width, horn_length), (-gray_width/2, horn_length), (-gray_width/2, 0.5*scale) ], closedTrue, edgecolordarkslategray, facecolorlightgray, linewidth1.5, zorder2) ax.add_patch(left_anterior_horn) # 右前角镜像 right_anterior_horn mpatches.Polygon([ (gray_width/2, 0.5*scale), (gray_width/2 anterior_horn_width, horn_length), (gray_width/2, horn_length), (gray_width/2, 0.5*scale) ], closedTrue, edgecolordarkslategray, facecolorlightgray, linewidth1.5, zorder2) ax.add_patch(right_anterior_horn) # 后角左侧和右侧 # 左后角 left_posterior_horn mpatches.Polygon([ (-gray_width/2, -0.5*scale), (-gray_width/2 - posterior_horn_width, -horn_length), (-gray_width/2, -horn_length), (-gray_width/2, -0.5*scale) ], closedTrue, edgecolordarkslategray, facecolorlightgray, linewidth1.5, zorder2) ax.add_patch(left_posterior_horn) # 右后角镜像 right_posterior_horn mpatches.Polygon([ (gray_width/2, -0.5*scale), (gray_width/2 posterior_horn_width, -horn_length), (gray_width/2, -horn_length), (gray_width/2, -0.5*scale) ], closedTrue, edgecolordarkslategray, facecolorlightgray, linewidth1.5, zorder2) ax.add_patch(right_posterior_horn) # 3. 绘制中央管 central_canal mpatches.Circle((0, 0), radius0.3*scale, edgecolorblack, facecolorwhite, linewidth1, zorder3) ax.add_patch(central_canal) # 4. 绘制前正中裂和后正中沟 # 前正中裂 - 一个向内的V形 anterior_median_fissure mpatches.Wedge((0, cord_height/2 - 0.5*scale), 1.5*scale, 240, 300, width0.5*scale, edgecolordarkgray, facecolordarkgray, zorder2) ax.add_patch(anterior_median_fissure) # 后正中沟 - 一个浅的凹陷用短线表示 ax.plot([-0.3*scale, 0.3*scale], [-cord_height/2 0.2*scale, -cord_height/2 0.2*scale], colordarkgray, linewidth3, zorder2) # 5. 添加标签 labels { White Matter: (0, cord_height/2.5, darkgray), Gray Matter: (0, 0, darkslategray), Anterior Horn\n(Motor): (gray_width/2 anterior_horn_width 1*scale, horn_length/2, black), Posterior Horn\n(Sensory): (gray_width/2 posterior_horn_width 1*scale, -horn_length/2, black), Central Canal: (0, 1.2*scale, black), Anterior\nMedian Fissure: (0, cord_height/2 - 2*scale, darkgray), Posterior\nMedian Sulcus: (0, -cord_height/2 1.5*scale, darkgray), } for text, (x, y, color) in labels.items(): ax.text(x, y, text, hacenter, vacenter, fontsize8*scale, colorcolor, bboxdict(boxstyleround,pad0.3, facecolorwheat, alpha0.7, edgecolornone)) # 设置坐标轴 margin 2 * scale ax.set_xlim(-cord_width/2 - margin, cord_width/2 margin) ax.set_ylim(-cord_height/2 - margin, cord_height/2 margin) ax.set_aspect(equal) ax.axis(off) # 关闭坐标轴 def main(): 主函数创建图形并保存。 fig, ax plt.subplots(figsize(8, 10), dpi150) # 创建图形和轴 draw_spinal_cord_section(ax, scale1.0) # 绘制scale1.0为默认大小 plt.title(Human Spinal Cord Cross-Section (Cervical Enlargement), fontsize14, pad20) plt.tight_layout() # 保存图片 output_path ./spinal_cord_cross_section.png plt.savefig(output_path, bbox_inchestight) print(f图像已保存至: {output_path}) # 显示图片 plt.show() if __name__ __main__: main()4.2 代码分步解释导入与函数定义导入了必要的库。draw_spinal_cord_section是核心函数它接收一个matplotlib的坐标轴对象ax和一个scale参数所有绘图操作都在这个轴上进行。绘制白质使用mpatches.Ellipse创建一个椭圆代表脊髓外缘的白质。zorder1确保它位于最底层。绘制灰质这是最复杂的部分。我们将其拆解灰质连合用Rectangle绘制中间的横向连接部分。前角与后角分别用四个Polygon多边形来模拟左右、前后的角。通过精心设计多边形的顶点坐标可以近似出解剖学形状。颜色设置为浅灰色以区别于白质。绘制中央管在灰质连合中心画一个小圆 (Circle)。绘制沟裂前正中裂用Wedge楔形模拟一个向内的凹陷。后正中沟用一条粗短线 (plot) 表示表面的浅沟。添加标签使用text函数在各个结构旁添加说明文本并添加一个半透明的背景框 (bbox) 以提高可读性。图形设置设置坐标轴范围保持纵横比相等并关闭坐标轴显示让图像更干净。主函数创建图形窗口调用绘图函数设置标题并保存为 PNG 图片。4.3 运行与结果在终端或IDE中运行该脚本cd /path/to/your/spinal_cord_section python generate_spinal_cord.py运行成功后程序会弹出一个显示窗口并同时在脚本同级目录下生成一张名为spinal_cord_cross_section.png的高清图片150 DPI。预期输出图像特征一个椭圆形的外轮廓白质。内部一个灰色的“H”形区域灰质前后角突出。“H”形中心有一个白色小圆中央管。上下两端分别有代表前正中裂和后正中沟的标记。各个部分都有清晰的文字标签。5. 常见问题与参数调整在实际运行或修改代码时你可能会遇到以下问题问题现象可能原因解决方案导入 matplotlib 失败未安装matplotlib库。运行pip install matplotlib。图形显示为空白或错乱坐标轴范围设置不当图形画在了视野外。检查set_xlim和set_ylim的参数确保能覆盖所有图形元素。使用ax.autoscale_view()或适当增加margin。“H”形灰质形状不美观Polygon的顶点坐标设计不合理。根据解剖学图谱调整horn_length,anterior_horn_width等参数或手动修改Polygon的顶点列表。可以尝试用贝塞尔曲线 (Path和PathPatch) 获得更平滑的角。标签重叠或位置不佳标签坐标(x, y)设置不合适。微调labels字典中各个标签的坐标值。可以使用相对坐标如cord_height/2.5而非绝对数值使其能随scale自适应。保存的图片分辨率低plt.savefig()的dpi参数设置过低。在plt.subplots()中设置更高的dpi如300或在savefig中指定dpi300。想绘制不同节段如胸段颈膨大处的灰质形状较肥大胸段较细长。修改gray_width,gray_height,horn_length等比例参数。对于胸段可以减小前角和后角的宽度和长度。如何调整图形所有结构的尺寸、颜色、位置都由函数开头的参数和mpatches对象的参数控制。例如修改cord_width和cord_height改变整体大小。修改facecolor和edgecolor改变填充色和边框色。直接调整Polygon的顶点列表来改变灰质角的形状。修改scale变量可以等比例放大缩小整个图形。6. 进阶应用与最佳实践生成基础的示意图只是第一步。在实际项目中我们可以在此基础上进行扩展1. 创建参数化函数库将不同脊髓节段颈、胸、腰、骶的绘制封装成不同的函数通过一个参数进行切换。def draw_spinal_cord_section(ax, levelcervical, scale1.0): 绘制指定节段的脊髓横断面。 参数: level (str): 节段可选 cervical, thoracic, lumbar, sacral。 # 根据 level 设置不同的几何参数 if level cervical: gray_ratio 0.55 # 灰质相对较大 horn_shape wide # 角较宽 elif level thoracic: gray_ratio 0.35 # 灰质相对较小 horn_shape narrow # ... 后续绘制逻辑根据参数变化2. 集成到数据分析流程将生成的示意图作为背景在其上叠加真实的实验数据点或统计图用于结果展示。# 假设有来自某个切片的神经元位置数据 neuron_positions np.random.randn(100, 2) * 2 # 模拟数据 fig, ax plt.subplots(figsize(8, 10)) draw_spinal_cord_section(ax, scale1.0) # 先画解剖背景 ax.scatter(neuron_positions[:, 0], neuron_positions[:, 1], cred, s10, alpha0.6, labelNeurons) ax.legend() plt.title(Neuron Distribution Overlay) plt.show()3. 生成矢量图用于出版将结果保存为 SVG 或 PDF 格式获得无损的矢量图形方便插入论文或演示稿。plt.savefig(spinal_cord_vector.svg, formatsvg, bbox_inchestight) plt.savefig(spinal_cord_vector.pdf, formatpdf, bbox_inchestight)4. 自动化批量生成如果需要为一系列不同参数或条件生成图片可以用循环调用绘图函数。for i, scale_factor in enumerate([0.8, 1.0, 1.2]): fig, ax plt.subplots(figsize(6, 7.5)) draw_spinal_cord_section(ax, scalescale_factor) plt.title(fScale Factor: {scale_factor}) plt.savefig(foutput/spinal_cord_scale_{i}.png, dpi150) plt.close(fig) # 关闭图形避免内存累积最佳实践建议版本控制将脚本和参数配置文件纳入 Git 管理便于追踪修改和协作。函数化与模块化如示例所示将绘图逻辑封装在函数中主程序保持简洁。可以考虑将不同结构的绘制进一步拆分为独立函数。配置与代码分离对于复杂的参数如各节段的尺寸数据库可以考虑使用 JSON 或 YAML 文件来管理使代码更清晰。注释与文档在关键参数和几何计算处添加详细注释说明其解剖学对应关系方便他人理解和后续维护。测试与验证将生成的图像与标准解剖学图谱进行对比确保关键比例和位置关系正确。可以请领域专家进行评审。通过本文的流程你不仅获得了一张静态的脊髓横断面图更掌握了一种用计算思维解决生物医学可视化问题的方法。这种方法可复现、可修改、可集成远比手动绘图或寻找“完美”的现有图片更加灵活和强大。你可以将此框架应用于其他解剖结构示意图的生成如大脑切片、器官剖面等只需重新定义其几何模型即可。

相关新闻

如何快速掌握Nintendo Switch Homebrew菜单:面向新手的完整指南

如何快速掌握Nintendo Switch Homebrew菜单:面向新手的完整指南

如何快速掌握Nintendo Switch Homebrew菜单:面向新手的完整指南 【免费下载链接】nx-hbmenu The Nintendo Switch Homebrew Menu 项目地址: https://gitcode.com/gh_mirrors/nx/nx-hbmenu nx-hbmenu是Nintendo Switch平台上功能强大的Homebrew菜单软件&#…

2026/10/16 6:44:10 阅读更多 →
新手单簧管选购先看气密性和回弹,3款高口碑都单簧管推荐

新手单簧管选购先看气密性和回弹,3款高口碑都单簧管推荐

经常有人在挑第一支单簧管时,开口就问“哪支声音更亮”“哪支更像老师吹的那种味道”。这个问题并不算错,但放在零基础阶段,优先级其实没有大家想得那么高。因为对新手来说,最先决定练习体验的,不是音色形容词&#xf…

2026/10/19 13:45:28 阅读更多 →
3个理由选择aShell You:重新定义Android设备管理体验

3个理由选择aShell You:重新定义Android设备管理体验

3个理由选择aShell You:重新定义Android设备管理体验 【免费下载链接】ashell A material you designed app for your ADB needs 项目地址: https://gitcode.com/gh_mirrors/as/ashell 你是否厌倦了在电脑和手机之间来回切换,只为执行一个简单的A…

2026/10/20 8:50:26 阅读更多 →

最新新闻

STM32F103驱动2.13寸微雪墨水屏实战:SPI时序、局部刷新与VCOM校准

STM32F103驱动2.13寸微雪墨水屏实战:SPI时序、局部刷新与VCOM校准

简介:本资源是一套专为2.13英寸微雪墨水屏适配STM32F103C8T6(ARM Cortex-M3内核)开发的完整驱动工程,面向嵌入式初学者与STM32进阶开发者,解决电子纸在低成本主控平台上的显示驱动移植难题,适用于低功耗物联…

2026/10/20 12:30:18 阅读更多 →
AgentScope多智能体框架实战:消息驱动与分布式协作指南

AgentScope多智能体框架实战:消息驱动与分布式协作指南

1. 从一堆零散脚本到一套完整系统:AgentScope 到底解决了什么问题如果你最近在折腾大模型应用,大概率会遇到一个很现实的困境:单个模型调用已经玩得很熟了,但一旦想让多个模型协作完成一件复杂的事,代码就开始失控。比…

2026/10/20 12:30:18 阅读更多 →
AI Agent编排系统设计核心原理与工程实践

AI Agent编排系统设计核心原理与工程实践

我无法根据当前输入内容生成符合要求的博文。原因如下:输入中缺少项目正文、关键词和摘要描述三项必要字段,仅提供了项目标题与空的“相关热搜词”“最新网络热词”及空白的搜索内容块();标题本身为高度前瞻性的行业观…

2026/10/20 12:30:18 阅读更多 →
STM32F103驱动DHT22与BH1750三合一环境采集实战

STM32F103驱动DHT22与BH1750三合一环境采集实战

简介:本资源是一套基于STM32F103单片机的多传感器环境监测完整工程,面向嵌入式初学者与课程设计实践者,解决温湿度及光照强度数据采集、解析与可视化显示的核心问题。项目涵盖DHT22(单总线协议)与BH1750(IC…

2026/10/20 12:30:18 阅读更多 →
Agent工具链三大进化层:协议、编排与可控性工程实践

Agent工具链三大进化层:协议、编排与可控性工程实践

1. 热榜不是流量榜单,而是技术演进的实时仪表盘很多人刷 GitHub 热榜,习惯性点开 Top 10 项目,扫一眼 star 数、语言标签、README 第一行,再顺手点个 star —— 这动作熟得像每天打开微信。但真正把热榜当“技术雷达”用的人极少。…

2026/10/20 12:30:18 阅读更多 →
野营用品租赁管理系统:基于SSM的库存与订单实战解析

野营用品租赁管理系统:基于SSM的库存与订单实战解析

野营用品租赁管理系统这个标题,我第一次看到时还觉得挺常规的,真动手做起来才发现它比想象中要麻烦不少。市面上做销售型电商系统的教程一抓一大把,但租赁类业务的核心逻辑完全不同:一个商品不是卖出去就结束了,而是要…

2026/10/20 12:29:17 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →