小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

用Python畫(huà)5G信令流程圖

 bin仔學(xué)習(xí)園地 2024-12-13

不說(shuō)廢話(huà),直接上代碼和注解。

注:左右滑動(dòng)可以看完整代碼。

import matplotlib.pyplot as pltimport numpy as np
def create_5g_signaling_flow():# 創(chuàng)建圖形和坐標(biāo)軸 fig, ax = plt.subplots(figsize=(12, 8))
# 設(shè)置網(wǎng)絡(luò)實(shí)體的位置 entities = ['UE', 'gNB', 'AMF', 'SMF', 'UDM'] x_positions = np.linspace(1, 9, len(entities)) entity_positions = dict(zip(entities, x_positions))
# 繪制垂直生命線(xiàn) y_top = 10 y_bottom = 0for entity, x in entity_positions.items():# 繪制實(shí)體框和標(biāo)簽 ax.add_patch(plt.Rectangle((x-0.5, y_top), 1, 0.8, facecolor='lightblue', edgecolor='black'))# 在框內(nèi)居中顯示網(wǎng)元名稱(chēng) ax.text(x, y_top 0.4, entity, ha='center', va='center')# 繪制生命線(xiàn) ax.plot([x, x], [y_top, y_bottom], 'k--', alpha=0.3)
# 繪制信令消息def draw_arrow(start_entity, end_entity, y_pos, label, step_num, style='-'): start_x = entity_positions[start_entity] end_x = entity_positions[end_entity] arrow_style = '->' if style == '-' else '->' line_style = style
ax.annotate('', xy=(end_x, y_pos), xytext=(start_x, y_pos), arrowprops=dict(arrowstyle=arrow_style, linestyle=line_style))
# 添加帶編號(hào)的標(biāo)簽 mid_x = (start_x end_x) / 2 ax.text(mid_x, y_pos 0.1, f'{step_num}. {label}', ha='center', va='bottom')
# 繪制必選流程(實(shí)線(xiàn)) step = 1 y = 9 draw_arrow('UE', 'gNB', y, 'RRC Setup Request', step) step = 1; y -= 0.8 draw_arrow('gNB', 'UE', y, 'RRC Setup', step) step = 1; y -= 0.8 draw_arrow('UE', 'AMF', y, 'Registration Request', step) step = 1; y -= 0.8 draw_arrow('AMF', 'UDM', y, 'Authentication Data Request', step) step = 1; y -= 0.8 draw_arrow('UDM', 'AMF', y, 'Authentication Data Response', step) step = 1; y -= 0.8 draw_arrow('AMF', 'UE', y, 'Authentication Request', step) step = 1; y -= 0.8 draw_arrow('UE', 'AMF', y, 'Authentication Response', step)
# 繪制可選流程(虛線(xiàn)) step = 1; y -= 0.8 draw_arrow('AMF', 'SMF', y, 'Session Establishment Request', step, '--') step = 1; y -= 0.8 draw_arrow('SMF', 'AMF', y, 'Session Establishment Accept', step, '--') step = 1; y -= 0.8 draw_arrow('AMF', 'UE', y, 'Registration Accept', step) step = 1; y -= 0.8 draw_arrow('UE', 'AMF', y, 'Registration Complete', step)
# 設(shè)置圖形屬性 ax.set_xlim(0, 10) ax.set_ylim(y_bottom - 1, y_top 2) ax.axis('off') plt.title('5G Signaling Flow')
# 保存圖片 plt.savefig('5g_signaling_flow.png', bbox_inches='tight', dpi=300) plt.close()
if __name__ == '__main__': create_5g_signaling_flow()

注解:

【這將幫助您理解,如何復(fù)用這個(gè)代碼,

舉一反三,稍微改吧改吧,畫(huà)別的流程圖。】

使用 Matplotlib 繪制序列圖(信令流程圖)詳細(xì)指南

=========================================

1. 坐標(biāo)系統(tǒng)設(shè)計(jì)

--------------

matplotlib使用笛卡爾坐標(biāo)系,在我們的序列圖中:

- y軸:表示垂直位置(數(shù)值越大越靠上)

- x軸:表示水平位置(數(shù)值越大越靠右)

垂直布局示意圖:

```

y=12    [標(biāo)題空間]

圖片

```

關(guān)鍵垂直位置參數(shù):

1. y_top = 10:實(shí)體框位置

   - 設(shè)置為10是為了在頂部留出足夠空間顯示標(biāo)題

   - 實(shí)體框高度為0.8單位

2. y = 9:第一個(gè)消息的起始位置

   - 比y_top小1個(gè)單位,在實(shí)體框下方

   - 這個(gè)間距確保消息文本不會(huì)和實(shí)體框重疊

3. y -= 0.8:消息間距

   - 每個(gè)新消息向下移動(dòng)0.8個(gè)單位

   - 此值是經(jīng)驗(yàn)值,在可讀性和緊湊性之間取得平衡

   - 可以根據(jù)消息文本長(zhǎng)度調(diào)整(建議范圍:0.6-1.0)

4. y_bottom = 0:生命線(xiàn)底部位置

2. 水平布局設(shè)計(jì)

--------------

```

圖片

 |  

```

水平布局參數(shù):

1. x_positions = np.linspace(1, 9, len(entities))

   - 1:最左側(cè)實(shí)體的位置(留出左側(cè)空間)

   - 9:最右側(cè)實(shí)體的位置(留出右側(cè)空間)

   - len(entities):平均分配空間

2. 實(shí)體框?qū)挾葹?個(gè)單位:

   ```python

   ax.add_patch(plt.Rectangle((x-0.5, y_top), 1, 0.8, ...))

   ```

   - (x-0.5):向左偏移半個(gè)單位,使實(shí)體名稱(chēng)居中

   - 寬度1:標(biāo)準(zhǔn)化的實(shí)體框?qū)挾?/span>

3. 代碼復(fù)用最佳實(shí)踐

------------------

1. 使用常量定義關(guān)鍵參數(shù):

```python

# 圖形布局常量

ENTITY_BOX_WIDTH = 1.0

ENTITY_BOX_HEIGHT = 0.8

ENTITY_SPACING = 8  # 最右側(cè)實(shí)體x坐標(biāo)減去最左側(cè)實(shí)體x坐標(biāo)

Y_TOP = 10

Y_BOTTOM = 0

MESSAGE_START_Y = Y_TOP - 1  # 第一個(gè)消息的y坐標(biāo)

MESSAGE_SPACING = 0.8  # 消息之間的垂直間距

# 樣式常量

ENTITY_COLOR = 'lightblue'

LIFELINE_STYLE = 'k--'

LIFELINE_ALPHA = 0.3

```

2. 創(chuàng)建配置類(lèi):

```python

class SequenceDiagramConfig:

    def __init__(self):

        self.figsize = (12, 8)

        self.entity_box_width = 1.0

        self.entity_box_height = 0.8

        self.message_spacing = 0.8

        self.y_top = 10

        self.y_bottom = 0

    @property

    def message_start_y(self):

        return self.y_top - 1

```

3. 創(chuàng)建可重用的繪圖類(lèi):

```python

class SequenceDiagramDrawer:

    def __init__(self, config):

        self.config = config

        self.fig, self.ax = plt.subplots(figsize=config.figsize)

    def draw_entity(self, name, x):

        # 繪制實(shí)體框和生命線(xiàn)

    def draw_message(self, from_entity, to_entity, y, label, step, style='-'):

        # 繪制消息箭頭和標(biāo)簽

```

4. 調(diào)試與優(yōu)化建議

----------------

1. 調(diào)試布局問(wèn)題:

```python

# 添加網(wǎng)格輔助調(diào)試

ax.grid(True)

ax.set_xticks(np.arange(0, 11, 1))

ax.set_yticks(np.arange(0, 11, 1))

```

2. 文本重疊解決方案:

- 增加消息間距:

```python

MESSAGE_SPACING = 1.0  # 增加到1.0或更大

```

- 使用換行符分割長(zhǎng)文本:

```python

label = '長(zhǎng)文本消息\n第二行'

```

3. 實(shí)體過(guò)多時(shí)的處理:

- 增加圖形寬度:

```python

figsize=(16, 8)  # 增加寬度

ENTITY_SPACING = 12  # 增加實(shí)體間距

```

5. 常見(jiàn)自定義需求

---------------

1. 添加消息返回箭頭:

```python

def draw_return_arrow(self, y_pos, label):

    # 繪制虛線(xiàn)返回箭頭

    style = '-->'

    # 實(shí)現(xiàn)代碼...

```

2. 添加激活條:

```python

def draw_activation_bar(self, entity, start_y, end_y):

    # 繪制表示處理時(shí)間的激活條

    x = self.entity_positions[entity]

    width = 0.2

    # 實(shí)現(xiàn)代碼...

```

3. 添加注釋框:

```python

def add_note(self, x, y, text):

    # 添加注釋框

    # 實(shí)現(xiàn)代碼...

```

6. 圖片輸出建議

-------------

1. 保存為矢量格式:

```python

plt.savefig('diagram.svg', format='svg', bbox_inches='tight')

```

2. 高分辨率輸出:

```python

plt.savefig('diagram.png', dpi=300, bbox_inches='tight')

```

3. 透明背景:

```python

plt.savefig('diagram.png', transparent=True)

```

結(jié)束語(yǔ)

-----

這個(gè)設(shè)計(jì)方案的優(yōu)點(diǎn)是:

1. 參數(shù)集中管理,易于調(diào)整

2. 布局邏輯清晰,便于理解

3. 代碼模塊化,易于擴(kuò)展

4. 提供了良好的默認(rèn)值,同時(shí)保持靈活性

建議在實(shí)際使用時(shí):

1. 先用默認(rèn)參數(shù)快速實(shí)現(xiàn)

2. 根據(jù)實(shí)際需求微調(diào)參數(shù)

3. 需要重復(fù)使用時(shí),考慮封裝成類(lèi)

上述代碼執(zhí)行效果圖:

圖片

【這個(gè)圖的準(zhǔn)確性先不管它哈,今天重點(diǎn)是看怎么畫(huà)圖?!?/strong>

謝謝關(guān)注。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀(guān)點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多