Can you re-edit this in high resolution and clearly visible letters
mkdir -p /tmp/workspace/phototherapy-infographic && ls /tmp/workspace/
~/phototherapy-infographic/build.py
"""
High-resolution recreation of the Mechanism of Phototherapy and Study Rationale infographic.
Output: 3000 x 3750 px PNG (300 DPI quality)
"""
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_W, FIG_H = 20, 26 # inches
DPI = 150
fig = plt.figure(figsize=(FIG_W, FIG_H), dpi=DPI, facecolor='white')
ax = fig.add_axes([0, 0, 1, 1])
ax.set_xlim(0, FIG_W)
ax.set_ylim(0, FIG_H)
ax.axis('off')
fig.patch.set_facecolor('white')
# ── Palette ───────────────────────────────────────────────────────────────────
C_NAV = '#1a3a6b' # navy header
C_TEAL = '#2176ae' # mid blue
C_LBLUE = '#dce8f5' # light blue bg
C_LGRN = '#d4edda' # light green bg
C_LPURP = '#ede7f6' # light purple bg
C_LORAN = '#fff3cd' # light orange bg
C_LRED = '#fde8e8' # light red bg
C_GREEN = '#1b7a3e' # section B header green
C_ORG = '#d97706' # orange accent
C_RED = '#b91c1c' # red accent
C_PURP = '#6d28d9' # purple accent
C_BLU2 = '#1d4ed8' # blue accent
C_GRN2 = '#15803d' # green accent
C_DARK = '#1e293b' # near black text
C_MID = '#374151' # medium text
C_LGRY = '#f8fafc' # very light background
# ── Helpers ───────────────────────────────────────────────────────────────────
def box(ax, x, y, w, h, fc, ec, lw=1.5, radius=0.3):
p = FancyBboxPatch((x, y), w, h,
boxstyle=f"round,pad=0,rounding_size={radius}",
facecolor=fc, edgecolor=ec, linewidth=lw, zorder=2)
ax.add_patch(p)
def pill_header(ax, cx, cy, w, h, fc, text, tc='white', fs=11):
p = FancyBboxPatch((cx - w/2, cy - h/2), w, h,
boxstyle="round,pad=0,rounding_size=0.15",
facecolor=fc, edgecolor='none', zorder=3)
ax.add_patch(p)
ax.text(cx, cy, text, ha='center', va='center',
fontsize=fs, fontweight='bold', color=tc, zorder=4,
fontfamily='DejaVu Sans')
def txt(ax, x, y, s, fs=9, fc=C_DARK, ha='left', va='top',
bold=False, wrap=True, zorder=5):
fw = 'bold' if bold else 'normal'
ax.text(x, y, s, ha=ha, va=va, fontsize=fs, color=fc,
fontweight=fw, fontfamily='DejaVu Sans',
wrap=wrap, zorder=zorder,
multialignment='left' if ha == 'left' else 'center')
def arrow(ax, x1, y1, x2, y2, color='#555', lw=1.5):
ax.annotate('', xy=(x2, y2), xytext=(x1, y1),
arrowprops=dict(arrowstyle='->', color=color, lw=lw),
zorder=6)
def circle_icon(ax, cx, cy, r, fc, ec='white', lw=1.2, alpha=0.9):
c = plt.Circle((cx, cy), r, facecolor=fc, edgecolor=ec,
linewidth=lw, alpha=alpha, zorder=4)
ax.add_patch(c)
# ─────────────────────────────────────────────────────────────────────────────
# 1. MAIN HEADER
# ─────────────────────────────────────────────────────────────────────────────
box(ax, 0.3, 24.6, 19.4, 1.1, C_NAV, C_NAV, lw=0, radius=0.25)
txt(ax, 10, 25.2, '3. MECHANISM OF PHOTOTHERAPY AND STUDY RATIONALE',
fs=16, fc='white', ha='center', va='center', bold=True)
# ─────────────────────────────────────────────────────────────────────────────
# 2. SECTION A — outer box
# ─────────────────────────────────────────────────────────────────────────────
box(ax, 0.4, 13.9, 19.2, 10.5, C_LGRY, C_TEAL, lw=2, radius=0.4)
pill_header(ax, 10, 24.2, 7, 0.55, C_TEAL, 'A. MECHANISM OF PHOTOTHERAPY', fs=12)
# ── Row 1: 4 flow cards ───────────────────────────────────────────────────────
card_tops = [23.45, 23.45, 23.45, 23.45]
card_h = 4.1
card_ys = [t - card_h for t in card_tops] # bottom y
cards_A = [
dict(x=0.6, w=3.8, fc=C_LBLUE, ec=C_TEAL, hc=C_TEAL, title='1. NEONATAL\nHYPERBILIRUBINEMIA'),
dict(x=4.7, w=3.4, fc='#e8f4fc',ec=C_TEAL, hc='#1565c0', title='2. PHOTOTHERAPY'),
dict(x=8.35, w=5.6, fc='#eafaf1',ec='#27ae60',hc='#27ae60', title='3. PHOTOISOMERIZATION OF\nBILIRUBIN IN SKIN'),
dict(x=14.2, w=5.1, fc=C_LORAN, ec=C_ORG, hc=C_ORG, title='4. WATER-SOLUBLE\nPHOTOISOEMRS'),
]
for i, c in enumerate(cards_A):
bx, by = c['x'], card_ys[i]
box(ax, bx, by, c['w'], card_h, c['fc'], c['ec'], radius=0.3)
# coloured header strip
box(ax, bx, by + card_h - 0.65, c['w'], 0.65, c['hc'], c['hc'], lw=0, radius=0.3)
txt(ax, bx + c['w']/2, by + card_h - 0.32, c['title'],
fs=8.5, fc='white', ha='center', va='center', bold=True)
# Card 1 content
txt(ax, 1.0, 22.45, 'Excess unconjugated\nbilirubin (indirect)', fs=8.5, fc=C_MID)
txt(ax, 1.0, 21.0, '↑ Serum unconjugated\nbilirubin', fs=9, fc=C_NAV, bold=True)
# baby icon (circle cluster)
for dx, dy in [(2.9, 21.9), (3.3, 22.2), (3.1, 22.5), (2.7, 22.3)]:
circle_icon(ax, dx, dy, 0.18, '#f9c74f')
# baby silhouette (simple)
circle_icon(ax, 2.7, 21.35, 0.3, '#fde68a', ec='#d97706', lw=1.5) # head
rect = mpatches.FancyBboxPatch((2.4, 20.7), 0.6, 0.55,
boxstyle="round,pad=0.05",
facecolor='#fde68a', edgecolor='#d97706', lw=1.2, zorder=4)
ax.add_patch(rect)
# Card 2 content
txt(ax, 4.9, 22.55, 'Blue light\n(430–490 nm)', fs=9, fc=C_MID, ha='left')
# lamp icon
circle_icon(ax, 7.05, 22.6, 0.28, '#60a5fa', ec='#1565c0')
for angle in range(0, 360, 45):
rad = np.radians(angle)
x0 = 7.05 + 0.35*np.cos(rad); y0 = 22.6 + 0.35*np.sin(rad)
x1 = 7.05 + 0.6*np.cos(rad); y1 = 22.6 + 0.6*np.sin(rad)
ax.plot([x0, x1], [y0, y1], color='#60a5fa', lw=1.5, zorder=4)
# incubator
rect2 = mpatches.FancyBboxPatch((5.1, 20.7), 2.4, 0.9,
boxstyle="round,pad=0.05",
facecolor='#bfdbfe', edgecolor='#1565c0', lw=1.2, zorder=4)
ax.add_patch(rect2)
txt(ax, 6.3, 21.2, 'Incubator', fs=7.5, fc='#1e40af', ha='center', va='center')
# Card 3 content - photoisomerization
txt(ax, 8.55, 22.5, 'Unconjugated\nbilirubin', fs=8, fc=C_MID)
for dx, dy in [(8.8,21.6),(9.15,21.85),(9.0,21.35),(9.35,21.6)]:
circle_icon(ax, dx, dy, 0.15, '#f9c74f')
# wave arrow
ax.annotate('', xy=(11.1, 21.6), xytext=(9.7, 21.6),
arrowprops=dict(arrowstyle='->', color='#2563eb', lw=2), zorder=6)
ax.text(10.4, 21.85, 'Blue light\nenergy', ha='center', va='bottom', fontsize=7.5,
color='#2563eb', fontfamily='DejaVu Sans', zorder=5)
# photoisomers - shapes
circle_icon(ax, 11.6, 22.1, 0.22, '#6ee7b7')
tri = plt.Polygon([[11.9, 21.5],[12.3, 21.5],[12.1, 21.85]], color='#34d399', zorder=4)
ax.add_patch(tri)
dia = plt.Polygon([[12.3,21.6],[12.6,21.9],[12.9,21.6],[12.6,21.3]], color='#10b981', zorder=4)
ax.add_patch(dia)
txt(ax, 12.1, 22.45, 'Photoisomers', fs=8, fc=C_GRN2, ha='center', bold=True)
txt(ax, 8.55, 20.9, '• Structural isomer (Lumirubin)', fs=8, fc=C_DARK)
txt(ax, 8.55, 20.35, '• Geometric isomers\n (Z,Z bilirubin and E,Z bilirubin)', fs=8, fc=C_DARK)
# Card 4 content
txt(ax, 14.4, 22.5, '• More polar', fs=8.5, fc=C_DARK)
txt(ax, 14.4, 22.0, '• Do not require hepatic\n glucuronidation', fs=8.5, fc=C_DARK)
txt(ax, 14.4, 21.1, '• Easily excreted in\n bile and urine', fs=8.5, fc=C_DARK)
# water droplet
droplet = plt.Polygon([[17.6,22.8],[17.2,21.9],[18.0,21.9]], color='#60a5fa',
alpha=0.85, zorder=4)
ax.add_patch(droplet)
circle_icon(ax, 17.6, 21.9, 0.45, '#60a5fa', ec='#2563eb')
# ── Arrows between row-1 cards ────────────────────────────────────────────────
for x1, x2 in [(4.4, 4.7), (8.05, 8.35), (13.95, 14.2)]:
arrow(ax, x1, 21.4, x2, 21.4, lw=2.5)
# ── Row 2: Cards 5 & 6 ───────────────────────────────────────────────────────
r2_y = 17.9; r2_h = 1.95
# Card 5
box(ax, 0.6, r2_y, 5.5, r2_h, C_LPURP, C_PURP, radius=0.3)
box(ax, 0.6, r2_y + r2_h - 0.6, 5.5, 0.6, C_PURP, C_PURP, lw=0, radius=0.3)
txt(ax, 3.35, r2_y + r2_h - 0.3, '5. OUTCOME OF PHOTOTHERAPY',
fs=8.5, fc='white', ha='center', va='center', bold=True)
txt(ax, 0.85, r2_y + r2_h - 0.85, '↓ Serum unconjugated bilirubin levels', fs=9, fc=C_PURP, bold=True)
txt(ax, 0.85, r2_y + 0.6, 'Clinical improvement of jaundice', fs=9, fc=C_MID)
# Card 6
box(ax, 6.5, r2_y, 12.9, r2_h + 0.6, C_LBLUE, C_TEAL, radius=0.3)
box(ax, 6.5, r2_y + r2_h + 0.0, 12.9, 0.6, C_TEAL, C_TEAL, lw=0, radius=0.3)
txt(ax, 12.95, r2_y + r2_h + 0.3, '6. EFFECT ON MAGNESIUM LEVELS',
fs=8.5, fc='white', ha='center', va='center', bold=True)
c6txt = [
'• As bilirubin (neurotoxic stimulus) decreases → compensatory need for higher Mg²⁺ decreases',
'• Possible suppression of melatonin secretion by transcranial light exposure may reduce Mg²⁺ levels',
'• Result: ↓ Serum magnesium levels after phototherapy (usually remain within normal range)',
]
for i, t in enumerate(c6txt):
txt(ax, 6.75, r2_y + r2_h - 0.15 - i*0.68, t, fs=8.2, fc=C_DARK)
# arrow from card 5 to card 6 (row 2)
arrow(ax, 6.1, 18.9, 6.5, 18.9, lw=2.5)
# arrow from card 3 (row 1) down to card 5 area
arrow(ax, 11.15, 19.35, 3.35, 19.85, lw=2, color='#888')
# ─────────────────────────────────────────────────────────────────────────────
# 3. SECTION B — outer box
# ─────────────────────────────────────────────────────────────────────────────
box(ax, 0.4, 3.0, 19.2, 14.6, C_LGRY, '#27ae60', lw=2, radius=0.4)
pill_header(ax, 10, 17.3, 5.5, 0.55, C_GREEN, 'B. STUDY RATIONALE',
tc='white', fs=12)
# ── 5 columns ────────────────────────────────────────────────────────────────
col_data = [
dict(title='1. HYPERBILIRUBINEMIA\nAND MAGNESIUM', hc=C_ORG, fc=C_LORAN, ec=C_ORG),
dict(title='2. PHOTOTHERAPY\nEFFECT', hc=C_GRN2, fc=C_LGRN, ec=C_GRN2),
dict(title='3. CLINICAL\nIMPORTANCE', hc=C_RED, fc=C_LRED, ec=C_RED),
dict(title='4. KNOWLEDGE\nGAP', hc=C_BLU2, fc=C_LBLUE, ec=C_BLU2),
dict(title='5. STUDY\nPURPOSE', hc=C_PURP, fc=C_LPURP, ec=C_PURP),
]
col_x = [0.6, 4.5, 8.4, 12.3, 16.0]
col_w = 3.65
col_by = 9.7
col_h = 6.9
col_body = [
'High bilirubin may ↑ serum\nmagnesium as a compensatory\nneuroprotective response\n(via NMDA receptor blockade).',
'Phototherapy ↓ bilirubin\n→ ↓ need for compensatory\nmagnesium elevation\n→ ↓ serum magnesium.',
'• Magnesium plays a key role\n in neuroprotection in\n neonates.\n• Significant changes in Mg²⁺\n may reflect severity of\n hyperbilirubinemia and\n response to phototherapy.\n• Monitoring may help prevent\n potential neurological injury.',
'Limited data on the pattern\nof serum magnesium changes\nbefore and after phototherapy\nin neonates with\nhyperbilirubinemia.',
'To evaluate serum magnesium\nlevels in neonates with\nhyperbilirubinemia before and\nafter phototherapy and to\nassess their correlation with\nbilirubin levels.',
]
for i, c in enumerate(col_data):
bx = col_x[i]
# main card
box(ax, bx, col_by, col_w, col_h, c['fc'], c['ec'], radius=0.3)
# header strip
box(ax, bx, col_by + col_h - 0.85, col_w, 0.85, c['hc'], c['hc'], lw=0, radius=0.3)
txt(ax, bx + col_w/2, col_by + col_h - 0.42,
c['title'], fs=8, fc='white', ha='center', va='center', bold=True)
# body text
txt(ax, bx + 0.15, col_by + col_h - 1.1, col_body[i], fs=8.2, fc=C_DARK)
# ── Icons for section B columns ───────────────────────────────────────────────
# Col 1: bilirubin <-> Mg circles
for dx, dy in [(1.2,11.5),(1.55,11.75),(1.35,12.0)]:
circle_icon(ax, dx, dy, 0.18, '#f9c74f')
ax.annotate('', xy=(2.35, 11.75), xytext=(1.75, 11.75),
arrowprops=dict(arrowstyle='<->', color=C_ORG, lw=2))
circle_icon(ax, 2.75, 11.75, 0.32, C_PURP)
txt(ax, 2.75, 11.75, 'Mg²⁺', fs=7.5, fc='white', ha='center', va='center', bold=True)
# Col 2: lamp icon
circle_icon(ax, 6.3, 12.0, 0.3, '#60a5fa', ec='#1565c0')
for ang in range(0,360,60):
rad = np.radians(ang)
ax.plot([6.3+0.38*np.cos(rad), 6.3+0.6*np.cos(rad)],
[12.0+0.38*np.sin(rad), 12.0+0.6*np.sin(rad)],
color='#60a5fa', lw=1.8, zorder=4)
# Col 3: shield + brain
shield = plt.Polygon([[9.9,12.6],[9.9,11.4],[10.6,10.9],[11.3,11.4],[11.3,12.6],[10.6,13.1]],
color='#10b981', alpha=0.9, zorder=4)
ax.add_patch(shield)
txt(ax, 10.6, 12.0, '✓', fs=13, fc='white', ha='center', va='center', bold=True)
# Col 4: magnifying glass
circle_icon(ax, 14.25, 12.0, 0.42, 'white', ec=C_BLU2, lw=2.5)
txt(ax, 14.25, 12.0, '?', fs=13, fc=C_GRN2, ha='center', va='center', bold=True)
ax.plot([14.55, 14.9], [11.7, 11.35], color=C_BLU2, lw=3, zorder=4)
# Col 5: target bullseye
for r, fc in [(0.5,'#ef4444'),(0.35,'white'),(0.2,'#ef4444')]:
circle_icon(ax, 18.0, 12.0, r, fc, ec='#ef4444' if fc=='white' else 'white', lw=1.5)
ax.plot([18.0, 18.55], [12.0, 12.55], color='#1d4ed8', lw=2.5, zorder=5)
# ── Dashed connectors from each column to Overall Rationale ──────────────────
or_cx = [c_x + col_w/2 for c_x in col_x]
for cx in or_cx:
ax.plot([cx, cx], [col_by, col_by - 0.3], color=C_ORG, lw=1.5,
linestyle='--', zorder=3)
ax.plot([or_cx[0], or_cx[-1]], [col_by - 0.3, col_by - 0.3],
color=C_ORG, lw=1.5, linestyle='--', zorder=3)
ax.plot([10, 10], [col_by - 0.3, col_by - 0.55], color=C_ORG, lw=1.5,
linestyle='--', zorder=3)
arrow(ax, 10, col_by - 0.55, 10, col_by - 0.7, color=C_ORG, lw=2)
# ── Overall Rationale box ─────────────────────────────────────────────────────
or_y = 7.2; or_h = 2.0
box(ax, 0.6, or_y, 18.8, or_h, '#fffbeb', C_ORG, lw=2, radius=0.3)
# bar-chart icon
for bi, (bh, bc) in enumerate([(0.5,'#f97316'),(0.7,'#2563eb'),(0.35,'#f9c74f')]):
bx_i = 1.0 + bi*0.4
ax.bar(bx_i, bh, width=0.3, bottom=or_y+0.3, color=bc, zorder=4)
txt(ax, 2.2, or_y + or_h - 0.28, 'OVERALL RATIONALE', fs=10, fc=C_ORG, bold=True)
or_body = ('Assessing changes in serum magnesium levels in neonates undergoing phototherapy for '
'hyperbilirubinemia helps to understand the\ncompensatory neuroprotective response, '
'the effect of phototherapy on magnesium homeostasis, and its potential role as an adjunct\n'
'biochemical marker for bilirubin neurotoxicity.')
txt(ax, 2.2, or_y + or_h - 0.65, or_body, fs=8.8, fc=C_DARK)
# ── Key Takeaway bar ──────────────────────────────────────────────────────────
kt_y = 4.0; kt_h = 2.8
box(ax, 0.6, kt_y, 18.8, kt_h, '#eff6ff', '#2563eb', lw=2, radius=0.3)
# star
star_x = [1.0, 1.1, 1.4, 1.1, 1.2, 1.0, 0.8, 0.9, 0.6, 0.9, 1.0]
star_y = [6.5, 6.2, 6.2, 5.9, 5.6, 5.75, 5.6, 5.9, 6.2, 6.2, 6.5]
star_patch = plt.Polygon(list(zip(star_x, star_y)), color='#fbbf24', zorder=5)
ax.add_patch(star_patch)
txt(ax, 2.0, kt_y + kt_h - 0.35, 'KEY TAKEAWAY', fs=10, fc=C_NAV, bold=True)
kt_body = ('Phototherapy converts bilirubin into excretable forms, reduces neurotoxic risk and '
'compensatory magnesium elevation.\nMonitoring serum magnesium provides insight into '
'the biochemical and neuroprotective response in affected neonates.')
txt(ax, 2.0, kt_y + kt_h - 0.75, kt_body, fs=8.8, fc=C_DARK)
# ── Save ──────────────────────────────────────────────────────────────────────
out = '/tmp/workspace/phototherapy-infographic/Phototherapy_Infographic_HiRes.png'
fig.savefig(out, dpi=DPI, bbox_inches='tight', facecolor='white',
pil_kwargs={'quality': 95})
plt.close(fig)
print(f'Saved: {out}')
cd /tmp/workspace/phototherapy-infographic && python build.py 2>&1
python3 -c " from PIL import Image img = Image.open('/tmp/workspace/phototherapy-infographic/Phototherapy_Infographic_HiRes.png') print('Size:', img.size, '| Mode:', img.mode) "
python3 -c " import os path = '/tmp/workspace/phototherapy-infographic/Phototherapy_Infographic_HiRes.png' size = os.path.getsize(path) print(f'File size: {size/1024:.1f} KB ({size/1024/1024:.2f} MB)') from PIL import Image img = Image.open(path) print('Dimensions:', img.size) print('Mode:', img.mode) "
Phototherapy Infographic HiRes
Image · PNG