attachment
attachment

In these plot a graph for wt and height for a 10 year old child with Noonan syndrome and draw again

analyse_media
Searching the Web

Noonan syndrome height weight 10 year old typical measurements growth chart

Reading File
Running Command

ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && echo "workspace ready"

Running Command

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

All three charts are generated. Here are the results:

Boys Height and Weight Chart - Noonan Syndrome (10-Year-Old Boy)

What was plotted

The chart from your image is a Boys Height and Weight Chart showing percentile curves (3rd through 97th) from 0-18 years. I digitally recreated it and plotted the expected measurements for a 10-year-old boy with Noonan syndrome:
ParameterValuePercentile (Normal Reference)
Height127 cm~3rd percentile
Weight26 kg~3rd percentile

Why these values?

Noonan syndrome causes short stature due to RAS/MAPK pathway mutations (most commonly PTPN11). Growth characteristics include:
  • Mean adult height ~162 cm in males (~2.5 SD below normal)
  • Children typically track at or below the 3rd percentile on standard charts
  • Weight is also reduced, roughly paralleling the height deficit
  • Growth velocity is normal in childhood but puberty is often delayed by 2 years
  • These values match published Noonan-specific growth charts (Witt et al., pedsendo.org)

Download the charts

Height chart only:

noonan height chart

Image · PNG

Weight chart only:

noonan weight chart

Image · PNG

Combined chart (height + weight side by side):

noonan combined chart

Image · PNG


The red star (★) on each chart marks the expected measurement for a 10-year-old Noonan syndrome boy. The dotted red lines show how to read off the age and value from the axes - the standard teaching method for plotting on growth charts.

Draw for 5 Year old, lactate deficiency

Searching the Web

lactase deficiency 5 year old child height weight growth impact percentile

Running Command

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

Here is the chart for a 5-year-old boy with Lactase Deficiency:

lactase deficiency chart

Image · PNG


Values Plotted

ParameterValuePercentileWhy
Height105.5 cm~10th %ileRelatively spared (blue star)
Weight15.5 kg~3rd %ileMost affected (red star)

Key Clinical Pattern - Lactase Deficiency vs. Noonan Syndrome

Lactase deficiency causes a characteristic "weight < height" disproportion - the hallmark of malabsorption:
  • Weight drops first and more severely - chronic osmotic diarrhea causes caloric losses + the child avoids milk (reducing total caloric intake)
  • Height is relatively preserved - linear growth is buffered and only falls in prolonged severe malnutrition
  • This gives a low weight-for-height / low BMI pattern
  • With a lactose-free diet, catch-up growth (especially weight) occurs within weeks to months
This contrasts with Noonan syndrome (previous chart) where both height AND weight fall symmetrically to the 3rd percentile, because the cause is hormonal/genetic - not nutritional.

Tell curve for weight 0 to 5 Year

Running Command

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

Here is the WHO Weight-for-Age chart for boys, 0 to 5 years:

weight 0 to 5 years

Image · PNG


Reading the Weight Curve (Boys 0–5 Years)

Key Growth Milestones on the Median (P50) Curve

AgeWeightRule
Birth3.3 kgBirth weight
~5 months7.3 kgDoubles birth weight
12 months9.5 kgTriples birth weight
~2 years13.7 kgQuadruples birth weight
5 years~17 kg~5× birth weight

Weight Gain Velocity

PeriodDaily Gain
0–3 months25–35 g/day
3–6 months15–20 g/day
6–12 months10–15 g/day
1–3 years~200–250 g/month
3–5 years~150–200 g/month

Shape of the Curve

The curve has a steep early rise (rapid infant weight gain) that gradually flattens - reflecting the physiological deceleration of growth after the first year. The dashed red (P3) and pink (P97) lines are the outer boundaries; children below P3 or above P97 warrant clinical evaluation.

Tell for weight curve , 5 Year old, with lactate deficiency, for 0, 1, 2, 3, 4 and 5 Year, how curve look like, draw

Running Command

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


How the Weight Curve Looks – Lactase Deficiency (0 to 5 Years)

Primary Lactase Deficiency (Common type – red curve)

AgeWeightPercentileWhat's happening
Birth (0)3.3 kgP50 – NormalLactase is present at birth; breast milk tolerated perfectly
1 year9.5 kgP50 – NormalStill largely breast-fed; no symptoms yet
2 years11.5 kg~P25 – Mild falteringDairy foods introduced after weaning → diarrhea begins
3 years12.5 kg~P10 – ModerateChronic osmotic diarrhea → caloric losses
4 years13.8 kg<P10 – MarkedProgressive centile crossing downward
5 years15.5 kg≈P3 – SignificantWell below expected; malabsorption established

Congenital Lactase Deficiency (Rare – dark red dashed curve)

  • Impaired from birth - watery diarrhea from the first feed
  • Always below P3 throughout the entire 0-5 year period
  • More severe trajectory

The Classic Shape

The curve has three phases:
  1. 0-12 months - Rides along P50 normally (green zone on chart)
  2. 12-24 months - Begins to deviate as dairy is introduced (orange zone)
  3. 2-5 years - Steady downward centile crossing, ending near or below P3 (red zone)
This "late-onset centile crossing" pattern - normal early curve that starts falling after 12-18 months - is the hallmark of primary lactase deficiency, and distinguishes it from genetic short stature (which is parallel to the percentiles from birth) and congenital causes (impaired from day one).
This is a shared conversation. Sign in to Orris to start your own chat.