<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Data Visualization on Victor42</title><link>https://victor42.eth.limo/tags/data-visualization/</link><description>Recent content in Data Visualization on Victor42</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>hi@victor42.work (Victor42)</managingEditor><webMaster>hi@victor42.work (Victor42)</webMaster><lastBuildDate>Thu, 03 Aug 2023 14:30:00 +0000</lastBuildDate><atom:link href="https://victor42.eth.limo/tags/data-visualization/index.xml" rel="self" type="application/rss+xml"/><item><title>Creating Custom Child Growth Charts in Excel</title><link>https://victor42.eth.limo/post-en/3641/</link><pubDate>Thu, 03 Aug 2023 14:30:00 +0000</pubDate><author>hi@victor42.work (Victor42)</author><guid>https://victor42.eth.limo/post-en/3641/</guid><description>&lt;img src="https://cdn.victor42.work/posts/2023-08/0b4602d0fa83edea5c83a597832254fa.jpg" alt="Featured image of post Creating Custom Child Growth Charts in Excel" /&gt;&lt;p&gt;This is about how I used Excel, data visualization, AI, statistics, and formulas to create a custom growth chart. I&amp;rsquo;ll explain everything clearly, even the basics.&lt;/p&gt;
&lt;p&gt;Many parents use apps to track their baby&amp;rsquo;s height and weight. I only used that one feature. Installing a large app just for that felt wasteful. It was a perfect chance to use my Excel skills. It&amp;rsquo;s just data analysis, right? Excel can handle it!&lt;/p&gt;
&lt;h2 id="system-planning"&gt;System Planning
&lt;/h2&gt;&lt;p&gt;First, I needed a plan. Let&amp;rsquo;s see how growth curves work in parenting apps.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/4b1f944ddce86b103a4d13f3d87cc292.jpg"
loading="lazy"
alt="Baobaoshu app weight curve page, x-axis shows age from 8 to 14 months, y-axis shows weight kg from 4 to 44, displaying 3%/25%/50%/75%/97% reference lines with green data points near 50% line"
&gt;&lt;/p&gt;
&lt;p&gt;This is a growth curve from Baobaoshu (BabyTree). The 50% line is the median. If my baby&amp;rsquo;s height (or weight) is on this line, about half of babies are taller (or heavier) and half are shorter (or lighter). The 75% and 97% lines mean the height (or weight) exceeds 75% and 97% of babies of the same age. The 25% and 3% lines work similarly. This shows my baby&amp;rsquo;s growth compared to others.&lt;/p&gt;
&lt;p&gt;I wanted a similar tool to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Record my baby&amp;rsquo;s height and weight.&lt;/li&gt;
&lt;li&gt;Query the normal height and weight range for each month.&lt;/li&gt;
&lt;li&gt;Show how much my baby&amp;rsquo;s measurements deviate from the norm.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A chart or curve didn&amp;rsquo;t matter. The key was the third point: calculating and displaying the deviation intuitively. A diverging bar chart seemed suitable:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/51645a0d58eb8f178201bf94e5759ab0.jpg"
loading="lazy"
alt="Diverging bar chart Birth Rate by Years, center shows years 1940-2010, left orange bars show birth rate for mothers aged 20-25, right blue bars show birth rate for mothers aged 30-35"
&gt;&lt;/p&gt;
&lt;p&gt;This chart compares two data sets in the same dimension.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/e448352c2994787d901a185b08c8d234.jpg"
loading="lazy"
alt="R language Diverging Bars example showing mtcars dataset car mileage deviation from average, green Above Average to right, red Below Average to left"
&gt;&lt;/p&gt;
&lt;p&gt;For one data set, it shows direction and distance from a benchmark, often for positive and negative values.&lt;/p&gt;
&lt;p&gt;This was perfect. I&amp;rsquo;d use the median as the benchmark, showing if my daughter&amp;rsquo;s height (or weight) was above or below it. The bar length would show the deviation. To simplify, I used symbols: a minus for below, a plus for above, with more symbols meaning greater deviation. Seeing &amp;ldquo;+++&amp;rdquo; or &amp;ldquo;&amp;mdash;-&amp;rdquo; would signal a need to check her growth trend.&lt;/p&gt;
&lt;h2 id="preparing-the-data"&gt;Preparing the Data
&lt;/h2&gt;&lt;p&gt;With a goal, I started working. First, the first two capabilities:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Record height and weight.&lt;/li&gt;
&lt;li&gt;Query normal ranges.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="babys-growth-data"&gt;Baby&amp;rsquo;s Growth Data
&lt;/h3&gt;&lt;p&gt;My baby&amp;rsquo;s data was in the Baobaoshu app (dates are omitted to protect my daughter&amp;rsquo;s birthday):&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/235b2773b1b549f5fd1e0f7c0109a66e.jpg"
loading="lazy"
alt="Baobaoshu app child growth record list screenshot showing 1yr3mo17d/1yr2mo16d/1yr1d/11mo15d/9mo25d records with height cm/weight kg/head circumference cm data"
&gt;&lt;/p&gt;
&lt;p&gt;Baobaoshu doesn&amp;rsquo;t export data. Manual entry was an option, but there had to be a better way.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/129e9d7d3955d9993665691008c1ed88.jpg"
loading="lazy"
alt="Google Play Store ScreenMaster Screenshot Markup app page, by Blossgraph, 4.5 stars 77.6K reviews, 5M&amp;#43; downloads"
&gt;&lt;/p&gt;
&lt;p&gt;I took screenshots of the records and used an Android app, Screen Master, to stitch them into one long image.&lt;/p&gt;
&lt;p&gt;Then, I used Baimiao OCR (&lt;a class="link" href="https://web.baimiaoapp.com/" target="_blank" rel="noopener"
&gt;https://web.baimiaoapp.com/&lt;/a&gt;) to extract the text:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/406e2e8b96b201bcd2c1dc7f81b6ca28.jpg"
loading="lazy"
alt="Baimiao OCR web page screenshot, left Origin Photo shows Baobaoshu growth record screenshot, right Results shows extracted text with date/height/weight/head circumference data mixed together"
&gt;&lt;/p&gt;
&lt;p&gt;The format was messy, but AI can handle that.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/804e5aee1ef71590beb2ce89bce6c424.jpg"
loading="lazy"
alt="ChatGPT conversation screenshot, user prompt requests converting OCR content to table format with date as index in first column and information in second column separated by spaces"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/8d39c1dc3fbfcf00e004039bbd048a6c.jpg"
loading="lazy"
alt="ChatGPT output table screenshot with Date and Information columns, Information column contains mixed age/weight/height/weight/head circumference data"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/b8eb3273e39b3b1bd4f907e3b3be96ce.jpg"
loading="lazy"
alt="ChatGPT conversation screenshot, user prompt requests changing date column to M/D/YYYY format"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/a9d0f842c04bd04b253d65f8f1859aae.jpg"
loading="lazy"
alt="ChatGPT conversation screenshot, user prompt requests removing age-related text like years/months/days from information column"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/ec608ab8c15ca818cd40b3a43f3efc6b.jpg"
loading="lazy"
alt="ChatGPT conversation screenshot, user prompt requests splitting information column into height/weight/head circumference columns, kg data to weight column, cm data to height column, second cm data to head circumference column"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/288d76243237d4eb503a3277996cf976.jpg"
loading="lazy"
alt="ChatGPT conversation screenshot, user prompt requests moving units to column headers, keeping only numeric values in columns, and removing nutrition supplement notes from head circumference column"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/375eb891054588a05fca2c0829970791.jpg"
loading="lazy"
alt="ChatGPT output cleaned table screenshot with Date/Height cm/Weight kg/Head Circumference cm four columns, date column blurred, numeric columns contain only numbers"
&gt;&lt;/p&gt;
&lt;p&gt;Done! I just copied it to Excel. Day age, month age, and age were automatically calculated by subtracting my daughter&amp;rsquo;s birthday from the recording date.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/46d9b3e18b0c825b6cd33a70f32a6b75.jpg"
loading="lazy"
alt="Excel child growth record table screenshot with Date/Day Age/Month Age/Age/Height cm/Weight kg six columns, date column blurred, day age from 0 to 151, month age from 0 to 5"
&gt;&lt;/p&gt;
&lt;h3 id="normal-range-standards"&gt;Normal Range Standards
&lt;/h3&gt;&lt;p&gt;Reference values are on the National Health Commission&amp;rsquo;s website. The 2022 standard, WS/T 423—2022, is the same source as Baobaoshu:
&lt;a class="link" href="http://www.nhc.gov.cn/fzs/s7848/202211/8b94606198e8457dafb3f8355135f1a3/files/e38068f0a62d4a1eb1bd451414444ec1.pdf" target="_blank" rel="noopener"
&gt;http://www.nhc.gov.cn/fzs/s7848/202211/8b94606198e8457dafb3f8355135f1a3/files/e38068f0a62d4a1eb1bd451414444ec1.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The data was in this format:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/344c3b29e936a24e30101cc5f27f1488.jpg"
loading="lazy"
alt="National Health Commission weight standard deviation table for girls under 7 years, with Age/-3SD/-2SD/-1SD/Median/&amp;#43;1SD/&amp;#43;2SD/&amp;#43;3SD eight columns, from 0 months to 2 years 6 months"
&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll explain this table. We&amp;rsquo;ve covered the median. The key is &amp;ldquo;SD,&amp;rdquo; or Standard Deviation. It&amp;rsquo;s a basic statistical term. First, we need to understand normal distribution. The Health Commission&amp;rsquo;s statistics use a large sample size, measuring many children. Height and weight are random and, with a large enough sample, normally distributed around the average (or median, which is very close). A normal distribution looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/2b2b910f2dd8817ba9f1a621ad78b6f0.jpg"
loading="lazy"
alt="Normal distribution bell curve, x-axis labeled μ-3σ to μ&amp;#43;3σ, y-axis shows probability density, marking 68.26%/95.44%/99.72% three standard deviation interval percentages"
&gt;&lt;/p&gt;
&lt;p&gt;The horizontal axis is height (or weight), and the vertical axis is the number of children. The center dashed line is the median. Most children are near the median. Fewer children are at the extremes.&lt;/p&gt;
&lt;p&gt;Standard deviation is the distance between the dashed lines, which are equally spaced. It&amp;rsquo;s like a ruler for the normal distribution. It tells us the proportion of data within a range. For example, 68% of children are within one standard deviation above and below the median; 95% are within two.&lt;/p&gt;
&lt;p&gt;Standard deviation is a key property of normal distribution. Proportions for 1, 2, and 3 standard deviations are always 68%, 95%, and 99.7%. Knowing the average (or median) and standard deviation lets us find any data point&amp;rsquo;s position.&lt;/p&gt;
&lt;p&gt;I copied the table to Excel and converted all ages to months:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/f3531f73796d53d8ffbdc8780b0177ab.jpg"
loading="lazy"
alt="Excel growth reference table screenshot with Month Age/Weight -3SD to &amp;#43;3SD/Height -3SD to &amp;#43;3SD 17 columns, month age from 0 to 33 listing standard deviation values"
&gt;&lt;/p&gt;
&lt;p&gt;The table shows the median and values at 1, 2, and 3 standard deviations above and below it. This helps me see where my daughter&amp;rsquo;s measurements fall and how much they deviate.&lt;/p&gt;
&lt;h2 id="drawing-the-curve"&gt;Drawing the Curve
&lt;/h2&gt;&lt;p&gt;Now, the hard part: showing how much my baby&amp;rsquo;s measurements deviate from the normal range. This requires real Excel skills.&lt;/p&gt;
&lt;p&gt;I had two tables: my baby&amp;rsquo;s data and the reference ranges. I needed to add deviation columns, query the reference table, calculate the deviation, and show it with plus and minus signs. Minuses would be right-aligned in the left column, and pluses left-aligned in the right, creating a simplified diverging bar chart.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/45fffc7570cacc97388e354a71345ff4.jpg"
loading="lazy"
alt="Excel growth record table screenshot with Date/Day Age/Month Age/Age/Height cm/Height Deviation/Weight kg/Weight Deviation eight columns, deviation columns pending fill"
&gt;&lt;/p&gt;
&lt;h3 id="matching-the-reference-month"&gt;Matching the Reference Month
&lt;/h3&gt;&lt;p&gt;In theory, this is simple: use VLOOKUP to match the month, then nested IFs to compare and output symbols.&lt;/p&gt;
&lt;p&gt;But the National Health Commission table has gaps:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/5c73a637afedb7ab9c0b2aefb5cc7feb.jpg"
loading="lazy"
alt="Excel growth reference table screenshot with red boxes highlighting 24/27/30/33 month age rows, showing data every 3 months after 2 years, creating month age gaps"
&gt;&lt;/p&gt;
&lt;p&gt;From 2 years old, data is provided every 3 months. This is reasonable, as growth slows. But it affects querying. At 25 months, a direct VLOOKUP finds nothing.&lt;/p&gt;
&lt;p&gt;One workaround is to manually complete the reference table, adding missing months and using values from younger months (e.g., using 24-month values for 25 and 26 months).&lt;/p&gt;
&lt;p&gt;But I wanted intelligent matching!&lt;/p&gt;
&lt;p&gt;So, I added a hidden column to find the corresponding reference month for each row.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/301413489ba78fc5a651e39f21d3ae30.jpg"
loading="lazy"
alt="Excel growth record table screenshot with red box highlighting new Reference Month Age column, showing month age 25 matches 24, month age 30 matches 30, implementing downward matching to reference table"
&gt;&lt;/p&gt;
&lt;p&gt;The formula for this column is:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;=IF(ISBLANK(A2),&amp;#34;&amp;#34;,INDEX(&amp;#39;生长对照表&amp;#39;!A$3:A$46,COUNTIFS(&amp;#39;生长对照表&amp;#39;!A$3:A$46,&amp;#34;&amp;lt;=&amp;#34;&amp;amp;C2),0))
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In plain English, the formula checks if the date is blank. If so, the cell is empty. Otherwise, it counts rows in the reference table with months less than or equal to the baby&amp;rsquo;s age, effectively &amp;ldquo;matching down.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Before two years, the baby&amp;rsquo;s age matches the reference age. I tested this; a 25-month record will match the 24-month reference.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/fc8aef6e656e32053bdb2919ec2700b6.jpg"
loading="lazy"
alt="Excel table screenshot showing #REF! error, month age 25 row reference month age shows 24, red box highlights that row, demonstrating formula reference error case"
&gt;&lt;/p&gt;
&lt;h3 id="calculating-deviation"&gt;Calculating Deviation
&lt;/h3&gt;&lt;p&gt;The reference month column handles mismatches, so we can calculate deviations.&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;height below average&amp;rdquo; column formula serves as an example:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;=IF(ISBLANK(F2),&amp;#34;&amp;#34;,IF(F2&amp;gt;VLOOKUP(E2,&amp;#39;生长对照表&amp;#39;!A$3:O$46,12),&amp;#34;&amp;#34;,IF(F2=VLOOKUP(E2,&amp;#39;生长对照表&amp;#39;!A$3:O$46,12),&amp;#34;=&amp;#34;,REPT(&amp;#34;-&amp;#34;,5-RANK(F2,{F2,VLOOKUP(E2,&amp;#39;生长对照表&amp;#39;!A$3:O$46,11),VLOOKUP(E2,&amp;#39;生长对照表&amp;#39;!A$3:O$46,10),VLOOKUP(E2,&amp;#39;生长对照表&amp;#39;!A$3:O$46,9)},1)))))
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Okay, this formula looks insane. Let&amp;rsquo;s break it down, layer by layer, starting from the outside:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layer 1&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;=IF(ISBLANK(F2),&amp;#34;&amp;#34;,IF(F2&amp;gt;VLOOKUP(E2,&amp;#39;生长对照表&amp;#39;!A$3:O$46,12),&amp;#34;&amp;#34;,IF(F2=VLOOKUP(E2,&amp;#39;生长对照表&amp;#39;!A$3:O$46,12),&amp;#34;=&amp;#34;,Layer 2)))
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This part first checks if the height column (F2) is empty. If so, this cell is also empty. Otherwise, it compares F2 with the corresponding median height from the reference table. If F2 is greater than the median, the cell remains blank (as this column only shows negative deviations). If F2 equals the median, it displays &amp;ldquo;=&amp;rdquo;. If F2 is less than the median, the second layer calculates the number of &amp;ldquo;-&amp;rdquo; signs to output.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layer 2&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;REPT(&amp;#34;-&amp;#34;,Layer 3)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I initially planned to use nested IF statements to determine the number of minus signs, but that seemed a bit silly. Here&amp;rsquo;s a simpler approach: The REPT function can repeat a string a specified number of times. Now, the problem is passed to the third layer: calculating the number of minus signs to output.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layer 3&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;5-RANK(F2,{F2,VLOOKUP(E2,&amp;#39;生长对照表&amp;#39;!A$3:O$46,11),VLOOKUP(E2,&amp;#39;生长对照表&amp;#39;!A$3:O$46,10),VLOOKUP(E2,&amp;#39;生长对照表&amp;#39;!A$3:O$46,9)},1)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Here&amp;rsquo;s a hidden gem in Excel: array constants. We often use ranges in formulas, which are implicitly arrays. But did you know you can create arrays manually, like in programming, using curly braces &lt;code&gt;{}&lt;/code&gt;? For instance, &lt;code&gt;{1,2,3,4}&lt;/code&gt; in a formula is the same as:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/9d271467e501fa6968180d9823103a40.jpg"
loading="lazy"
alt="Excel cell auto-fill screenshot, column A shows 0 to 9 number sequence, blue fill handle at bottom-right of A5 cell, demonstrating drag-to-fill feature"
&gt;&lt;/p&gt;
&lt;p&gt;Array constants are far more flexible. You can combine seemingly unrelated data. Just look at what&amp;rsquo;s inside the &lt;code&gt;{}&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{F2,VLOOKUP(E2,&amp;#39;生长对照表&amp;#39;!A$3:O$46,11),VLOOKUP(E2,&amp;#39;生长对照表&amp;#39;!A$3:O$46,10),VLOOKUP(E2,&amp;#39;生长对照表&amp;#39;!A$3:O$46,9)}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/914ce9b22412179eaa9415e224c6d770.jpg"
loading="lazy"
alt="Excel growth reference table screenshot with red box highlighting -3SD/-2SD/-1SD three columns of height data, values from 44.7 to 61 increasing, used for array formula reference"
&gt;&lt;/p&gt;
&lt;p&gt;This array combines my baby&amp;rsquo;s height (F2) with the heights at -1, -2, and -3 standard deviations from the mean.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;RANK(F2,Array,1)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Next, &lt;code&gt;RANK&lt;/code&gt; sorts my baby&amp;rsquo;s height among those four values, ascending. Subtracting the rank from 5 gives the number of minus signs. Why 5? Think it through based on different scenarios, and it&amp;rsquo;ll become clear.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/e71ea17395838cdb234236768730de02.jpg"
loading="lazy"
alt="Excel growth record table screenshot with red boxes highlighting Height Deviation and Weight Deviation columns, showing –/-/=/&amp;#43;/&amp;#43;&amp;#43; symbols indicating deviation degree"
&gt;&lt;/p&gt;
&lt;p&gt;I used a similar approach for the other three deviation columns. It works perfectly. The number of symbols indicates the standard deviation range. 95% of children fall within two standard deviations, so two symbols are fine. All good so far!&lt;/p&gt;
&lt;h3 id="data-visualization"&gt;Data Visualization
&lt;/h3&gt;&lt;p&gt;For data visualization, I need to highlight key data. The plus and minus signs are basic.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t need fancy graphics. To flag outliers, I just replaced the pluses and minuses with distinct symbols and added simple conditional formatting for background colors. That&amp;rsquo;s enough for me.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/c45040a172c150fd67749caeb6549102.jpg"
loading="lazy"
alt="Excel Conditional Formatting Rules Manager screenshot showing conditional formatting rules for Height Deviation and Weight Deviation columns, 3 symbols yellow background, 4 symbols red background"
&gt;&lt;/p&gt;
&lt;p&gt;Three symbols mean the measurements are outside the 95% range – I use yellow. Four symbols mean outside 99.7% – I use red. I manually adjusted a few extreme values for demonstration:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://cdn.victor42.work/posts/2023-08/0b4602d0fa83edea5c83a597832254fa.jpg"
loading="lazy"
alt="Excel growth record table final result screenshot with conditional formatting applied to Height Deviation and Weight Deviation columns, yellow highlights 3 symbols, red highlights 4 symbols, intuitively showing deviation degree"
&gt;&lt;/p&gt;
&lt;h2 id="wrap-up"&gt;Wrap-up
&lt;/h2&gt;&lt;p&gt;Finished! Time to uninstall that parenting app. I happily clicked the &amp;ldquo;x&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;There are many growth trackers, but building my own is uniquely satisfying. I learned about arrays, &lt;code&gt;REPT&lt;/code&gt;, and &lt;code&gt;RANK&lt;/code&gt; on the fly – a great experience. The initial planning was the most interesting. Once started, it took just an hour.&lt;/p&gt;
&lt;p&gt;It shows the power of combining knowledge, tools, and techniques. Improvise, adapt, overcome.&lt;/p&gt;
&lt;p&gt;I should mention I prefer Google Sheets. Replicating this in Excel might require tweaks, but the formulas are similar.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;[2024.1.18 Update]
I&amp;rsquo;ve received requests for the spreadsheet. Converting to Excel had issues: Excel doesn&amp;rsquo;t support array constants as a &lt;code&gt;RANK&lt;/code&gt; range, and you can&amp;rsquo;t reference other cells within them. Doing this in Excel is harder, likely needing many nested &lt;code&gt;IF&lt;/code&gt;s. I recommend Feishu sheets or Google Sheets.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve made boy/girl versions available.&lt;/p&gt;
&lt;p&gt;Boy version:
&lt;a class="link" href="https://my.feishu.cn/wiki/JlMKw1NiBis8yok62BJcbCZ3n2d?from=from_copylink" target="_blank" rel="noopener"
&gt;https://my.feishu.cn/wiki/JlMKw1NiBis8yok62BJcbCZ3n2d?from=from_copylink&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Girl version:
&lt;a class="link" href="https://my.feishu.cn/wiki/RKHuwkXafiS987kLxPIc8jkxnAc?from=from_copylink" target="_blank" rel="noopener"
&gt;https://my.feishu.cn/wiki/RKHuwkXafiS987kLxPIc8jkxnAc?from=from_copylink&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>