<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://jsxgraph.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Andrewbaker</id>
	<title>JSXGraph Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://jsxgraph.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Andrewbaker"/>
	<link rel="alternate" type="text/html" href="https://jsxgraph.org/wiki/index.php?title=Special:Contributions/Andrewbaker"/>
	<updated>2026-04-05T21:59:29Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://jsxgraph.org/wiki/index.php?title=Talk:Animated_age_pyramid&amp;diff=7053</id>
		<title>Talk:Animated age pyramid</title>
		<link rel="alternate" type="text/html" href="https://jsxgraph.org/wiki/index.php?title=Talk:Animated_age_pyramid&amp;diff=7053"/>
		<updated>2020-11-17T21:07:02Z</updated>

		<summary type="html">&lt;p&gt;Andrewbaker: Added note about broken Destatis link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I removed the following link, because it results in a 404 page now:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
A much more elaborate version programmed by destatis can be seen [http://www.destatis.de/jetspeed/portal/cms/Sites/destatis/Internet/DE/Content/Statistiken/Bevoelkerung/VorausberechnungBevoelkerung/InteraktiveDarstellung/InteraktiveDarstellung,templateId=renderPrint.psml on their webpage].&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Perhaps a German speaker could track down the new URL, if the animation is still available.&lt;/div&gt;</summary>
		<author><name>Andrewbaker</name></author>
	</entry>
	<entry>
		<id>https://jsxgraph.org/wiki/index.php?title=Animated_age_pyramid&amp;diff=7052</id>
		<title>Animated age pyramid</title>
		<link rel="alternate" type="text/html" href="https://jsxgraph.org/wiki/index.php?title=Animated_age_pyramid&amp;diff=7052"/>
		<updated>2020-11-17T21:02:36Z</updated>

		<summary type="html">&lt;p&gt;Andrewbaker: Removed the link to the Destatis version, as it was leading to a 404 page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/ajax/ageV1W1EJ.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
This animation shows data from the 12th coordinated Population Projection from the &amp;quot;[http://destatis.de Statistisches Bundesamt (destatis)]&amp;quot;.&lt;br /&gt;
&amp;lt;jsxgraph width=&amp;quot;500&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;&lt;br /&gt;
var i, t = &#039;&#039;, brd;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Read the data from the JavaScript file, which was converted &amp;quot;by hand&amp;quot; from the csv file.&lt;br /&gt;
 */&lt;br /&gt;
function readFile(dataArr) {&lt;br /&gt;
    var len = dataArr.length, &lt;br /&gt;
        i, male, female, y,&lt;br /&gt;
        data = [];&lt;br /&gt;
    for (i=len-1;i&amp;gt;=0;i--) {&lt;br /&gt;
        if (i%3==2) {&lt;br /&gt;
            dataArr.splice(i,1);&lt;br /&gt;
        } else {&lt;br /&gt;
            if (i%3==1) {&lt;br /&gt;
                female = dataArr[i][3].replace(/ /g,&#039;&#039;)*1;&lt;br /&gt;
            } else if (i%3==0) {&lt;br /&gt;
                y = dataArr[i][0]*1;&lt;br /&gt;
                male = dataArr[i][3].replace(/ /g,&#039;&#039;)*1;&lt;br /&gt;
                data.push([y,male,female]);&lt;br /&gt;
            } &lt;br /&gt;
            dataArr[i].splice(0,4); // year,&#039;&#039;,m/w,no,&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    data.reverse();&lt;br /&gt;
    ages = JXG.Math.transpose(dataArr);&lt;br /&gt;
    return {matrix:ages, total: data};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
brd = JXG.JSXGraph.initBoard(&#039;jxgbox&#039;, {boundingbox:[-850,110,850,-20],axis:false});&lt;br /&gt;
var slide = brd.create(&#039;slider&#039;,[[-700,-5],[300,-5],[2009,2009,2060]],{name:&#039;year&#039;,snapWidth:1});&lt;br /&gt;
&lt;br /&gt;
function createCurves(stat,brd, c1, c2) {&lt;br /&gt;
    var i, m = [], w = [],&lt;br /&gt;
        op = 1,&lt;br /&gt;
        off = 80,&lt;br /&gt;
        len = stat.matrix.length;&lt;br /&gt;
    for (i=0;i&amp;lt;len;i++) {&lt;br /&gt;
        m[i] = brd.create(&#039;curve&#039;,[[0],[0]],&lt;br /&gt;
                {fillColor:c1,strokeColor:c1,&lt;br /&gt;
                strokeOpacity:op,fillOpacity:op,&lt;br /&gt;
                strokeWidth:1,&lt;br /&gt;
                highlightFillColor:&#039;yellow&#039;,highlightStrokeColor:&#039;yellow&#039;});&lt;br /&gt;
                &lt;br /&gt;
        m[i].updateDataArray = (function(xArr, y) { return function() {&lt;br /&gt;
                this.dataX = [-off,-off-xArr[2*(slide.Value()-slide._smin)]*1,-off-xArr[2*(slide.Value()-slide._smin)]*1,-off,-off];&lt;br /&gt;
                this.dataY = [y,y,y+1,y+1,y];&lt;br /&gt;
            }; })(stat.matrix[i], i);       &lt;br /&gt;
        JXG.addEvent(m[i].rendNode, &#039;mouseover&#039;, &lt;br /&gt;
            (function(g,d){ return function(){&lt;br /&gt;
                                g.highlight(); w[g._number].highlight(); setText(g._number);&lt;br /&gt;
                            };})(m[i]), m[i]);&lt;br /&gt;
        JXG.addEvent(m[i].rendNode, &#039;mouseout&#039;, &lt;br /&gt;
            (function(g){ return function(){&lt;br /&gt;
                                g.noHighlight(); w[g._number].noHighlight(); &lt;br /&gt;
                            };})(m[i]), m[i]);&lt;br /&gt;
        m[i].hasPoint = function(){return false;};&lt;br /&gt;
        m[i]._number = i;&lt;br /&gt;
    &lt;br /&gt;
        w[i] = brd.create(&#039;curve&#039;,[[0],[0]],&lt;br /&gt;
                {fillColor:c2,strokeColor:c2,&lt;br /&gt;
                strokeWidth:1,&lt;br /&gt;
                strokeOpacity:op,fillOpacity:op,&lt;br /&gt;
                highlightFillColor:&#039;yellow&#039;,highlightStrokeColor:&#039;yellow&#039;});&lt;br /&gt;
        w[i].updateDataArray = (function(xArr, y) { return function() {&lt;br /&gt;
                this.dataX = [off,off+xArr[2*(slide.Value()-slide._smin)+1]*1,off+xArr[2*(slide.Value()-slide._smin)+1]*1,off,off];&lt;br /&gt;
                this.dataY = [y,y,y+1,y+1,y];&lt;br /&gt;
            }; }    )(stat.matrix[i], i);&lt;br /&gt;
        JXG.addEvent(w[i].rendNode, &#039;mouseover&#039;, &lt;br /&gt;
            (function(g,d){ return function(){&lt;br /&gt;
                                g.highlight(); m[g._number].highlight(); setText(g._number);&lt;br /&gt;
                            };})(w[i]), w[i]);&lt;br /&gt;
        JXG.addEvent(w[i].rendNode, &#039;mouseout&#039;,  &lt;br /&gt;
            (function(g){ return function(){&lt;br /&gt;
                                g.noHighlight(); m[g._number].noHighlight();&lt;br /&gt;
                            };})(w[i]), w[i]);&lt;br /&gt;
        w[i].hasPoint = function(){return false;};&lt;br /&gt;
        w[i]._number = i;&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
    var t = brd.create(&#039;turtle&#039;,[],{strokeColor:&#039;#999999&#039;, highlightStrokeColor:&#039;#999999&#039;}); t.ht().pu().rt(90);&lt;br /&gt;
    for (i=0;i&amp;lt;=90;i+=10) { &lt;br /&gt;
        t.moveTo([-750,i]).penDown().forward(750-off+10).penUp();&lt;br /&gt;
        t.moveTo([off-10,i]).penDown().forward(750-off+10).penUp();&lt;br /&gt;
        brd.create(&#039;text&#039;,[-15,i,i.toFixed(0)]);&lt;br /&gt;
    }&lt;br /&gt;
    return [m,w];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var stat1 = readFile(dataV1W1EJ);&lt;br /&gt;
brd.suspendUpdate();&lt;br /&gt;
createCurves(stat1,brd,&#039;#658cb2&#039;,&#039;#b23f8c&#039;);&lt;br /&gt;
brd.create(&#039;text&#039;,[-300,45,&#039;men&#039;],{strokeColor:&#039;white&#039;,fontSize:20});&lt;br /&gt;
brd.create(&#039;text&#039;,[200,45,&#039;women&#039;],{strokeColor:&#039;white&#039;,fontSize:20});&lt;br /&gt;
&lt;br /&gt;
function setText(n) {&lt;br /&gt;
    var age = n,&lt;br /&gt;
        male = ages[n][2*(slide.Value()-slide._smin)]*1,&lt;br /&gt;
        female = ages[n][2*(slide.Value()-slide._smin)+1]*1;&lt;br /&gt;
    textout.innerHTML = &#039;age:&#039;+age+&lt;br /&gt;
                        &#039;, born in &#039;+(slide.Value()-age)+&lt;br /&gt;
                        &#039;&amp;lt;br&amp;gt; male:&#039;+male+&lt;br /&gt;
                        &#039;, female:&#039;+female+&lt;br /&gt;
                        &#039;, together:&#039;+(male+female)+&lt;br /&gt;
                        &#039; (thousand)&amp;lt;br&amp;gt; ratio w/m:&#039;+(female/male).toFixed(2);&lt;br /&gt;
};&lt;br /&gt;
function setTextYear() {&lt;br /&gt;
    var n = slide.Value()-slide._smin,&lt;br /&gt;
        data = stat1.total;&lt;br /&gt;
    textout2.innerHTML = &#039;Year:&#039;+data[n][0]+&lt;br /&gt;
                        &#039;&amp;lt;br&amp;gt; male:&#039;+data[n][1]+&lt;br /&gt;
                        &#039;, female:&#039;+data[n][2]+&lt;br /&gt;
                        &#039;, together:&#039;+(data[n][1]+data[n][2])+&lt;br /&gt;
                        &#039; (million)&amp;lt;br&amp;gt; ratio w/m:&#039;+(data[n][2]/data[n][1]).toFixed(3);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var animate = null;&lt;br /&gt;
function sliderAnimation() {&lt;br /&gt;
    var s = slide._smin,&lt;br /&gt;
        e = slide._smax,&lt;br /&gt;
        sdiff = e-s,&lt;br /&gt;
        newval = slide.Value()+2;&lt;br /&gt;
    slide.position = (newval-s)/sdiff;&lt;br /&gt;
    if (slide.position&amp;gt;1.0) slide.position = 0.0;&lt;br /&gt;
    brd.update();&lt;br /&gt;
    animate = setTimeout(sliderAnimation,500);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function player(){&lt;br /&gt;
    if (!animate) {&lt;br /&gt;
        document.getElementById(&#039;playbutton&#039;).value = &#039; stop animation &#039;;&lt;br /&gt;
        sliderAnimation();&lt;br /&gt;
    } else {&lt;br /&gt;
        document.getElementById(&#039;playbutton&#039;).value = &#039; play animation &#039;;&lt;br /&gt;
        clearTimeout(animate);&lt;br /&gt;
        animate = null;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/jsxgraph&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;playbutton&amp;quot; value=&amp;quot; play animation &amp;quot; onClick=&amp;quot;player();&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;output2&amp;quot; style=&amp;quot;padding:20px; background-color:#bbbbbb; width:500px; font-family:Arial,Helvetica&amp;quot;&amp;gt;&amp;amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;output&amp;quot; style=&amp;quot;padding:20px; background-color:#dddddd; width:500px; font-family:Arial,Helvetica&amp;quot;&amp;gt; &amp;amp;nbsp;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;debug&amp;quot; style=&amp;quot;display:block;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var textout = document.getElementById(&#039;output&#039;);&lt;br /&gt;
    var textout2 = document.getElementById(&#039;output2&#039;);&lt;br /&gt;
    var animate = null;&lt;br /&gt;
    brd.addHook(setTextYear);&lt;br /&gt;
    brd.unsuspendUpdate();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===How to create this animation===&lt;br /&gt;
* Download the data from [https://www-ec.destatis.de/csp/shop/sfg/bpm.html.cms.cBroker.cls?CSPCHD=0080000100004517mg7C0000001aNX9fOZSV45NMNmJCrMrg--&amp;amp;cmspath=struktur,vollanzeige.csp&amp;amp;ID=1024891 destatis.de]&lt;br /&gt;
* Save the table which should be displayed as csv file.&lt;br /&gt;
* Transform the csv file into a JavaScript file containing a 2 dimensional array:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
dataV1W1EJ = [[&amp;quot;2009&amp;quot;,&amp;quot; &amp;quot;,&amp;quot;m&amp;quot;,&amp;quot; 40 070 &amp;quot;,&amp;quot;  341 &amp;quot;,&amp;quot;  350 &amp;quot;,&amp;quot;  353 &amp;quot;,&amp;quot;  348 &amp;quot;,...,&amp;quot;  2 &amp;quot;],&lt;br /&gt;
[&amp;quot;    &amp;quot;,&amp;quot; &amp;quot;,&amp;quot;w&amp;quot;,&amp;quot; 41 665 &amp;quot;,&amp;quot;  323 &amp;quot;,&amp;quot;  333 &amp;quot;,&amp;quot;  335 &amp;quot;,&amp;quot;  329 &amp;quot;,...,&amp;quot;  12 &amp;quot;],&lt;br /&gt;
[&amp;quot;    &amp;quot;,&amp;quot; &amp;quot;,&amp;quot;i&amp;quot;,&amp;quot; 81 735 &amp;quot;,&amp;quot;  663 &amp;quot;,&amp;quot;  683 &amp;quot;,&amp;quot;  688 &amp;quot;,&amp;quot;  677 &amp;quot;,...,&amp;quot;  13 &amp;quot;],&lt;br /&gt;
[&amp;quot;2010&amp;quot;,&amp;quot; &amp;quot;,&amp;quot;m&amp;quot;,&amp;quot; 39 987 &amp;quot;,&amp;quot;  339 &amp;quot;,&amp;quot;  341 &amp;quot;,&amp;quot;  350 &amp;quot;,&amp;quot;  353 &amp;quot;,...,&amp;quot;  2 &amp;quot;],&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
[&amp;quot; &amp;quot;,&amp;quot; &amp;quot;,&amp;quot;i&amp;quot;,&amp;quot; 64 651 &amp;quot;,&amp;quot;  465 &amp;quot;,&amp;quot;  470 &amp;quot;,&amp;quot;  476 &amp;quot;,&amp;quot;  481 &amp;quot;,...,&amp;quot;  169 &amp;quot;]];&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Every third row labeled by &#039;i&#039; in the third column will be deleted later on.&lt;br /&gt;
* Now read the data&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
function readFile(dataArr) {&lt;br /&gt;
    var len = dataArr.length, &lt;br /&gt;
        i, male, female, y,&lt;br /&gt;
        data = [];&lt;br /&gt;
    for (i=len-1;i&amp;gt;=0;i--) {&lt;br /&gt;
        if (i%3==2) {&lt;br /&gt;
            dataArr.splice(i,1);&lt;br /&gt;
        } else {&lt;br /&gt;
            if (i%3==1) {&lt;br /&gt;
                female = dataArr[i][3].replace(/ /g,&#039;&#039;)*1;&lt;br /&gt;
            } else if (i%3==0) {&lt;br /&gt;
                y = dataArr[i][0]*1;&lt;br /&gt;
                male = dataArr[i][3].replace(/ /g,&#039;&#039;)*1;&lt;br /&gt;
                data.push([y,male,female]);&lt;br /&gt;
            } &lt;br /&gt;
            dataArr[i].splice(0,4); // year,&#039;&#039;,m/w,no,&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    data.reverse();&lt;br /&gt;
    ages = JXG.Math.transpose(dataArr);&lt;br /&gt;
    return {matrix:ages, total: data};&lt;br /&gt;
};&lt;br /&gt;
var stat1 = readFile(dataV1W1EJ);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
* Create the filled rectangles (men, women)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
brd = JXG.JSXGraph.initBoard(&#039;jxgbox&#039;, {boundingbox:[-850,110,850,-10],axis:false});&lt;br /&gt;
createCurves(stat1,brd,&#039;#658cb2&#039;,&#039;#b23f8c&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===The complete JavaScript code===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;/ajax/ageV1W1EJ.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;jsxgraph width=&amp;quot;500&amp;quot; height=&amp;quot;500&amp;quot;&amp;gt;&lt;br /&gt;
brd = JXG.JSXGraph.initBoard(&#039;jxgbox&#039;, {boundingbox:[-850,110,850,-20],axis:false});&lt;br /&gt;
var slide = brd.create(&#039;slider&#039;,[[-700,-5],[300,-5],[2009,2009,2060]],{name:&#039;year&#039;,snapWidth:1});&lt;br /&gt;
&lt;br /&gt;
function createCurves(stat,brd, c1, c2) {&lt;br /&gt;
    var i, m = [], w = [],&lt;br /&gt;
        op = 1,&lt;br /&gt;
        off = 80,&lt;br /&gt;
        len = stat.matrix.length;&lt;br /&gt;
    for (i=0;i&amp;lt;len;i++) {&lt;br /&gt;
        m[i] = brd.create(&#039;curve&#039;,[[0],[0]],&lt;br /&gt;
                {fillColor:c1,strokeColor:c1,&lt;br /&gt;
                strokeOpacity:op,fillOpacity:op,&lt;br /&gt;
                strokeWidth:1,&lt;br /&gt;
                highlightFillColor:&#039;yellow&#039;,highlightStrokeColor:&#039;yellow&#039;});&lt;br /&gt;
                &lt;br /&gt;
        m[i].updateDataArray = (function(xArr, y) { return function() {&lt;br /&gt;
                this.dataX = [-off,-off-xArr[2*(slide.Value()-slide._smin)]*1,-off-xArr[2*(slide.Value()-slide._smin)]*1,-off,-off];&lt;br /&gt;
                this.dataY = [y,y,y+1,y+1,y];&lt;br /&gt;
            }; })(stat.matrix[i], i);&lt;br /&gt;
            &lt;br /&gt;
        JXG.addEvent(m[i].rendNode, &#039;mouseover&#039;, &lt;br /&gt;
            (function(g,d){ return function(){&lt;br /&gt;
                                g.highlight(); w[g._number].highlight(); setText(g._number);&lt;br /&gt;
                            };})(m[i]), m[i]);&lt;br /&gt;
        JXG.addEvent(m[i].rendNode, &#039;mouseout&#039;, &lt;br /&gt;
            (function(g){ return function(){&lt;br /&gt;
                                g.noHighlight(); w[g._number].noHighlight(); &lt;br /&gt;
                            };})(m[i]), m[i]);&lt;br /&gt;
        m[i].hasPoint = function(){return false;};&lt;br /&gt;
        m[i]._number = i;&lt;br /&gt;
    &lt;br /&gt;
        w[i] = brd.create(&#039;curve&#039;,[[0],[0]],&lt;br /&gt;
                {fillColor:c2,strokeColor:c2,&lt;br /&gt;
                strokeWidth:1,&lt;br /&gt;
                strokeOpacity:op,fillOpacity:op,&lt;br /&gt;
                highlightFillColor:&#039;yellow&#039;,highlightStrokeColor:&#039;yellow&#039;});&lt;br /&gt;
        w[i].updateDataArray = (function(xArr, y) { return function() {&lt;br /&gt;
                this.dataX = [off,off+xArr[2*(slide.Value()-slide._smin)+1]*1,off+xArr[2*(slide.Value()-slide._smin)+1]*1,off,off];&lt;br /&gt;
                this.dataY = [y,y,y+1,y+1,y];&lt;br /&gt;
            }; }    )(stat.matrix[i], i);&lt;br /&gt;
        JXG.addEvent(w[i].rendNode, &#039;mouseover&#039;, &lt;br /&gt;
            (function(g,d){ return function(){&lt;br /&gt;
                                g.highlight(); m[g._number].highlight(); setText(g._number);&lt;br /&gt;
                            };})(w[i]), w[i]);&lt;br /&gt;
        JXG.addEvent(w[i].rendNode, &#039;mouseout&#039;,  &lt;br /&gt;
            (function(g){ return function(){&lt;br /&gt;
                                g.noHighlight(); m[g._number].noHighlight();&lt;br /&gt;
                            };})(w[i]), w[i]);&lt;br /&gt;
        w[i].hasPoint = function(){return false;};&lt;br /&gt;
        w[i]._number = i;&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
    var t = brd.create(&#039;turtle&#039;,[],{strokeColor:&#039;#999999&#039;, highlightStrokeColor:&#039;#999999&#039;}); t.ht().pu().rt(90);&lt;br /&gt;
    for (i=0;i&amp;lt;=90;i+=10) { &lt;br /&gt;
        t.moveTo([-750,i]).penDown().forward(750-off+10).penUp();&lt;br /&gt;
        t.moveTo([off-10,i]).penDown().forward(750-off+10).penUp();&lt;br /&gt;
        brd.create(&#039;text&#039;,[-15,i,i.toFixed(0)]);&lt;br /&gt;
    }&lt;br /&gt;
    return [m,w];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var stat1 = readFile(dataV1W1EJ);&lt;br /&gt;
brd.suspendUpdate();&lt;br /&gt;
createCurves(stat1,brd,&#039;#658cb2&#039;,&#039;#b23f8c&#039;);&lt;br /&gt;
brd.create(&#039;text&#039;,[-300,45,&#039;men&#039;],{strokeColor:&#039;white&#039;,fontSize:20});&lt;br /&gt;
brd.create(&#039;text&#039;,[200,45,&#039;women&#039;],{strokeColor:&#039;white&#039;,fontSize:20});&lt;br /&gt;
&lt;br /&gt;
function setText(n) {&lt;br /&gt;
    var age = n,&lt;br /&gt;
        male = ages[n][2*(slide.Value()-slide._smin)]*1,&lt;br /&gt;
        female = ages[n][2*(slide.Value()-slide._smin)+1]*1;&lt;br /&gt;
    textout.innerHTML = &#039;age:&#039;+age+&lt;br /&gt;
                        &#039;, born in &#039;+(slide.Value()-age)+&lt;br /&gt;
                        &#039;&amp;lt;br&amp;gt; male:&#039;+male+&lt;br /&gt;
                        &#039;, female:&#039;+female+&lt;br /&gt;
                        &#039;, together:&#039;+(male+female)+&lt;br /&gt;
                        &#039; (thousand)&amp;lt;br&amp;gt; ratio w/m:&#039;+(female/male).toFixed(2);&lt;br /&gt;
};&lt;br /&gt;
function setTextYear() {&lt;br /&gt;
    var n = slide.Value()-slide._smin,&lt;br /&gt;
        data = stat1.total;&lt;br /&gt;
    textout2.innerHTML = &#039;Year:&#039;+data[n][0]+&lt;br /&gt;
                        &#039;&amp;lt;br&amp;gt; male:&#039;+data[n][1]+&lt;br /&gt;
                        &#039;, female:&#039;+data[n][2]+&lt;br /&gt;
                        &#039;, together:&#039;+(data[n][1]+data[n][2])+&lt;br /&gt;
                        &#039; (million)&amp;lt;br&amp;gt; ratio w/m:&#039;+(data[n][2]/data[n][1]).toFixed(3);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var animate = null;&lt;br /&gt;
function sliderAnimation() {&lt;br /&gt;
    var s = slide._smin,&lt;br /&gt;
        e = slide._smax,&lt;br /&gt;
        sdiff = e-s,&lt;br /&gt;
        newval = slide.Value()+2;&lt;br /&gt;
    slide.position = (newval-s)/sdiff;&lt;br /&gt;
    if (slide.position&amp;gt;1.0) slide.position = 0.0;&lt;br /&gt;
    brd.update();&lt;br /&gt;
    animate = setTimeout(sliderAnimation,500);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function player(){&lt;br /&gt;
    if (!animate) {&lt;br /&gt;
        document.getElementById(&#039;playbutton&#039;).value = &#039; stop animation &#039;;&lt;br /&gt;
        sliderAnimation();&lt;br /&gt;
    } else {&lt;br /&gt;
        document.getElementById(&#039;playbutton&#039;).value = &#039; play animation &#039;;&lt;br /&gt;
        clearTimeout(animate);&lt;br /&gt;
        animate = null;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/jsxgraph&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;form&amp;gt;&amp;lt;select id=&amp;quot;years&amp;quot; onChange=&amp;quot;changeYear()&amp;quot;&amp;gt;&amp;lt;/select&amp;gt;&lt;br /&gt;
&amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;playbutton&amp;quot; value=&amp;quot;play&amp;quot; onClick=&amp;quot;player();&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;output2&amp;quot; style=&amp;quot;padding:20px; background-color:#bbbbbb; width:500px; font-family:Arial,Helvetica&amp;quot;&amp;gt;&amp;amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;output&amp;quot; style=&amp;quot;padding:20px; background-color:#dddddd; width:500px; font-family:Arial,Helvetica&amp;quot;&amp;gt; &amp;amp;nbsp;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var textout = document.getElementById(&#039;output&#039;);&lt;br /&gt;
    var textout2 = document.getElementById(&#039;output2&#039;);&lt;br /&gt;
    var animate = null;&lt;br /&gt;
    brd.addHook(setTextYear);&lt;br /&gt;
    brd.unsuspendUpdate();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Examples]]&lt;br /&gt;
[[Category:Charts]]&lt;/div&gt;</summary>
		<author><name>Andrewbaker</name></author>
	</entry>
	<entry>
		<id>https://jsxgraph.org/wiki/index.php?title=Aligning_text&amp;diff=7051</id>
		<title>Aligning text</title>
		<link rel="alternate" type="text/html" href="https://jsxgraph.org/wiki/index.php?title=Aligning_text&amp;diff=7051"/>
		<updated>2020-11-16T18:20:49Z</updated>

		<summary type="html">&lt;p&gt;Andrewbaker: Changed code style from italics to monospace font&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;br /&gt;
.mytext {&lt;br /&gt;
   border: 1px solid black;&lt;br /&gt;
   padding:2px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
Texts can be aligned with the attributes &amp;lt;code&amp;gt;anchorX&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;anchorY&amp;lt;/code&amp;gt;. Possible values for &amp;lt;code&amp;gt;anchorX&amp;lt;/code&amp;gt; are &amp;lt;code&amp;gt;&#039;left&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;middle&#039;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;&#039;right&#039;&amp;lt;/code&amp;gt;. Possible values for &amp;lt;code&amp;gt;anchorY&amp;lt;/code&amp;gt; are &amp;lt;code&amp;gt;&#039;bottom&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&#039;middle&#039;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;&#039;top&#039;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Text can be rotated if it is declared as &amp;lt;code&amp;gt;display: &#039;internal&#039;&amp;lt;/code&amp;gt;. For SVG this means, instead of an HTML div the SVG text is taken as text node.&lt;br /&gt;
&amp;lt;jsxgraph width=&amp;quot;600&amp;quot; height=&amp;quot;600&amp;quot;&amp;gt;&lt;br /&gt;
    var brd = JXG.JSXGraph.initBoard(&#039;jxgbox&#039;,{boundingbox: [-1,10,7,-1], axis:true, keepaspectratio:false});&lt;br /&gt;
&lt;br /&gt;
    // Vertical line at x=3&lt;br /&gt;
    brd.create(&#039;line&#039;, [-3, 1, 0], {strokeWidth:1, dash:2});  &lt;br /&gt;
    brd.create(&#039;text&#039;, [3, 8, &amp;quot;Default&amp;quot;], {cssClass:&#039;mytext&#039;});&lt;br /&gt;
    brd.create(&#039;text&#039;, [3, 7, &amp;quot;anchorX left&amp;quot;], {anchorX:&#039;left&#039;, cssClass:&#039;mytext&#039;});&lt;br /&gt;
    brd.create(&#039;text&#039;, [3, 6, &amp;quot;anchorX middle&amp;quot;], {anchorX:&#039;middle&#039;, cssClass:&#039;mytext&#039;});&lt;br /&gt;
    brd.create(&#039;text&#039;, [3, 5, &amp;quot;anchorX right&amp;quot;], {anchorX:&#039;right&#039;, cssClass:&#039;mytext&#039;});&lt;br /&gt;
&lt;br /&gt;
    // Horizontal line at y=3&lt;br /&gt;
    brd.create(&#039;line&#039;, [-3, 0, 1], {strokeWidth:1, dash:2});&lt;br /&gt;
    brd.create(&#039;text&#039;, [1, 3, &amp;quot;Multiline text&amp;lt;br&amp;gt;default&amp;quot;], {cssClass:&#039;mytext&#039;});&lt;br /&gt;
    brd.create(&#039;text&#039;, [2.2, 3, &amp;quot;Multiline text&amp;lt;br&amp;gt;anchorY bottom&amp;quot;], {anchorY:&#039;bottom&#039;, cssClass:&#039;mytext&#039;});&lt;br /&gt;
    brd.create(&#039;text&#039;, [3.4, 3, &amp;quot;Multiline text&amp;lt;br&amp;gt;anchorY middle&amp;quot;], {anchorY:&#039;middle&#039;, cssClass:&#039;mytext&#039;});&lt;br /&gt;
    brd.create(&#039;text&#039;, [4.6, 3, &amp;quot;Multiline text&amp;lt;br&amp;gt;anchorY top&amp;quot;], {anchorY:&#039;top&#039;, cssClass:&#039;mytext&#039;});&lt;br /&gt;
&lt;br /&gt;
    // Horizontal line at y=2&lt;br /&gt;
    brd.create(&#039;line&#039;, [-2, 0, 1], {strokeWidth:1, dash:2});  &lt;br /&gt;
    brd.create(&#039;text&#039;, [3, 2, &amp;quot;Multiline text&amp;lt;br&amp;gt;anchorX right&amp;lt;br&amp;gt;anchorY top&amp;quot;], {anchorX:&#039;right&#039;, anchorY:&#039;top&#039;, cssClass:&#039;mytext&#039;});&lt;br /&gt;
&lt;br /&gt;
    brd.create(&#039;text&#039;, [0.0,0.0,&#039;Rotate&#039;], {display:&#039;internal&#039;, rotate:30});&lt;br /&gt;
&amp;lt;/jsxgraph&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===The underlying JavaScript code===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    var brd = JXG.JSXGraph.initBoard(&#039;jxgbox&#039;,{boundingbox: [-1,10,7,-1], axis:true, keepaspectratio:false});&lt;br /&gt;
&lt;br /&gt;
    // Vertical line at x=3&lt;br /&gt;
    brd.create(&#039;line&#039;, [-3, 1, 0], {strokeWidth:1, dash:2});  &lt;br /&gt;
    brd.create(&#039;text&#039;, [3, 8, &amp;quot;Default&amp;quot;], {cssClass:&#039;mytext&#039;});&lt;br /&gt;
    brd.create(&#039;text&#039;, [3, 7, &amp;quot;anchorX left&amp;quot;], {anchorX:&#039;left&#039;, cssClass:&#039;mytext&#039;});&lt;br /&gt;
    brd.create(&#039;text&#039;, [3, 6, &amp;quot;anchorX middle&amp;quot;], {anchorX:&#039;middle&#039;, cssClass:&#039;mytext&#039;});&lt;br /&gt;
    brd.create(&#039;text&#039;, [3, 5, &amp;quot;anchorX right&amp;quot;], {anchorX:&#039;right&#039;, cssClass:&#039;mytext&#039;});&lt;br /&gt;
&lt;br /&gt;
    // Horizontal line at y=2&lt;br /&gt;
    brd.create(&#039;line&#039;, [-2, 0, 1], {strokeWidth:1, dash:2});&lt;br /&gt;
    brd.create(&#039;text&#039;, [1, 2, &amp;quot;Multiline text&amp;lt;br&amp;gt;default&amp;quot;], {cssClass:&#039;mytext&#039;});&lt;br /&gt;
    brd.create(&#039;text&#039;, [2.2, 2, &amp;quot;Multiline text&amp;lt;br&amp;gt;anchorY bottom&amp;quot;], {anchorY:&#039;bottom&#039;, cssClass:&#039;mytext&#039;});&lt;br /&gt;
    brd.create(&#039;text&#039;, [3.4, 2, &amp;quot;Multiline text&amp;lt;br&amp;gt;anchorY middle&amp;quot;], {anchorY:&#039;middle&#039;, cssClass:&#039;mytext&#039;});&lt;br /&gt;
    brd.create(&#039;text&#039;, [4.6, 2, &amp;quot;Multiline text&amp;lt;br&amp;gt;anchorY top&amp;quot;], {anchorY:&#039;top&#039;, cssClass:&#039;mytext&#039;});&lt;br /&gt;
&lt;br /&gt;
    // Horizontal line at y=2&lt;br /&gt;
    brd.create(&#039;line&#039;, [-2, 0, 1], {strokeWidth:1, dash:2});  &lt;br /&gt;
    brd.create(&#039;text&#039;, [3, 2, &amp;quot;Multiline text&amp;lt;br&amp;gt;anchorX right&amp;lt;br&amp;gt;anchorY top&amp;quot;], {anchorX:&#039;right&#039;, anchorY:&#039;top&#039;, cssClass:&#039;mytext&#039;});&lt;br /&gt;
&lt;br /&gt;
    brd.create(&#039;text&#039;, [0.0,0.0,&#039;Rotate&#039;], {display:&#039;internal&#039;, rotate:30});&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Examples]]&lt;br /&gt;
[[Category:Text]]&lt;/div&gt;</summary>
		<author><name>Andrewbaker</name></author>
	</entry>
	<entry>
		<id>https://jsxgraph.org/wiki/index.php?title=Talk:Main_Page&amp;diff=7050</id>
		<title>Talk:Main Page</title>
		<link rel="alternate" type="text/html" href="https://jsxgraph.org/wiki/index.php?title=Talk:Main_Page&amp;diff=7050"/>
		<updated>2020-11-16T18:14:10Z</updated>

		<summary type="html">&lt;p&gt;Andrewbaker: Removed test edit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Andrewbaker</name></author>
	</entry>
	<entry>
		<id>https://jsxgraph.org/wiki/index.php?title=Talk:Main_Page&amp;diff=7049</id>
		<title>Talk:Main Page</title>
		<link rel="alternate" type="text/html" href="https://jsxgraph.org/wiki/index.php?title=Talk:Main_Page&amp;diff=7049"/>
		<updated>2020-11-16T18:13:49Z</updated>

		<summary type="html">&lt;p&gt;Andrewbaker: Testing ability to save changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a test edit.&lt;/div&gt;</summary>
		<author><name>Andrewbaker</name></author>
	</entry>
</feed>