Generate branchial plexus infographic

Checking Date & Time
Reading File
Now let me search the medical library for brachial plexus content and images simultaneously.
Finding Sources
Searching Images

brachial plexus anatomy diagram roots trunks divisions cords branches

Now let me read the Gray's Anatomy and Harrison's content for the detailed brachial plexus information.
Reading File
Reading File
Loading Image
I now have rich content. Let me read more of the Gray's Anatomy text to get complete branch/nerve information, then generate the infographic.
Reading File
I now have comprehensive data. Let me generate the infographic using Python with matplotlib.
Running Command

mkdir -p /home/daytona/workspace/brachial-plexus && ls /home/daytona/workspace/brachial-plexus/

Writing File

~/brachial-plexus/generate_infographic.py

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from matplotlib.patches import FancyBboxPatch, FancyArrowPatch
import matplotlib.patheffects as pe
import numpy as np

# ── Canvas ──────────────────────────────────────────────────────────────────
fig = plt.figure(figsize=(22, 28), facecolor='#0d1b2a')
fig.subplots_adjust(left=0, right=1, top=1, bottom=0)

ax = fig.add_axes([0, 0, 1, 1])
ax.set_xlim(0, 22)
ax.set_ylim(0, 28)
ax.axis('off')
ax.set_facecolor('#0d1b2a')

# ── Color palette ────────────────────────────────────────────────────────────
C_TITLE   = '#e8f4fd'
C_HEADER  = '#1a3a5c'
C_BORDER  = '#2e6da4'

# Roots
ROOT_COL   = '#4a90d9'
TRUNK_COL  = '#5ba85c'   # green
DIV_ANT    = '#e07b54'   # orange
DIV_POST   = '#9b59b6'   # purple
CORD_LAT   = '#e07b54'
CORD_POST  = '#9b59b6'
CORD_MED   = '#e74c3c'
NERVE_COL  = '#f0c040'

BG_SECTION = '#0f2235'
BG_CARD    = '#112840'
ACCENT     = '#2e86de'

# ── Helper functions ─────────────────────────────────────────────────────────
def rounded_box(ax, x, y, w, h, color, alpha=1.0, zorder=3, lw=1.5, ec=None):
    ec = ec or color
    box = FancyBboxPatch((x, y), w, h,
                         boxstyle="round,pad=0.06",
                         facecolor=color, edgecolor=ec,
                         linewidth=lw, alpha=alpha, zorder=zorder)
    ax.add_patch(box)
    return box

def label(ax, x, y, text, fs=9, color='white', ha='center', va='center',
          bold=False, zorder=5, wrap=False):
    weight = 'bold' if bold else 'normal'
    ax.text(x, y, text, fontsize=fs, color=color, ha=ha, va=va,
            fontweight=weight, zorder=zorder,
            fontfamily='DejaVu Sans')

def connector(ax, x1, y1, x2, y2, color='#4a90d9', lw=1.8, zorder=2,
              style='-', alpha=0.85):
    ax.plot([x1, x2], [y1, y2], color=color, lw=lw, zorder=zorder,
            linestyle=style, alpha=alpha,
            solid_capstyle='round')

def arrow(ax, x1, y1, x2, y2, color, lw=1.6, zorder=4):
    ax.annotate('', xy=(x2, y2), xytext=(x1, y1),
                arrowprops=dict(arrowstyle='->', color=color, lw=lw),
                zorder=zorder)

# ═══════════════════════════════════════════════════════════════════
# TITLE BLOCK
# ═══════════════════════════════════════════════════════════════════
rounded_box(ax, 0.3, 26.5, 21.4, 1.3, '#112840', ec='#2e86de', lw=2.5)
label(ax, 11, 27.3, 'BRACHIAL PLEXUS', fs=26, bold=True, color='#e8f4fd')
label(ax, 11, 26.85, 'Roots  •  Trunks  •  Divisions  •  Cords  •  Terminal Branches', 
      fs=11, color='#7fb3d3')

# Source credit
label(ax, 20.5, 26.6, 'Source: Gray\'s Anatomy for Students', fs=6.5,
      color='#4a7ea8', ha='right')

# ═══════════════════════════════════════════════════════════════════
# MAIN SCHEMATIC (upper 60%)
# ═══════════════════════════════════════════════════════════════════
# Layout columns (x centres)
X_ROOT   = 2.4
X_TRUNK  = 5.2
X_DIVS   = 7.8
X_CORD   = 10.5
X_NERVES = 14.5

# Y positions for the 5 roots (C5 top → T1 bottom)
root_ys   = [24.8, 23.6, 22.4, 21.2, 20.0]
root_lbls = ['C5', 'C6', 'C7', 'C8', 'T1']

# Draw root boxes
for ry, rl in zip(root_ys, root_lbls):
    rounded_box(ax, X_ROOT-0.55, ry-0.28, 1.1, 0.56, ROOT_COL, ec='#82bdee', lw=1.5)
    label(ax, X_ROOT, ry, rl, fs=11, bold=True, color='#0d1b2a')

# Column headers
for xc, txt, col in [
    (X_ROOT,   'ROOTS',    ROOT_COL),
    (X_TRUNK,  'TRUNKS',   TRUNK_COL),
    (X_DIVS,   'DIVISIONS', DIV_ANT),
    (X_CORD,   'CORDS',    CORD_LAT),
    (X_NERVES, 'TERMINAL\nBRANCHES', NERVE_COL),
]:
    label(ax, xc, 25.55, txt, fs=8.5, bold=True, color=col)

# ── TRUNKS ──────────────────────────────────────────────────────────
# Upper trunk (C5+C6 → y midpoint)
upper_y  = (root_ys[0] + root_ys[1]) / 2   # 24.2
middle_y = root_ys[2]                         # 22.4
lower_y  = (root_ys[3] + root_ys[4]) / 2   # 20.6

trunk_ys   = [upper_y, middle_y, lower_y]
trunk_lbls = ['Upper\n(C5,C6)', 'Middle\n(C7)', 'Lower\n(C8,T1)']
trunk_cols = [TRUNK_COL, TRUNK_COL, TRUNK_COL]

# Lines: roots → trunks
# Upper trunk: C5 & C6 → upper_y
connector(ax, X_ROOT+0.55, root_ys[0], X_TRUNK-0.65, upper_y, ROOT_COL, lw=2.0)
connector(ax, X_ROOT+0.55, root_ys[1], X_TRUNK-0.65, upper_y, ROOT_COL, lw=2.0)
# Middle trunk: C7 straight
connector(ax, X_ROOT+0.55, root_ys[2], X_TRUNK-0.65, middle_y, ROOT_COL, lw=2.0)
# Lower trunk: C8 & T1 → lower_y
connector(ax, X_ROOT+0.55, root_ys[3], X_TRUNK-0.65, lower_y, ROOT_COL, lw=2.0)
connector(ax, X_ROOT+0.55, root_ys[4], X_TRUNK-0.65, lower_y, ROOT_COL, lw=2.0)

for ty, tl in zip(trunk_ys, trunk_lbls):
    rounded_box(ax, X_TRUNK-0.65, ty-0.38, 1.3, 0.76, TRUNK_COL, ec='#8fcf8f', lw=1.5)
    label(ax, X_TRUNK, ty, tl, fs=8, bold=True, color='#0d1b2a')

# ── DIVISIONS ────────────────────────────────────────────────────────
# Each trunk → Anterior + Posterior division
div_data = [
    # (trunk_y, ant_y, post_y)
    (upper_y,  24.4, 24.0),
    (middle_y, 22.6, 22.2),
    (lower_y,  21.0, 20.6),
]

for (ty, ay, py) in div_data:
    # trunk → ant
    connector(ax, X_TRUNK+0.65, ty, X_DIVS-0.5, ay, TRUNK_COL, lw=1.6)
    # trunk → post
    connector(ax, X_TRUNK+0.65, ty, X_DIVS-0.5, py, TRUNK_COL, lw=1.6)

    # Ant division box
    rounded_box(ax, X_DIVS-0.5, ay-0.19, 1.0, 0.38, DIV_ANT, ec='#f0a070', lw=1.2)
    label(ax, X_DIVS, ay, 'Ant', fs=7.5, bold=True, color='#0d1b2a')

    # Post division box
    rounded_box(ax, X_DIVS-0.5, py-0.19, 1.0, 0.38, DIV_POST, ec='#c77dcc', lw=1.2)
    label(ax, X_DIVS, py, 'Post', fs=7.5, bold=True, color='white')

# ── CORDS ──────────────────────────────────────────────────────────
# Lateral cord = ant(upper) + ant(middle) → y ~23.5
# Posterior cord = post(upper)+post(middle)+post(lower) → y ~22.2
# Medial cord = ant(lower) → y ~21.0
lat_y  = (div_data[0][1] + div_data[1][1]) / 2   # 23.5
post_y = (div_data[0][2] + div_data[1][2] + div_data[2][2]) / 3  # ~22.27
med_y  = div_data[2][1]                           # 21.0

# Lines: divisions → cords
# Lateral
connector(ax, X_DIVS+0.5, div_data[0][1], X_CORD-0.65, lat_y,  DIV_ANT,  lw=1.8)
connector(ax, X_DIVS+0.5, div_data[1][1], X_CORD-0.65, lat_y,  DIV_ANT,  lw=1.8)
# Posterior
connector(ax, X_DIVS+0.5, div_data[0][2], X_CORD-0.65, post_y, DIV_POST, lw=1.8)
connector(ax, X_DIVS+0.5, div_data[1][2], X_CORD-0.65, post_y, DIV_POST, lw=1.8)
connector(ax, X_DIVS+0.5, div_data[2][2], X_CORD-0.65, post_y, DIV_POST, lw=1.8)
# Medial
connector(ax, X_DIVS+0.5, div_data[2][1], X_CORD-0.65, med_y,  DIV_ANT,  lw=1.8)

cord_data = [
    (lat_y,  CORD_LAT,  '#f0a070', 'Lateral\nCord\n(C5–C7)'),
    (post_y, CORD_POST, '#c77dcc', 'Posterior\nCord\n(C5–T1)'),
    (med_y,  CORD_MED,  '#f08080', 'Medial\nCord\n(C8,T1)'),
]
for (cy, cc, ec_, cl) in cord_data:
    rounded_box(ax, X_CORD-0.65, cy-0.44, 1.3, 0.88, cc, ec=ec_, lw=1.5)
    label(ax, X_CORD, cy, cl, fs=7.5, bold=True, color='white')

# ── TERMINAL BRANCHES ──────────────────────────────────────────────
# From Lateral cord
lat_nerves = [
    (24.3, 'Lateral Pectoral N.', '(C5–C7)', CORD_LAT),
    (23.7, 'Musculocutaneous N.', '(C5–C7)', CORD_LAT),
    (23.1, 'Lateral root\nof Median N.', '(C5–C7)', CORD_LAT),
]
# From Posterior cord
post_nerves = [
    (22.7, 'Upper Subscapular N.', '(C5,C6)', CORD_POST),
    (22.3, 'Thoracodorsal N.', '(C6–C8)', CORD_POST),
    (21.9, 'Lower Subscapular N.', '(C5,C6)', CORD_POST),
    (21.5, 'Axillary N.', '(C5,C6)', CORD_POST),
    (21.1, 'Radial N.', '(C5–T1)', CORD_POST),
]
# From Medial cord
med_nerves = [
    (20.6, 'Medial Pectoral N.', '(C8,T1)', CORD_MED),
    (20.1, 'Medial Brachial\nCutaneous N.', '(T1)', CORD_MED),
    (19.5, 'Medial Antebrachial\nCutaneous N.', '(C8,T1)', CORD_MED),
    (18.9, 'Medial root\nof Median N.', '(C8,T1)', CORD_MED),
    (18.3, 'Ulnar N.', '(C7–T1)', CORD_MED),
]

def draw_nerve(ax, cord_y, nerve_y, nerve_name, roots_text, cord_col):
    connector(ax, X_CORD+0.65, cord_y, X_NERVES-2.2, nerve_y, cord_col, lw=1.4)
    rounded_box(ax, X_NERVES-2.2, nerve_y-0.22, 4.0, 0.44, '#112840', ec=cord_col, lw=1.2)
    label(ax, X_NERVES-0.15, nerve_y+0.07, nerve_name, fs=7.8, color='#e8f0ff',
          ha='center', bold=True)
    label(ax, X_NERVES-0.15, nerve_y-0.1, roots_text, fs=6.8, color='#7fb3d3',
          ha='center')

for (ny, nn, nr, nc) in lat_nerves:
    draw_nerve(ax, lat_y, ny, nn, nr, nc)
for (ny, nn, nr, nc) in post_nerves:
    draw_nerve(ax, post_y, ny, nn, nr, nc)
for (ny, nn, nr, nc) in med_nerves:
    draw_nerve(ax, med_y, ny, nn, nr, nc)

# ── ROOT BRANCHES (pre-trunk) ──────────────────────────────────────
root_branch_data = [
    (root_ys[0], 25.3, 'Dorsal Scapular N.', '(C5) → rhomboids', ROOT_COL),
    (root_ys[0], 24.8+0.55, 'Long Thoracic N.', '(C5–C7) → serratus ant.', ROOT_COL),
]
for (ry, by, bn, br, bc) in root_branch_data:
    # branch up/sideways from root
    connector(ax, X_ROOT, ry+0.28, X_ROOT, by, bc, lw=1.2, style='--')
    rounded_box(ax, 0.2, by, 2.0, 0.4, '#0f2235', ec=bc, lw=1.0)
    label(ax, 1.2, by+0.28, bn, fs=6.8, color='#e8f0ff', bold=True)
    label(ax, 1.2, by+0.08, br, fs=6, color='#7fb3d3')

# Trunk branches (suprascapular, subclavius)
connector(ax, X_TRUNK, upper_y+0.38, X_TRUNK, upper_y+0.85, TRUNK_COL, lw=1.2, style='--')
rounded_box(ax, X_TRUNK-1.1, upper_y+0.85, 2.2, 0.55, '#0f2235', ec=TRUNK_COL, lw=1.0)
label(ax, X_TRUNK, upper_y+1.12, 'Suprascapular N.', fs=7, color='#e8f0ff', bold=True)
label(ax, X_TRUNK, upper_y+0.94, '(C5,C6) → supra/infraspinatus', fs=6, color='#7fb3d3')

connector(ax, X_TRUNK, upper_y-0.38, X_TRUNK, upper_y-0.75, TRUNK_COL, lw=1.2, style='--')
rounded_box(ax, X_TRUNK-0.9, upper_y-1.05, 1.8, 0.3, '#0f2235', ec=TRUNK_COL, lw=1.0)
label(ax, X_TRUNK, upper_y-0.9, 'N. to Subclavius (C5,C6)', fs=6.5, color='#e8f0ff')

# ── SEPARATOR LINE ────────────────────────────────────────────────
ax.axhline(y=17.8, xmin=0.01, xmax=0.99, color='#1e4060', lw=1.5, linestyle='--')

# ═══════════════════════════════════════════════════════════════════
# LOWER PANELS  – Key Nerves Detail + Injuries
# ═══════════════════════════════════════════════════════════════════
panel_top = 17.5
label(ax, 11, 17.65, '▸  KEY TERMINAL NERVES & CLINICAL NOTES', fs=9.5,
      bold=True, color='#7fb3d3')

# ── 5-column nerve cards ──────────────────────────────────────────
nerve_cards = [
    {
        'name': 'Musculocutaneous\nNerve',
        'roots': 'C5, C6, C7',
        'cord': 'Lateral Cord',
        'motor': 'Biceps brachii,\nBrachialis,\nCoracobrachialis',
        'sensory': 'Lat. forearm\n(via lat. cutaneous\nn. of forearm)',
        'test': 'Elbow flexion\n(arm supinated)',
        'col': CORD_LAT,
    },
    {
        'name': 'Radial Nerve',
        'roots': 'C5–C8, T1',
        'cord': 'Posterior Cord',
        'motor': 'Triceps, Brachioradialis,\nWrist & finger\nextensors',
        'sensory': 'Post. arm & forearm;\ndorsal hand (lat.)',
        'test': 'Wrist extension;\nFinger extension',
        'col': CORD_POST,
    },
    {
        'name': 'Median Nerve',
        'roots': 'C6–C8, T1',
        'cord': 'Both Lat. & Med.',
        'motor': 'Flexors forearm (most);\nThenar muscles;\nLumbricals 1 & 2',
        'sensory': 'Lat. palm; thumb,\nindex, middle,\nhalf ring finger',
        'test': 'Thumb opposition;\n"OK" sign (AIN)',
        'col': '#e0a040',
    },
    {
        'name': 'Ulnar Nerve',
        'roots': 'C7, C8, T1',
        'cord': 'Medial Cord',
        'motor': 'FCU; med. FDP;\nhypothen.; interos.;\nlumbricals 3 & 4',
        'sensory': 'Med. palm; little\n& half ring finger',
        'test': 'Finger abduction;\nCard test',
        'col': CORD_MED,
    },
    {
        'name': 'Axillary Nerve',
        'roots': 'C5, C6',
        'cord': 'Posterior Cord',
        'motor': 'Deltoid;\nTeres minor',
        'sensory': 'Regimental badge\narea (lat. arm)',
        'test': 'Shoulder abduction;\nSensory lat. arm',
        'col': CORD_POST,
    },
]

card_w  = 4.0
card_h  = 6.0
card_xs = [0.4, 4.6, 8.8, 13.0, 17.2]

for i, (cx, nc) in enumerate(zip(card_xs, nerve_cards)):
    # Card background
    rounded_box(ax, cx, panel_top-card_h-0.2, card_w, card_h,
                '#0f2235', ec=nc['col'], lw=2.0, zorder=3)

    # Header strip
    rounded_box(ax, cx, panel_top-0.85, card_w, 0.65,
                nc['col'], ec=nc['col'], lw=1, zorder=4)
    label(ax, cx+card_w/2, panel_top-0.52, nc['name'],
          fs=8.0, bold=True, color='#0d1b2a', zorder=5)

    y = panel_top-1.3
    rows = [
        ('Roots:', nc['roots']),
        ('Cord:', nc['cord']),
        ('Motor:', nc['motor']),
        ('Sensory:', nc['sensory']),
        ('Test:', nc['test']),
    ]
    for k, v in rows:
        label(ax, cx+0.2, y, k, fs=6.8, color='#7fb3d3', ha='left', bold=True)
        label(ax, cx+1.15, y, v, fs=6.8, color='#dde8f8', ha='left')
        line_count = v.count('\n') + 1
        y -= 0.38 * (1 + 0.5*(line_count-1))

# ═══════════════════════════════════════════════════════════════════
# INJURY PANEL (bottom strip)
# ═══════════════════════════════════════════════════════════════════
inj_y = 0.3
rounded_box(ax, 0.3, inj_y, 21.4, 3.3, '#0f1e30', ec='#c0392b', lw=2.0)
label(ax, 11, inj_y+3.05, '⚡  BRACHIAL PLEXUS INJURIES', fs=10,
      bold=True, color='#e74c3c')

injuries = [
    {
        'name': "Erb's Palsy\n(Upper Trunk)",
        'roots': 'C5, C6',
        'mechanism': 'Shoulder ↓, head lateral\n(birth trauma, fall)',
        'posture': '"Waiter's tip" — arm\nadducted, medially rotated,\nelbow extended, forearm pronated',
        'lost': 'Deltoid, biceps,\nbrachioradialis',
        'col': '#c0392b',
    },
    {
        'name': "Klumpke's Palsy\n(Lower Trunk)",
        'roots': 'C8, T1',
        'mechanism': 'Arm forcibly\nabducted upward',
        'posture': '"Claw hand" — intrinsic\nmuscle paralysis;\n+/– Horner syndrome',
        'lost': 'Intrinsic hand muscles;\nwrist flexors',
        'col': '#d35400',
    },
    {
        'name': 'Wrist Drop\n(Radial N.)',
        'roots': 'C5–T1',
        'mechanism': 'Humeral shaft fracture;\n"Saturday night palsy"\n(compression)',
        'posture': 'Wrist drop; cannot\nextend wrist/fingers;\nloss of triceps reflex',
        'lost': 'Wrist & finger\nextensors',
        'col': '#8e44ad',
    },
    {
        'name': 'Median N. Palsy\n(Carpal Tunnel)',
        'roots': 'C6–T1',
        'mechanism': 'Repetitive use;\npregnancy; hypothyroidism',
        'posture': '"Ape hand" — thenar\natrophy; cannot oppose\nthumb; Tinel/Phalen +ve',
        'lost': 'Thenar muscles;\nlumbricals 1 & 2',
        'col': '#e0a040',
    },
    {
        'name': 'Ulnar N. Palsy\n(Cubital Tunnel)',
        'roots': 'C8, T1',
        'mechanism': 'Medial epicondyle\nfracture/compression',
        'posture': '"Claw hand" — ring &\nlittle finger clawed;\nhypothen. atrophy',
        'lost': 'Interossei; lumbr.\n3 & 4; hypothenar',
        'col': '#e74c3c',
    },
]

inj_xs = [0.55, 4.7, 8.85, 13.0, 17.15]
inj_w  = 3.9
inj_h  = 2.7

for (ix, inj) in zip(inj_xs, injuries):
    rounded_box(ax, ix, inj_y+0.2, inj_w, inj_h,
                '#0d1b2a', ec=inj['col'], lw=1.5, zorder=4)
    # Name header
    rounded_box(ax, ix, inj_y+0.2+inj_h-0.5, inj_w, 0.5,
                inj['col'], ec=inj['col'], lw=1, zorder=5)
    label(ax, ix+inj_w/2, inj_y+0.2+inj_h-0.25, inj['name'],
          fs=7.2, bold=True, color='#0d1b2a', zorder=6)

    sy = inj_y + 0.2 + inj_h - 0.85
    for k, v in [('Roots:', inj['roots']),
                 ('Cause:', inj['mechanism']),
                 ('Signs:', inj['posture']),
                 ('Lost:', inj['lost'])]:
        label(ax, ix+0.18, sy, k, fs=6, color='#b0c8e0', ha='left', bold=True)
        label(ax, ix+0.95, sy, v, fs=6.2, color='#dde8f8', ha='left')
        sy -= 0.5

# ═══════════════════════════════════════════════════════════════════
# LEGEND
# ═══════════════════════════════════════════════════════════════════
legend_items = [
    (ROOT_COL,  'Roots (C5–T1)'),
    (TRUNK_COL, 'Trunks'),
    (DIV_ANT,   'Anterior Divisions / Lat. Cord'),
    (DIV_POST,  'Posterior Divisions / Post. Cord'),
    (CORD_MED,  'Medial Cord'),
    (NERVE_COL, 'Terminal Branches'),
]
lx, ly = 0.4, 19.1
rounded_box(ax, lx-0.1, ly-0.5, 8.5, 1.0, '#0f1e30', ec='#1e4060', lw=1, zorder=3)
label(ax, lx+4.15, ly+0.3, 'LEGEND', fs=7.5, bold=True, color='#7fb3d3')
for j, (lc, lt) in enumerate(legend_items):
    col_x = lx + (j % 3) * 2.8
    col_y = ly - 0.15 if j < 3 else ly - 0.5
    rounded_box(ax, col_x, col_y, 0.3, 0.25, lc, zorder=5)
    label(ax, col_x+0.45, col_y+0.12, lt, fs=6.5, color='#c8ddf0', ha='left')

# ── Memory mnemonic ────────────────────────────────────────────────
rounded_box(ax, 8.8, 18.8, 13.0, 0.7, '#0f2235', ec='#2e86de', lw=1.5)
label(ax, 15.3, 19.15, '🧠  Mnemonic:  Robert Taylor Drinks Cold Beer', 
      fs=9, bold=True, color='#f0c040')
label(ax, 15.3, 18.92, 'Roots  •  Trunks  •  Divisions  •  Cords  •  Branches',
      fs=7.5, color='#7fb3d3')

# ── Save ──────────────────────────────────────────────────────────
plt.savefig('/home/daytona/workspace/brachial-plexus/brachial_plexus_infographic.png',
            dpi=180, bbox_inches='tight', facecolor='#0d1b2a')
print('Saved successfully.')
Running Command

cd /home/daytona/workspace/brachial-plexus && python generate_infographic.py 2>&1

Editing File

~/brachial-plexus/generate_infographic.py

Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/brachial-plexus/generate_infographic.py'
Running Command

cd /home/daytona/workspace/brachial-plexus && python generate_infographic.py 2>&1

Generated successfully (the brain emoji warning is cosmetic only). Let me fix that emoji and verify the file looks good.
Editing File

~/brachial-plexus/generate_infographic.py

Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/brachial-plexus/generate_infographic.py'
Running Command

cd /home/daytona/workspace/brachial-plexus && python generate_infographic.py 2>&1 && ls -lh brachial_plexus_infographic.png

The infographic is ready. Here's your download link:

brachial plexus infographic

Image · PNG


What's included in the infographic (sourced from Gray's Anatomy for Students):
Top — Schematic Flow Diagram
  • Color-coded pathway: Roots (C5–T1)Trunks (Upper/Middle/Lower) → Divisions (Anterior/Posterior) → Cords (Lateral/Posterior/Medial) → Terminal Branches
  • Pre-trunk branches shown with dashed lines: Dorsal Scapular N., Long Thoracic N., Suprascapular N., N. to Subclavius
Middle — 5 Terminal Nerve Cards Each card (Musculocutaneous, Radial, Median, Ulnar, Axillary) lists: roots, cord of origin, motor supply, sensory territory, and clinical test
Bottom — Injury Panel Erb's Palsy, Klumpke's Palsy, Wrist Drop, Median N. Palsy, Ulnar N. Palsy — each with mechanism, clinical signs, and muscles lost
Mnemonic strip: Robert Taylor Drinks Cold Beer (Roots → Trunks → Divisions → Cords → Branches)
This is a shared conversation. Sign in to Orris to start your own chat.