In these plot a graph for wt and height for a 10 year old child with Noonan syndrome and draw again
Noonan syndrome height weight 10 year old typical measurements growth chart
ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && echo "workspace ready"
mkdir -p /tmp/workspace/noonan-growth && python3 << 'EOF' import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import matplotlib.patches as mpatches import numpy as np from matplotlib.lines import Line2D from matplotlib.patches import FancyArrowPatch # ────────────────────────────────────────────────────────── # CDC / WHO-based approximate percentile DATA for Boys 0–18 # Height (cm) at each age for given percentiles # Source: CDC 2000 growth charts data (approximate) # ────────────────────────────────────────────────────────── ages = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]) # Height percentiles (cm) – Boys height = { 'P3': [47.5, 72.0, 82.5, 89.5, 96.0, 101.5, 107.0, 111.5, 116.0, 120.5, 125.0, 129.5, 134.5, 140.0, 148.0, 158.0, 163.0, 165.5, 166.0], 'P10': [49.0, 73.5, 84.5, 92.0, 98.5, 104.5, 110.5, 115.5, 120.5, 125.0, 130.0, 134.5, 139.5, 146.0, 154.5, 163.0, 168.0, 170.0, 170.5], 'P25': [50.0, 75.5, 87.0, 94.5, 101.5, 107.5, 113.5, 119.0, 124.0, 129.0, 134.5, 139.0, 145.0, 152.0, 161.0, 168.5, 173.0, 175.0, 176.0], 'P50': [51.5, 77.5, 89.5, 97.5, 104.5, 111.0, 117.0, 122.5, 128.0, 133.5, 139.0, 144.5, 150.5, 158.5, 167.5, 174.5, 178.5, 180.5, 181.5], 'P75': [53.0, 79.5, 92.0, 100.5, 107.5, 114.5, 120.5, 126.5, 132.0, 138.0, 143.5, 150.0, 156.5, 165.0, 173.5, 180.0, 184.0, 186.0, 187.0], 'P90': [54.5, 81.0, 94.0, 103.0, 110.5, 117.5, 124.0, 130.0, 136.5, 142.5, 148.0, 155.0, 162.5, 171.0, 179.5, 185.5, 188.5, 190.5, 191.5], 'P97': [56.0, 83.0, 96.5, 105.5, 113.5, 120.5, 127.5, 134.5, 141.0, 147.5, 153.0, 160.5, 168.0, 177.5, 185.5, 191.0, 194.0, 195.5, 196.0], } # Weight percentiles (kg) – Boys weight = { 'P3': [2.5, 8.8, 10.5, 12.5, 14.0, 15.5, 17.0, 18.5, 20.5, 22.5, 25.0, 28.0, 31.5, 36.0, 42.0, 48.5, 54.0, 57.5, 59.5], 'P10': [2.8, 9.2, 11.0, 13.0, 14.7, 16.5, 18.5, 20.0, 22.5, 25.0, 28.0, 31.5, 36.0, 41.0, 48.0, 55.0, 61.0, 65.0, 67.0], 'P25': [3.1, 9.9, 11.8, 14.0, 16.0, 18.0, 20.0, 22.0, 25.0, 28.0, 31.5, 36.0, 41.0, 47.0, 55.5, 63.0, 69.0, 73.5, 76.0], 'P50': [3.5, 10.5, 12.7, 15.0, 17.5, 19.5, 22.0, 25.0, 28.0, 31.5, 36.0, 41.0, 47.5, 55.5, 64.0, 72.0, 78.5, 83.0, 85.5], 'P75': [3.9, 11.5, 13.9, 16.3, 19.0, 21.5, 24.5, 27.5, 31.5, 36.0, 40.5, 47.0, 55.0, 64.5, 73.5, 81.5, 88.0, 92.5, 95.0], 'P90': [4.3, 12.3, 15.0, 17.8, 20.5, 23.5, 27.0, 31.0, 36.0, 41.0, 46.5, 54.5, 63.5, 74.0, 83.5, 91.5, 97.5, 102.0, 105.0], 'P97': [4.7, 13.5, 16.5, 19.5, 22.5, 26.5, 31.0, 35.5, 41.5, 47.5, 54.0, 63.0, 73.5, 85.5, 96.0, 104.0, 110.0, 114.5, 118.0], } # ────────────────────────────────────────────────────────── # Noonan syndrome: 10-year-old boy typical values # Height ≈ 3rd %ile or below (approx 125-127 cm = ~3rd %ile) # Weight ≈ 3rd %ile or just below (approx 25-26 kg) # Using well-established Noonan syndrome growth references: # Final adult height ~162 cm (mean), ~2.5 SD below normal mean # At age 10: approximately 127 cm height (≈3rd %ile), 26 kg weight (≈3rd %ile) # ────────────────────────────────────────────────────────── noonan_age = 10 noonan_height = 127.0 # cm (3rd percentile / -2SD) noonan_weight = 26.0 # kg (3rd percentile) colors = { 'P3': '#d62728', 'P10': '#ff7f0e', 'P25': '#2ca02c', 'P50': '#1f77b4', 'P75': '#9467bd', 'P90': '#8c564b', 'P97': '#e377c2', } # ────────────────────────────────────────────────────────────── # FIGURE 1 – HEIGHT CHART # ────────────────────────────────────────────────────────────── fig, ax = plt.subplots(figsize=(13, 9)) ax.set_facecolor('#fafaf5') fig.patch.set_facecolor('#f5f5ee') for p, vals in height.items(): ax.plot(ages, vals, color=colors[p], linewidth=1.5, alpha=0.85) # label at right end ax.annotate(p, xy=(18, vals[-1]), fontsize=7.5, color=colors[p], va='center', fontweight='bold') # Grid ax.set_xticks(range(0, 19)) ax.set_yticks(range(40, 205, 5)) ax.grid(True, linestyle='--', alpha=0.35, color='gray') ax.set_xlim(-0.3, 18.8) ax.set_ylim(40, 200) # Axes labels ax.set_xlabel('Age (Years)', fontsize=12, fontweight='bold', labelpad=8) ax.set_ylabel('Height (cm)', fontsize=12, fontweight='bold', labelpad=8) ax.set_title("Boys Height Chart – 0 to 18 Years\n(WHO/CDC Percentiles + Noonan Syndrome Point)", fontsize=13, fontweight='bold', pad=14) # ── Plot Noonan syndrome point ── ax.scatter(noonan_age, noonan_height, s=220, color='#e31a1c', zorder=8, edgecolors='black', linewidths=1.5, marker='*') ax.annotate( f'Noonan syndrome\n10 yr old boy\nHeight: {noonan_height} cm\n(≈ 3rd %ile)', xy=(noonan_age, noonan_height), xytext=(noonan_age + 1.5, noonan_height - 12), fontsize=9, color='#b00000', fontweight='bold', arrowprops=dict(arrowstyle='->', color='#b00000', lw=1.5), bbox=dict(boxstyle='round,pad=0.4', facecolor='#fff0f0', edgecolor='#e31a1c', alpha=0.95) ) # Dashed lines to axes ax.plot([noonan_age, noonan_age], [40, noonan_height], color='#e31a1c', linestyle=':', linewidth=1.2, alpha=0.7) ax.plot([-0.3, noonan_age], [noonan_height, noonan_height], color='#e31a1c', linestyle=':', linewidth=1.2, alpha=0.7) # Legend legend_lines = [Line2D([0], [0], color=colors[p], linewidth=2, label=p) for p in colors] legend_lines.append(Line2D([0], [0], marker='*', color='w', markerfacecolor='#e31a1c', markeredgecolor='black', markersize=12, label='Noonan (10yr boy)')) ax.legend(handles=legend_lines, loc='upper left', fontsize=8.5, framealpha=0.9, title='Percentiles', title_fontsize=9) plt.tight_layout() plt.savefig('/tmp/workspace/noonan-growth/noonan_height_chart.png', dpi=150, bbox_inches='tight') plt.close() print("Height chart saved.") # ────────────────────────────────────────────────────────────── # FIGURE 2 – WEIGHT CHART # ────────────────────────────────────────────────────────────── fig, ax = plt.subplots(figsize=(13, 9)) ax.set_facecolor('#fafaf5') fig.patch.set_facecolor('#f5f5ee') for p, vals in weight.items(): ax.plot(ages, vals, color=colors[p], linewidth=1.5, alpha=0.85) ax.annotate(p, xy=(18, vals[-1]), fontsize=7.5, color=colors[p], va='center', fontweight='bold') ax.set_xticks(range(0, 19)) ax.set_yticks(range(0, 125, 5)) ax.grid(True, linestyle='--', alpha=0.35, color='gray') ax.set_xlim(-0.3, 18.8) ax.set_ylim(0, 120) ax.set_xlabel('Age (Years)', fontsize=12, fontweight='bold', labelpad=8) ax.set_ylabel('Weight (kg)', fontsize=12, fontweight='bold', labelpad=8) ax.set_title("Boys Weight Chart – 0 to 18 Years\n(WHO/CDC Percentiles + Noonan Syndrome Point)", fontsize=13, fontweight='bold', pad=14) ax.scatter(noonan_age, noonan_weight, s=220, color='#e31a1c', zorder=8, edgecolors='black', linewidths=1.5, marker='*') ax.annotate( f'Noonan syndrome\n10 yr old boy\nWeight: {noonan_weight} kg\n(≈ 3rd %ile)', xy=(noonan_age, noonan_weight), xytext=(noonan_age + 1.5, noonan_weight + 15), fontsize=9, color='#b00000', fontweight='bold', arrowprops=dict(arrowstyle='->', color='#b00000', lw=1.5), bbox=dict(boxstyle='round,pad=0.4', facecolor='#fff0f0', edgecolor='#e31a1c', alpha=0.95) ) ax.plot([noonan_age, noonan_age], [0, noonan_weight], color='#e31a1c', linestyle=':', linewidth=1.2, alpha=0.7) ax.plot([-0.3, noonan_age], [noonan_weight, noonan_weight], color='#e31a1c', linestyle=':', linewidth=1.2, alpha=0.7) legend_lines = [Line2D([0], [0], color=colors[p], linewidth=2, label=p) for p in colors] legend_lines.append(Line2D([0], [0], marker='*', color='w', markerfacecolor='#e31a1c', markeredgecolor='black', markersize=12, label='Noonan (10yr boy)')) ax.legend(handles=legend_lines, loc='upper left', fontsize=8.5, framealpha=0.9, title='Percentiles', title_fontsize=9) plt.tight_layout() plt.savefig('/tmp/workspace/noonan-growth/noonan_weight_chart.png', dpi=150, bbox_inches='tight') plt.close() print("Weight chart saved.") # ────────────────────────────────────────────────────────────── # FIGURE 3 – COMBINED CHART (side by side) # ────────────────────────────────────────────────────────────── fig, axes = plt.subplots(1, 2, figsize=(20, 9)) fig.patch.set_facecolor('#f5f5ee') fig.suptitle("Boys Height and Weight Chart (0–18 Years)\nNoonan Syndrome – 10-Year-Old Boy Plotted", fontsize=14, fontweight='bold', y=1.01) # -- Height subplot -- ax1 = axes[0] ax1.set_facecolor('#fafaf5') for p, vals in height.items(): ax1.plot(ages, vals, color=colors[p], linewidth=1.5, alpha=0.85) ax1.annotate(p, xy=(18, vals[-1]), fontsize=7, color=colors[p], va='center', fontweight='bold') ax1.set_xticks(range(0, 19)) ax1.set_yticks(range(40, 205, 5)) ax1.grid(True, linestyle='--', alpha=0.35, color='gray') ax1.set_xlim(-0.3, 18.8) ax1.set_ylim(40, 200) ax1.set_xlabel('Age (Years)', fontsize=11, fontweight='bold') ax1.set_ylabel('Height (cm)', fontsize=11, fontweight='bold') ax1.set_title('Height-for-Age', fontsize=12, fontweight='bold', pad=10) ax1.scatter(noonan_age, noonan_height, s=250, color='#e31a1c', zorder=8, edgecolors='black', linewidths=1.5, marker='*') ax1.annotate(f'Noonan ♂ 10yr\n{noonan_height} cm (≈3rd %ile)', xy=(noonan_age, noonan_height), xytext=(12, 115), fontsize=8.5, color='#b00000', fontweight='bold', arrowprops=dict(arrowstyle='->', color='#b00000', lw=1.4), bbox=dict(boxstyle='round,pad=0.4', facecolor='#fff0f0', edgecolor='#e31a1c', alpha=0.95)) ax1.plot([noonan_age]*2, [40, noonan_height], color='#e31a1c', linestyle=':', linewidth=1.1, alpha=0.7) ax1.plot([-0.3, noonan_age], [noonan_height]*2, color='#e31a1c', linestyle=':', linewidth=1.1, alpha=0.7) legend_lines = [Line2D([0],[0], color=colors[p], lw=2, label=p) for p in colors] legend_lines.append(Line2D([0],[0], marker='*', color='w', markerfacecolor='#e31a1c', markeredgecolor='black', markersize=11, label='Noonan (10yr)')) ax1.legend(handles=legend_lines, loc='upper left', fontsize=7.5, framealpha=0.9, title='Percentiles', title_fontsize=8) # -- Weight subplot -- ax2 = axes[1] ax2.set_facecolor('#fafaf5') for p, vals in weight.items(): ax2.plot(ages, vals, color=colors[p], linewidth=1.5, alpha=0.85) ax2.annotate(p, xy=(18, vals[-1]), fontsize=7, color=colors[p], va='center', fontweight='bold') ax2.set_xticks(range(0, 19)) ax2.set_yticks(range(0, 125, 5)) ax2.grid(True, linestyle='--', alpha=0.35, color='gray') ax2.set_xlim(-0.3, 18.8) ax2.set_ylim(0, 120) ax2.set_xlabel('Age (Years)', fontsize=11, fontweight='bold') ax2.set_ylabel('Weight (kg)', fontsize=11, fontweight='bold') ax2.set_title('Weight-for-Age', fontsize=12, fontweight='bold', pad=10) ax2.scatter(noonan_age, noonan_weight, s=250, color='#e31a1c', zorder=8, edgecolors='black', linewidths=1.5, marker='*') ax2.annotate(f'Noonan ♂ 10yr\n{noonan_weight} kg (≈3rd %ile)', xy=(noonan_age, noonan_weight), xytext=(12, 55), fontsize=8.5, color='#b00000', fontweight='bold', arrowprops=dict(arrowstyle='->', color='#b00000', lw=1.4), bbox=dict(boxstyle='round,pad=0.4', facecolor='#fff0f0', edgecolor='#e31a1c', alpha=0.95)) ax2.plot([noonan_age]*2, [0, noonan_weight], color='#e31a1c', linestyle=':', linewidth=1.1, alpha=0.7) ax2.plot([-0.3, noonan_age], [noonan_weight]*2, color='#e31a1c', linestyle=':', linewidth=1.1, alpha=0.7) legend_lines2 = [Line2D([0],[0], color=colors[p], lw=2, label=p) for p in colors] legend_lines2.append(Line2D([0],[0], marker='*', color='w', markerfacecolor='#e31a1c', markeredgecolor='black', markersize=11, label='Noonan (10yr)')) ax2.legend(handles=legend_lines2, loc='upper left', fontsize=7.5, framealpha=0.9, title='Percentiles', title_fontsize=8) plt.tight_layout() plt.savefig('/tmp/workspace/noonan-growth/noonan_combined_chart.png', dpi=150, bbox_inches='tight') plt.close() print("Combined chart saved.") print("All done.") EOF
| Parameter | Value | Percentile (Normal Reference) |
|---|---|---|
| Height | 127 cm | ~3rd percentile |
| Weight | 26 kg | ~3rd percentile |
noonan height chart
Image · PNG
noonan weight chart
Image · PNG
noonan combined chart
Image · PNG
Draw for 5 Year old, lactate deficiency
lactase deficiency 5 year old child height weight growth impact percentile
python3 << 'EOF' import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import numpy as np from matplotlib.lines import Line2D import os os.makedirs('/tmp/workspace/noonan-growth', exist_ok=True) ages = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]) # Height percentiles (cm) – Boys height = { 'P3': [47.5, 72.0, 82.5, 89.5, 96.0, 101.5, 107.0, 111.5, 116.0, 120.5, 125.0, 129.5, 134.5, 140.0, 148.0, 158.0, 163.0, 165.5, 166.0], 'P10': [49.0, 73.5, 84.5, 92.0, 98.5, 104.5, 110.5, 115.5, 120.5, 125.0, 130.0, 134.5, 139.5, 146.0, 154.5, 163.0, 168.0, 170.0, 170.5], 'P25': [50.0, 75.5, 87.0, 94.5, 101.5, 107.5, 113.5, 119.0, 124.0, 129.0, 134.5, 139.0, 145.0, 152.0, 161.0, 168.5, 173.0, 175.0, 176.0], 'P50': [51.5, 77.5, 89.5, 97.5, 104.5, 111.0, 117.0, 122.5, 128.0, 133.5, 139.0, 144.5, 150.5, 158.5, 167.5, 174.5, 178.5, 180.5, 181.5], 'P75': [53.0, 79.5, 92.0, 100.5, 107.5, 114.5, 120.5, 126.5, 132.0, 138.0, 143.5, 150.0, 156.5, 165.0, 173.5, 180.0, 184.0, 186.0, 187.0], 'P90': [54.5, 81.0, 94.0, 103.0, 110.5, 117.5, 124.0, 130.0, 136.5, 142.5, 148.0, 155.0, 162.5, 171.0, 179.5, 185.5, 188.5, 190.5, 191.5], 'P97': [56.0, 83.0, 96.5, 105.5, 113.5, 120.5, 127.5, 134.5, 141.0, 147.5, 153.0, 160.5, 168.0, 177.5, 185.5, 191.0, 194.0, 195.5, 196.0], } # Weight percentiles (kg) – Boys weight = { 'P3': [2.5, 8.8, 10.5, 12.5, 14.0, 15.5, 17.0, 18.5, 20.5, 22.5, 25.0, 28.0, 31.5, 36.0, 42.0, 48.5, 54.0, 57.5, 59.5], 'P10': [2.8, 9.2, 11.0, 13.0, 14.7, 16.5, 18.5, 20.0, 22.5, 25.0, 28.0, 31.5, 36.0, 41.0, 48.0, 55.0, 61.0, 65.0, 67.0], 'P25': [3.1, 9.9, 11.8, 14.0, 16.0, 18.0, 20.0, 22.0, 25.0, 28.0, 31.5, 36.0, 41.0, 47.0, 55.5, 63.0, 69.0, 73.5, 76.0], 'P50': [3.5, 10.5, 12.7, 15.0, 17.5, 19.5, 22.0, 25.0, 28.0, 31.5, 36.0, 41.0, 47.5, 55.5, 64.0, 72.0, 78.5, 83.0, 85.5], 'P75': [3.9, 11.5, 13.9, 16.3, 19.0, 21.5, 24.5, 27.5, 31.5, 36.0, 40.5, 47.0, 55.0, 64.5, 73.5, 81.5, 88.0, 92.5, 95.0], 'P90': [4.3, 12.3, 15.0, 17.8, 20.5, 23.5, 27.0, 31.0, 36.0, 41.0, 46.5, 54.5, 63.5, 74.0, 83.5, 91.5, 97.5, 102.0, 105.0], 'P97': [4.7, 13.5, 16.5, 19.5, 22.5, 26.5, 31.0, 35.5, 41.5, 47.5, 54.0, 63.0, 73.5, 85.5, 96.0, 104.0, 110.0, 114.5, 118.0], } colors = { 'P3': '#d62728', 'P10': '#ff7f0e', 'P25': '#2ca02c', 'P50': '#1f77b4', 'P75': '#9467bd', 'P90': '#8c564b', 'P97': '#e377c2', } # ───────────────────────────────────────────────────────────── # LACTASE DEFICIENCY – 5-year-old boy # # Lactase deficiency (primary or congenital) causes chronic # osmotic diarrhea → malabsorption → inadequate caloric/nutrient # intake → predominantly WEIGHT faltering; height is secondarily # affected only in prolonged/severe cases. # # Clinical picture at age 5 with moderate-severe lactase deficiency: # - Weight: falls to ~5th-10th percentile (~16 kg) due to # chronic caloric loss and reduced intake (pain avoidance) # - Height: relatively preserved or mildly affected # (~25th percentile, ~107 cm) – height is buffered longer # → Classic "weight < height" disproportion of malabsorption # # Reference: Nelson's Textbook of Pediatrics, Kliegman et al.; # ESPGHAN guidelines on lactose malabsorption in children. # ───────────────────────────────────────────────────────────── age_pt = 5 ht_pt = 105.5 # cm – 10th percentile zone (height relatively spared) wt_pt = 15.5 # kg – 3rd percentile (weight most affected) # ───────────────────────────────────────────────────────────── # COMBINED FIGURE # ───────────────────────────────────────────────────────────── fig, axes = plt.subplots(1, 2, figsize=(22, 10)) fig.patch.set_facecolor('#f5f5ee') fig.suptitle( "Boys Height and Weight Chart (0 – 18 Years)\n" "Lactase Deficiency – 5-Year-Old Boy Plotted ★", fontsize=15, fontweight='bold', y=1.01 ) # ── HEIGHT subplot ────────────────────────────────────────── ax1 = axes[0] ax1.set_facecolor('#fafaf5') for p, vals in height.items(): ax1.plot(ages, vals, color=colors[p], linewidth=1.6, alpha=0.82) ax1.annotate(p, xy=(18, vals[-1]), fontsize=7.5, color=colors[p], va='center', fontweight='bold') ax1.set_xticks(range(0, 19)) ax1.set_yticks(range(40, 205, 5)) ax1.grid(True, linestyle='--', alpha=0.35, color='gray') ax1.set_xlim(-0.3, 18.8) ax1.set_ylim(40, 200) ax1.set_xlabel('Age (Years)', fontsize=12, fontweight='bold', labelpad=8) ax1.set_ylabel('Height (cm)', fontsize=12, fontweight='bold', labelpad=8) ax1.set_title('Height-for-Age', fontsize=12, fontweight='bold', pad=10) # shade between 3rd and 10th to show "affected zone" ax1.fill_between(ages, [height['P3'][i] for i in range(len(ages))], [height['P10'][i] for i in range(len(ages))], color='#ff7f0e', alpha=0.10, label='Low zone (P3–P10)') # plot point ax1.scatter(age_pt, ht_pt, s=280, color='#1a6fbd', zorder=9, edgecolors='black', linewidths=1.6, marker='*') ax1.annotate( f'Lactase Deficiency\n5 yr old boy\nHeight: {ht_pt} cm\n(≈ 10th %ile)\n[Relatively spared]', xy=(age_pt, ht_pt), xytext=(age_pt + 2, ht_pt - 18), fontsize=8.5, color='#003d80', fontweight='bold', arrowprops=dict(arrowstyle='->', color='#1a6fbd', lw=1.6), bbox=dict(boxstyle='round,pad=0.45', facecolor='#e8f4ff', edgecolor='#1a6fbd', alpha=0.95) ) ax1.plot([age_pt]*2, [40, ht_pt], color='#1a6fbd', linestyle=':', linewidth=1.2, alpha=0.7) ax1.plot([-0.3, age_pt], [ht_pt]*2, color='#1a6fbd', linestyle=':', linewidth=1.2, alpha=0.7) legend_lines1 = [Line2D([0],[0], color=colors[p], lw=2, label=p) for p in colors] legend_lines1.append(Line2D([0],[0], marker='*', color='w', markerfacecolor='#1a6fbd', markeredgecolor='black', markersize=12, label='Lactase Def. (5yr)')) ax1.legend(handles=legend_lines1, loc='upper left', fontsize=7.5, framealpha=0.92, title='Percentiles', title_fontsize=8) # ── WEIGHT subplot ────────────────────────────────────────── ax2 = axes[1] ax2.set_facecolor('#fafaf5') for p, vals in weight.items(): ax2.plot(ages, vals, color=colors[p], linewidth=1.6, alpha=0.82) ax2.annotate(p, xy=(18, vals[-1]), fontsize=7.5, color=colors[p], va='center', fontweight='bold') ax2.set_xticks(range(0, 19)) ax2.set_yticks(range(0, 125, 5)) ax2.grid(True, linestyle='--', alpha=0.35, color='gray') ax2.set_xlim(-0.3, 18.8) ax2.set_ylim(0, 120) ax2.set_xlabel('Age (Years)', fontsize=12, fontweight='bold', labelpad=8) ax2.set_ylabel('Weight (kg)', fontsize=12, fontweight='bold', labelpad=8) ax2.set_title('Weight-for-Age', fontsize=12, fontweight='bold', pad=10) # shade below 3rd percentile to show severe zone ax2.fill_between(ages, [0]*len(ages), [weight['P3'][i] for i in range(len(ages))], color='#d62728', alpha=0.08, label='Below P3') ax2.scatter(age_pt, wt_pt, s=280, color='#d62728', zorder=9, edgecolors='black', linewidths=1.6, marker='*') ax2.annotate( f'Lactase Deficiency\n5 yr old boy\nWeight: {wt_pt} kg\n(≈ 3rd %ile)\n[Most affected]', xy=(age_pt, wt_pt), xytext=(age_pt + 2.5, wt_pt + 12), fontsize=8.5, color='#8b0000', fontweight='bold', arrowprops=dict(arrowstyle='->', color='#d62728', lw=1.6), bbox=dict(boxstyle='round,pad=0.45', facecolor='#fff0f0', edgecolor='#d62728', alpha=0.95) ) ax2.plot([age_pt]*2, [0, wt_pt], color='#d62728', linestyle=':', linewidth=1.2, alpha=0.7) ax2.plot([-0.3, age_pt], [wt_pt]*2, color='#d62728', linestyle=':', linewidth=1.2, alpha=0.7) legend_lines2 = [Line2D([0],[0], color=colors[p], lw=2, label=p) for p in colors] legend_lines2.append(Line2D([0],[0], marker='*', color='w', markerfacecolor='#d62728', markeredgecolor='black', markersize=12, label='Lactase Def. (5yr)')) ax2.legend(handles=legend_lines2, loc='upper left', fontsize=7.5, framealpha=0.92, title='Percentiles', title_fontsize=8) # ── Annotation box explaining pattern ── fig.text(0.5, -0.04, "Clinical Note: In lactase deficiency, chronic osmotic diarrhea causes predominantly WEIGHT faltering (3rd %ile or below),\n" "while HEIGHT is relatively preserved (~10th %ile). This 'weight < height' disproportion is the classic pattern of malabsorption.\n" "Unlike Noonan syndrome, both curves are symmetrically shifted down. Catch-up growth occurs with lactose-free diet.", ha='center', fontsize=9.5, style='italic', color='#333333', bbox=dict(boxstyle='round,pad=0.5', facecolor='#fffbe6', edgecolor='#ccaa00', alpha=0.9) ) plt.tight_layout() plt.savefig('/tmp/workspace/noonan-growth/lactase_deficiency_chart.png', dpi=150, bbox_inches='tight') plt.close() print("Lactase deficiency combined chart saved.") EOF
lactase deficiency chart
Image · PNG
| Parameter | Value | Percentile | Why |
|---|---|---|---|
| Height | 105.5 cm | ~10th %ile | Relatively spared (blue star) |
| Weight | 15.5 kg | ~3rd %ile | Most affected (red star) |
Tell curve for weight 0 to 5 Year
python3 << 'EOF' import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import matplotlib.patches as mpatches import numpy as np from matplotlib.lines import Line2D import os os.makedirs('/tmp/workspace/noonan-growth', exist_ok=True) # ───────────────────────────────────────────────────────────── # WHO Weight-for-Age data (Boys) 0–60 months # Values in kg at each month (selected key months) # Source: WHO Child Growth Standards 2006 # ───────────────────────────────────────────────────────────── # Months: 0,1,2,3,4,5,6,7,8,9,10,11,12,15,18,21,24, # 27,30,33,36,39,42,45,48,51,54,57,60 months = np.array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60 ]) # WHO 2006 – Boys weight (kg) – key percentiles wt = { 'P3 (-2SD)': [2.5, 3.4, 4.3, 5.0, 5.6, 6.1, 6.4, 6.7, 7.0, 7.2, 7.5, 7.7, 7.8, 8.3, 8.8, 9.2, 9.7, 10.1, 10.5, 10.8, 11.1, 11.4, 11.7, 12.0, 12.3, 12.6, 12.9, 13.2, 13.5], 'P10': [2.7, 3.6, 4.6, 5.4, 6.0, 6.5, 6.9, 7.2, 7.5, 7.8, 8.0, 8.2, 8.4, 8.9, 9.5, 9.9, 10.4, 10.9, 11.3, 11.7, 12.0, 12.3, 12.7, 13.0, 13.3, 13.7, 14.0, 14.3, 14.6], 'P25': [2.9, 3.9, 4.9, 5.7, 6.4, 6.9, 7.3, 7.6, 8.0, 8.2, 8.5, 8.7, 9.0, 9.5, 10.1, 10.6, 11.1, 11.6, 12.0, 12.5, 12.8, 13.2, 13.6, 13.9, 14.3, 14.7, 15.1, 15.4, 15.8], 'P50 (Median)':[3.3, 4.3, 5.3, 6.1, 6.7, 7.3, 7.7, 8.1, 8.5, 8.7, 9.0, 9.2, 9.5, 10.2, 10.8, 11.3, 11.9, 12.4, 12.9, 13.3, 13.7, 14.1, 14.5, 15.0, 15.4, 15.8, 16.2, 16.6, 17.0], 'P75': [3.7, 4.8, 5.9, 6.8, 7.5, 8.0, 8.5, 8.9, 9.3, 9.6, 9.9, 10.1, 10.4, 11.1, 11.8, 12.4, 13.0, 13.6, 14.1, 14.6, 15.1, 15.6, 16.1, 16.6, 17.1, 17.6, 18.0, 18.5, 19.0], 'P90': [4.1, 5.3, 6.4, 7.3, 8.1, 8.7, 9.2, 9.6, 10.0, 10.4, 10.7, 10.9, 11.2, 12.0, 12.8, 13.4, 14.1, 14.7, 15.3, 15.9, 16.4, 16.9, 17.5, 18.0, 18.6, 19.1, 19.6, 20.2, 20.8], 'P97 (+2SD)': [4.5, 5.8, 7.0, 8.0, 8.8, 9.5, 10.0, 10.5, 10.9, 11.3, 11.6, 11.9, 12.2, 13.1, 13.9, 14.6, 15.3, 16.0, 16.7, 17.3, 17.9, 18.5, 19.1, 19.8, 20.4, 21.0, 21.7, 22.3, 23.0], } colors = { 'P3 (-2SD)': '#e41a1c', 'P10': '#ff7f00', 'P25': '#4daf4a', 'P50 (Median)': '#377eb8', 'P75': '#984ea3', 'P90': '#a65628', 'P97 (+2SD)': '#f781bf', } lw = { 'P3 (-2SD)': 1.4, 'P10': 1.4, 'P25': 1.4, 'P50 (Median)': 2.4, # bold median 'P75': 1.4, 'P90': 1.4, 'P97 (+2SD)': 1.4, } # ───────────────────────────────────────────────────────────── # Milestone markers on the MEDIAN curve # Birth wt ~3.3 kg → ×2 at ~5 mo (6.7 kg) → ×3 at 12 mo (9.5 kg) # ×4 at ~24 mo (~12 kg), age 5 ≈ 17 kg (50th %ile) # ───────────────────────────────────────────────────────────── median = wt['P50 (Median)'] milestones = { 0: (3.3, "Birth\n3.3 kg"), 5: (7.3, "×2 birth wt\n~5 months"), 12: (9.5, "×3 birth wt\n12 months"), 25: (median[17], "×4 birth wt\n~2 years"), 60: (17.0, "~17 kg\n5 years"), } # index mapping: months list to index month_to_idx = {m: i for i, m in enumerate(months)} # ───────────────────────────────────────────────────────────── # FIGURE # ───────────────────────────────────────────────────────────── fig, ax = plt.subplots(figsize=(16, 10)) ax.set_facecolor('#fafaf8') fig.patch.set_facecolor('#f0f0e8') # Fill zones ax.fill_between(months, wt['P3 (-2SD)'], wt['P10'], color='#e41a1c', alpha=0.07, label='_') ax.fill_between(months, wt['P10'], wt['P25'], color='#ff7f00', alpha=0.07, label='_') ax.fill_between(months, wt['P25'], wt['P75'], color='#4daf4a', alpha=0.07, label='_') ax.fill_between(months, wt['P75'], wt['P90'], color='#984ea3', alpha=0.07, label='_') ax.fill_between(months, wt['P90'], wt['P97 (+2SD)'], color='#f781bf', alpha=0.07, label='_') # Percentile curves for p, vals in wt.items(): ax.plot(months, vals, color=colors[p], linewidth=lw[p], alpha=0.9, zorder=3, linestyle='--' if p in ['P3 (-2SD)', 'P97 (+2SD)'] else '-') # right-side labels ax.annotate(p, xy=(61, vals[-1]), fontsize=8, color=colors[p], va='center', fontweight='bold' if 'Median' in p else 'normal') # ── Milestone markers on median ────────────────────────────── milestone_months = [0, 5, 12, 27, 60] milestone_weights = [3.3, 7.3, 9.5, 13.7, 17.0] milestone_labels = ["Birth weight\n3.3 kg", "Doubles birth wt\n~5 months (7.3 kg)", "Triples birth wt\n12 months (9.5 kg)", "Quadruples birth wt\n~2 years (13.7 kg)", "5 years\n~17 kg"] offsets = [(-3, 1.5), (2, 1.5), (1, 1.8), (2, 1.5), (-3, 1.8)] for i, (mo, wkg, lbl) in enumerate(zip(milestone_months, milestone_weights, milestone_labels)): ax.scatter(mo, wkg, s=130, color='#377eb8', zorder=8, edgecolors='black', linewidths=1.2, marker='D') dx, dy = offsets[i] ax.annotate(lbl, xy=(mo, wkg), xytext=(mo + dx*1.5, wkg + dy), fontsize=7.5, color='#003366', fontweight='bold', arrowprops=dict(arrowstyle='->', color='#377eb8', lw=1.2), bbox=dict(boxstyle='round,pad=0.3', facecolor='#e8f4ff', edgecolor='#377eb8', alpha=0.9), zorder=9) # ── X-axis: dual label – months and years ─────────────────── # Primary tick: every 3 months ax.set_xticks([0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60]) ax.set_xticklabels([str(m) for m in [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60]], fontsize=8) ax.set_xlabel('Age (Months)', fontsize=12, fontweight='bold', labelpad=6) # Secondary x-axis: years ax2 = ax.twiny() ax2.set_xlim(ax.get_xlim()) ax2.set_xticks([0, 12, 24, 36, 48, 60]) ax2.set_xticklabels(['Birth', '1 yr', '2 yr', '3 yr', '4 yr', '5 yr'], fontsize=10, fontweight='bold', color='#444444') ax2.set_xlabel('Age (Years)', fontsize=12, fontweight='bold', labelpad=8, color='#444444') ax.set_yticks(range(0, 26, 1)) ax.set_ylim(0, 25) ax.set_xlim(-1, 62) ax.set_ylabel('Weight (kg)', fontsize=12, fontweight='bold', labelpad=8) ax.grid(True, linestyle='--', alpha=0.30, color='gray', zorder=1) ax.set_title("WHO Weight-for-Age Chart – Boys 0 to 5 Years\n" "with Key Growth Milestones on the Median Curve", fontsize=14, fontweight='bold', pad=16) # ── Legend ─────────────────────────────────────────────────── legend_lines = [] for p in wt: ls = '--' if p in ['P3 (-2SD)', 'P97 (+2SD)'] else '-' lw_v = 2.4 if 'Median' in p else 1.4 legend_lines.append(Line2D([0],[0], color=colors[p], linewidth=lw_v, linestyle=ls, label=p)) legend_lines.append(Line2D([0],[0], marker='D', color='w', markerfacecolor='#377eb8', markeredgecolor='black', markersize=9, label='Growth milestone')) ax.legend(handles=legend_lines, loc='upper left', fontsize=8.5, framealpha=0.93, title='WHO Percentiles (Boys)', title_fontsize=9, ncol=1) # ── Inset: velocity box ────────────────────────────────────── textbox = ( "Weight Gain Velocity (Boys):\n" "• 0–3 months : ~25–35 g/day\n" "• 3–6 months : ~15–20 g/day\n" "• 6–12 months: ~10–15 g/day\n" "• 1–3 years : ~200–250 g/month\n" "• 3–5 years : ~150–200 g/month" ) ax.text(0.735, 0.32, textbox, transform=ax.transAxes, fontsize=8.5, verticalalignment='top', bbox=dict(boxstyle='round,pad=0.55', facecolor='#fffbe6', edgecolor='#ccaa00', alpha=0.95)) plt.tight_layout() plt.savefig('/tmp/workspace/noonan-growth/weight_0_to_5_years.png', dpi=150, bbox_inches='tight') plt.close() print("Chart saved.") EOF
weight 0 to 5 years
Image · PNG
| Age | Weight | Rule |
|---|---|---|
| Birth | 3.3 kg | Birth weight |
| ~5 months | 7.3 kg | Doubles birth weight |
| 12 months | 9.5 kg | Triples birth weight |
| ~2 years | 13.7 kg | Quadruples birth weight |
| 5 years | ~17 kg | ~5× birth weight |
| Period | Daily Gain |
|---|---|
| 0–3 months | 25–35 g/day |
| 3–6 months | 15–20 g/day |
| 6–12 months | 10–15 g/day |
| 1–3 years | ~200–250 g/month |
| 3–5 years | ~150–200 g/month |
Tell for weight curve , 5 Year old, with lactate deficiency, for 0, 1, 2, 3, 4 and 5 Year, how curve look like, draw
python3 << 'EOF' import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import numpy as np from matplotlib.lines import Line2D from matplotlib.patches import FancyArrowPatch import os os.makedirs('/tmp/workspace/noonan-growth', exist_ok=True) # ───────────────────────────────────────────────────────────── # WHO Weight-for-Age Boys 0–60 months (selected points) # ───────────────────────────────────────────────────────────── months = np.array([0,1,2,3,4,5,6,7,8,9,10,11,12, 15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60]) wt = { 'P3': [2.5,3.4,4.3,5.0,5.6,6.1,6.4,6.7,7.0,7.2,7.5,7.7,7.8, 8.3,8.8,9.2,9.7,10.1,10.5,10.8,11.1,11.4,11.7,12.0,12.3,12.6,12.9,13.2,13.5], 'P10': [2.7,3.6,4.6,5.4,6.0,6.5,6.9,7.2,7.5,7.8,8.0,8.2,8.4, 8.9,9.5,9.9,10.4,10.9,11.3,11.7,12.0,12.3,12.7,13.0,13.3,13.7,14.0,14.3,14.6], 'P25': [2.9,3.9,4.9,5.7,6.4,6.9,7.3,7.6,8.0,8.2,8.5,8.7,9.0, 9.5,10.1,10.6,11.1,11.6,12.0,12.5,12.8,13.2,13.6,13.9,14.3,14.7,15.1,15.4,15.8], 'P50': [3.3,4.3,5.3,6.1,6.7,7.3,7.7,8.1,8.5,8.7,9.0,9.2,9.5, 10.2,10.8,11.3,11.9,12.4,12.9,13.3,13.7,14.1,14.5,15.0,15.4,15.8,16.2,16.6,17.0], 'P75': [3.7,4.8,5.9,6.8,7.5,8.0,8.5,8.9,9.3,9.6,9.9,10.1,10.4, 11.1,11.8,12.4,13.0,13.6,14.1,14.6,15.1,15.6,16.1,16.6,17.1,17.6,18.0,18.5,19.0], 'P90': [4.1,5.3,6.4,7.3,8.1,8.7,9.2,9.6,10.0,10.4,10.7,10.9,11.2, 12.0,12.8,13.4,14.1,14.7,15.3,15.9,16.4,16.9,17.5,18.0,18.6,19.1,19.6,20.2,20.8], 'P97': [4.5,5.8,7.0,8.0,8.8,9.5,10.0,10.5,10.9,11.3,11.6,11.9,12.2, 13.1,13.9,14.6,15.3,16.0,16.7,17.3,17.9,18.5,19.1,19.8,20.4,21.0,21.7,22.3,23.0], } # Year labels → month positions year_months = [0, 12, 24, 36, 48, 60] year_labels = ['0\n(Birth)', '1 yr', '2 yr', '3 yr', '4 yr', '5 yr'] # ───────────────────────────────────────────────────────────── # LACTASE DEFICIENCY WEIGHT CURVE # # PATHOPHYSIOLOGY & TIMELINE: # ─ Primary lactase deficiency (lactase non-persistence): # Lactase activity normal at birth (breast milk tolerated). # Enzyme activity starts declining after weaning (~6–12 months). # Symptoms manifest when dairy foods are introduced in toddler # diet (typically after 12–18 months). # # ─ Congenital lactase deficiency (rare, autosomal recessive): # Severe from birth – watery diarrhea from first feed. # Weight gain impaired from Day 1. # # We plot the COMMON PRIMARY type: # 0–12 mo → normal (follows P50 – breast-fed, no symptoms) # 12–24 mo → starts faltering (dairy introduced, P50 → P25) # 24–36 mo → progressive faltering (P25 → P10) # 36–48 mo → marked faltering / plateau (P10 → P3) # 48–60 mo → below P3 / crossing centiles downward # # ALSO overlay CONGENITAL type (rare) – impaired from birth # ───────────────────────────────────────────────────────────── # --- PRIMARY lactase deficiency --- # Key measured points at each year primary_pts = { 0: 3.3, # normal birth weight (P50) 12: 9.5, # 12 months – still normal (P50) 24: 11.5, # 24 months – mild faltering (~P25, expected ~11.9) 36: 12.5, # 36 months – moderate (~P10, expected ~13.7) 48: 13.8, # 48 months – marked (<P10, expected ~15.4) 60: 15.5, # 60 months – severe (~P3, expected ~17.0) } # Smooth interpolation for plotting primary_months = np.array(sorted(primary_pts.keys())) primary_wts = np.array([primary_pts[m] for m in primary_months]) # Cubic spline for smooth curve from scipy.interpolate import CubicSpline cs_primary = CubicSpline(primary_months, primary_wts) smooth_m = np.linspace(0, 60, 300) smooth_primary = cs_primary(smooth_m) # --- CONGENITAL lactase deficiency (severe from birth) --- congenital_pts = { 0: 2.8, # low birth wt / immediate failure 12: 7.0, # 12 months – well below P3 (~7.8) 24: 9.0, # 24 months – below P3 (~9.7) 36: 10.5, # 36 months – severely below P3 (~11.1) 48: 11.8, # 48 months – severely below P3 (~12.3) 60: 13.0, # 60 months – severely below P3 (~13.5) } cong_months = np.array(sorted(congenital_pts.keys())) cong_wts = np.array([congenital_pts[m] for m in cong_months]) cs_cong = CubicSpline(cong_months, cong_wts) smooth_cong = cs_cong(smooth_m) # ───────────────────────────────────────────────────────────── # FIGURE # ───────────────────────────────────────────────────────────── fig, ax = plt.subplots(figsize=(17, 11)) ax.set_facecolor('#fafaf8') fig.patch.set_facecolor('#f0f0e8') # ── Background percentile shading ── ax.fill_between(months, wt['P3'], wt['P10'], color='#e41a1c', alpha=0.06) ax.fill_between(months, wt['P10'], wt['P25'], color='#ff9900', alpha=0.06) ax.fill_between(months, wt['P25'], wt['P75'], color='#4daf4a', alpha=0.07) ax.fill_between(months, wt['P75'], wt['P90'], color='#984ea3', alpha=0.06) ax.fill_between(months, wt['P90'], wt['P97'], color='#f781bf', alpha=0.06) # ── Percentile reference curves (thin, grey-ish) ── pct_colors = { 'P3': '#cc0000', 'P10': '#e07000', 'P25': '#339900', 'P50': '#1155cc', 'P75': '#7733aa', 'P90': '#885522', 'P97': '#cc44aa' } for p, vals in wt.items(): lw_ = 2.2 if p == 'P50' else 1.2 ls_ = '--' if p in ['P3', 'P97'] else '-' ax.plot(months, vals, color=pct_colors[p], linewidth=lw_, linestyle=ls_, alpha=0.55, zorder=2) ax.annotate(p, xy=(61.5, vals[-1]), fontsize=8, color=pct_colors[p], va='center', fontweight='bold' if p == 'P50' else 'normal') # ── CONGENITAL curve (dark red dashed) ── ax.plot(smooth_m, smooth_cong, color='#8B0000', linewidth=2.5, linestyle='-.', zorder=6, label='Congenital lactase deficiency') ax.scatter(cong_months, cong_wts, s=100, color='#8B0000', zorder=7, edgecolors='black', linewidths=1.0, marker='s') # ── PRIMARY curve (bold blue → red gradient visual) ── ax.plot(smooth_m, smooth_primary, color='#e63600', linewidth=3.2, linestyle='-', zorder=7, label='Primary lactase deficiency') ax.scatter(primary_months, primary_wts, s=160, color='#e63600', zorder=8, edgecolors='black', linewidths=1.3, marker='o') # ── Annotations at each year for PRIMARY ── annot = { 0: ("Birth: 3.3 kg\n(P50 – Normal)", (4, 0.9), 'left'), 12: ("12 mo: 9.5 kg\n(P50 – Still normal,\nbreast-fed)", (3, 1.0), 'left'), 24: ("2 yr: 11.5 kg\n(P25 – Dairy intro,\nmild faltering)", (2, 1.2), 'left'), 36: ("3 yr: 12.5 kg\n(P10 – Diarrhea\n+ poor intake)", (2, 1.0), 'left'), 48: ("4 yr: 13.8 kg\n(<P10 – Progressive\ncentile crossing)", (1.5, 1.2), 'left'), 60: ("5 yr: 15.5 kg\n(≈P3 – Significant\nweight faltering)", (-12, 1.5), 'right'), } for mo, (lbl, (dx, dy), ha) in annot.items(): wkg = primary_pts[mo] ax.annotate(lbl, xy=(mo, wkg), xytext=(mo + dx, wkg + dy), fontsize=8, color='#8B0000', fontweight='bold', ha=ha, arrowprops=dict(arrowstyle='->', color='#cc2200', lw=1.2), bbox=dict(boxstyle='round,pad=0.35', facecolor='#fff5f0', edgecolor='#e63600', alpha=0.93), zorder=10) # ── Congenital label ── ax.annotate("Congenital type\n(severe from birth)\n2 yr: 9 kg (<P3)", xy=(24, 9.0), xytext=(28, 7.5), fontsize=8, color='#8B0000', fontweight='bold', arrowprops=dict(arrowstyle='->', color='#8B0000', lw=1.2), bbox=dict(boxstyle='round,pad=0.35', facecolor='#ffe8e8', edgecolor='#8B0000', alpha=0.93), zorder=10) # ── Vertical phase dividers ── phase_dividers = [12, 24] phase_labels = [ (6, "Normal growth\n(breast-fed,\nlactase adequate)", '#006600'), (18, "Faltering begins\n(weaning → dairy\nintroduced)", '#cc6600'), (42, "Progressive centile\ncrossing\n(chronic diarrhea)", '#cc0000'), ] for xv in phase_dividers: ax.axvline(xv, color='#999999', linewidth=1.0, linestyle=':', alpha=0.7, zorder=1) for (xc, lbl, col) in phase_labels: ax.text(xc, 23.5, lbl, fontsize=8, color=col, ha='center', va='top', fontweight='bold', bbox=dict(boxstyle='round,pad=0.3', facecolor='white', edgecolor=col, alpha=0.85)) # ── Axes ── ax.set_xticks([0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60]) ax.set_xticklabels([str(m) for m in [0,3,6,9,12,15,18,21,24,27,30,33, 36,39,42,45,48,51,54,57,60]], fontsize=8) ax.set_xlabel('Age (Months)', fontsize=12, fontweight='bold', labelpad=6) # Top axis: years ax2 = ax.twiny() ax2.set_xlim(ax.get_xlim()) ax2.set_xticks(year_months) ax2.set_xticklabels(year_labels, fontsize=11, fontweight='bold', color='#222222') ax2.set_xlabel('Age (Years)', fontsize=12, fontweight='bold', labelpad=8) ax.set_yticks(np.arange(0, 26, 1)) ax.set_ylim(0, 25) ax.set_xlim(-1, 63) ax.set_ylabel('Weight (kg)', fontsize=12, fontweight='bold', labelpad=8) ax.grid(True, linestyle='--', alpha=0.28, color='gray', zorder=1) ax.set_title( "WHO Weight-for-Age – Boys 0 to 5 Years\n" "Lactase Deficiency: How the Weight Curve Diverges from Normal", fontsize=14, fontweight='bold', pad=16 ) # ── Legend ── legend_elements = [ Line2D([0],[0], color='#1155cc', lw=2.2, label='P50 – Normal median'), Line2D([0],[0], color='#cc0000', lw=1.2, ls='--', label='P3 (lower boundary)'), Line2D([0],[0], color='#e63600', lw=3.2, label='Primary lactase deficiency'), Line2D([0],[0], color='#8B0000', lw=2.5, ls='-.', label='Congenital lactase deficiency'), Line2D([0],[0], marker='o', color='w', markerfacecolor='#e63600', markeredgecolor='black', markersize=9, label='Measured point (primary)'), Line2D([0],[0], marker='s', color='w', markerfacecolor='#8B0000', markeredgecolor='black', markersize=9, label='Measured point (congenital)'), ] ax.legend(handles=legend_elements, loc='upper left', fontsize=9, framealpha=0.95, title='Curve Key', title_fontsize=9.5) # ── Clinical key box ── clinical_text = ( "Clinical Pearl – Lactase Deficiency Growth Pattern:\n" "• Primary type: Normal curve 0–12 mo → faltering after dairy intro (12–24 mo)\n" "• Curve crosses percentiles DOWNWARD (weight falls from P50 → P3 by age 5)\n" "• Congenital type (rare): impaired from birth – always below P3\n" "• Key feature: weight affected >> height (malabsorption pattern)\n" "• With lactose-free diet: CATCH-UP weight gain expected within weeks" ) ax.text(0.01, 0.33, clinical_text, transform=ax.transAxes, fontsize=8.5, verticalalignment='top', color='#1a1a1a', bbox=dict(boxstyle='round,pad=0.55', facecolor='#fffbe6', edgecolor='#ccaa00', alpha=0.95)) plt.tight_layout() plt.savefig('/tmp/workspace/noonan-growth/lactase_weight_0to5.png', dpi=150, bbox_inches='tight') plt.close() print("Done.") EOF
lactase weight 0to5
Image · PNG
| Age | Weight | Percentile | What's happening |
|---|---|---|---|
| Birth (0) | 3.3 kg | P50 – Normal | Lactase is present at birth; breast milk tolerated perfectly |
| 1 year | 9.5 kg | P50 – Normal | Still largely breast-fed; no symptoms yet |
| 2 years | 11.5 kg | ~P25 – Mild faltering | Dairy foods introduced after weaning → diarrhea begins |
| 3 years | 12.5 kg | ~P10 – Moderate | Chronic osmotic diarrhea → caloric losses |
| 4 years | 13.8 kg | <P10 – Marked | Progressive centile crossing downward |
| 5 years | 15.5 kg | ≈P3 – Significant | Well below expected; malabsorption established |