TAChart Tutorial: Stacked BarSeries/fi: what changed
Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.
| Old | New | Line | |
|---|---|---|---|
| 1 | 1 | ## Johdanto | |
| 2 | 2 | ||
| 3 | 3 |  | |
| 4 | 4 | ||
| 5 | 5 | [[TAChart Tutorial: BarSeries/fi|Pylväskuvaajan opetusohjelmassa]] näytettiin, miten luodaan kaavio jossa on vierekkäiset pylväät. Pinotut pylväät ovat toinen suosittu muunnos pylväskaaviosta jossa ryhmitellyt tiedot pinotaan toistensa päälle. Tällä tavoin yksittäiset maksut ja niiden summat voidaan osoittaa samassa kaaviossa. On myös muunnos, jossa kaikkien pylväiden korkeudet normalisoidaan 100%:n (samaan korkeuteen) tämä korostaa suhteellista osuutta [1](http://blog.visual.ly/how-groups-stack-up-when-to-use-grouped-vs-stacked-column-charts/) . | |
| 6 | 6 | ||
| 7 | 7 | Tässä opetusohjelmassa sovelletaan tätä tekniikkaa uuden sukupolven uusiutuvien energialähteiden edistymistä Saksassa vuosien 1990 ja 2012 välillä. Tiedot ovat peräisin [wikipediasta](http://en.wikipedia.org/wiki/Renewable_energy_in_Germany) ja kattavat vesivoiman, tuulivoiman, biomassan, aurinkosähkön ja maalämpöenergian. | |
| 8 | 8 | ||
| 9 | 9 | Pylväskuvaajan [[TAChart documentation|TBarSeries]] lisäksi tässä sivutaan myös [[TAChart documentation|TRandomChartSource]], [[TAChart documentation|TCalculatedChartSource]] ja `TChartStyles` komponentteja. | |
| 10 | 10 | ||
| 11 | 11 | Kuten tavallista, tässä oppaassa oletetaan että tiedetään jo perustiedot Lazaruksesta, Object Pascal ohjelmointikielestä ja ja keskeiset käsitteet TAChart-komponentista jotta voidaan seurata opetusohjelmaa. Jos ei ole koskaan työskennellyt pylväskuvaajien parissa olisi hyvä tarkastella siihen liittyvän opetusohjelma joka selittää [[TAChart Tutorial: BarSeries/fi|vierekkäisten pylväskuvaajien]] käyttöä. Suosittelemme myös [[TAChart documentation|TAChart dokumentaation]] tutkimista. | |
| 12 | 12 | ||
| 13 | 13 | ## Kaavion suunnittelu satunnaisella datalla | |
| 14 | 14 | ||
| 15 | 15 | ### Esivalmistelu | |
| 16 | 16 | ||
| 17 | 17 | Luo uusi projekti. Lisää `TAChart` komponentti ja aseta sen align arvoon `alClient` jolloin se täyttää lomakkeen kokonaan. Ehkä lomakkeen kokoa pitäisi lisätä hieman, mutta tämä voidaan tehdä myöhemmin, kun nähdään datat. | |
| 18 | 18 | ||
| 19 | 19 | Ennen "todellisia tietoja" järjestään ja muotoillaan kaavio sopivaksi. Komponenttimuokkaimella saadaan nopeasti vastaus tehdyistä muutoksista. Nopeana datan lähteenä voidaan käyttää [[TAChart documentation|TRandomChartSource]]-komponenttia. TRandomChartSource vain tuottaa satunnaisia ??tietoja, mutta on erinomainen apulainen optimoida kaavion ulkonäköa ilman että kääntää projektin uudestaan ??ja uudestaan. Tietenkin lopussa, poistamme TRandomChartSource:n ja korvata sen oikealla datalla. | |
| 20 | 20 | ||
| 21 | 21 | Joten, aloitetaan: Lisätään `TBarSeries` (pylväskuvaaja) ja `TRandomChartSource` lomakkeelle ja aseta linkki RandomChartSource pylväskuvaajan `Source` ominaisuuteen. (Jos tarvitset lisätietoja on katso [[TAChart Tutorial: BarSeries/fi|pylväskuvaajan]] opetusohjelmaa ). Valitaan RandomChartSource ja asetetaan `XMin` 1990 ja `XMax` 2012 (joka on alkuperäisten tietojen väli [wikipedian artikkelissa](http://en.wikipedia.org/wiki/Renewable_energy_in_Germany) ). Tämä väli on 23 vuotta, niin asetetaan `PointsNumber` arvoon 23 jotta saadaan pylväs vuosittain. Lopuksi asetetaan YMax on 1 (tai johonkin muuhun arvoon). Nyt pylväskuvaaja ponnahtaa kaavion: | |
| 22 | 22 | ||
| 23 | 23 |  | |
| 24 | 24 | ||
| 25 | 25 | ### Useita y:n arvoja | |
| 26 | 26 | ||
| 27 | 27 | Jos on lukenut toisen [[TAChart Tutorial: BarSeries/fi|pylväskuvaajan opetusohjelman]] voi yllättyä nyt: Siinä opetusohjelmassa käytettiin yhtä kuvaajaa kullekin ryhmälle. Kun lopullinen uusiutuvan energian kaavioon tulee olemaan useita erilaisia pylväitä, yksi kutakin energian lajia. Joten, eikö pitäisi lisätä enemmän kuvaajia? Ei. Tarvitaan vain yksi koska ei voida seurata vierekkäisten pylväskuvaajien strategiaa täällä. Tämä johtuu siitä, `TAChart` ei voi pinota eri kuvaajien pylväitä toistensa päälle. Kukin pylväs on peräisin yhteisestä "nollatasosta" ylös (tai alas) data-arvo - ei ole tapaa siirtää pylväs alkamaan edellisen pylvään päältä. | |
| 28 | 28 | ||
| 29 | 29 | Mitä tehdä? | |
| 30 | 30 | ||
| 31 | 31 | Pinotussa pylväskuvaajalla, `TAChart` tarjoaa erityinen käsite useita y: n arvoja per kuvaajan datapistettä kohti. Jos tutkii käännösyksikön `TACustomSource` lähdekoodia niin löytyy tietue | |
| 32 | 32 | ||
| 33 | 33 | ``` pascal | |
| 34 | 34 | type | |
| 35 | 35 | TChartDataItem = packed record | |
| 36 | 36 | public | |
| 37 | 37 | X, Y: Double; | |
| 38 | 38 | Color: TChartColor; | |
| 39 | 39 | Text: String; | |
| 40 | 40 | YList: TDoubleDynArray; | |
| 41 | 41 | ... | |
| 42 | 42 | end; | |
| 43 | 43 | ``` | |
| 44 | 44 | ||
| 45 | 45 | Tämä on sisäinen rakenne jolla esitetään kuvaajan arvot. Tavanomaisten `x` ja `y` -koordinaattien lisäksi, jotka tiedetään jo muista kaaviotyypeistä ja opetusohjelmista, siellä on myös datakenttä `YList` johon varaudutaan varastoimaan ylimääräisiä y-arvoja. ChartSource:lla on ominaisuus `YCount` jossa määritellään taulukon `YList` pituus - valitse RandomChartSource ja vilkaise sitä komponenttimuokkaimessa. Mutta pitää tietää, että `YCount` sisältää myös vakio y:n arvon, `YList` taulukon pituus on muiden y: n arvojen osalta siis `YCount-1` . | |
| 46 | 46 | ||
| 47 | 47 | Lopullinen kaavio sisältää viisi saraketyypppä ( "vesivoimaa", "tuulivoima", "biomassa", "aurinkosähkö" ja "maalämpö"). Siksi anna `YCount` varten arvo `5`. Tämä pinoaa viisi pylvästä yhteen. | |
| 48 | 48 | ||
| 49 | 49 |  | |
| 50 | 50 | ||
| 51 | 51 | ### ChartStyles:n käyttö | |
| 52 | 52 | ||
| 53 | 53 | Valitettavasti kaikki pylvään osapalkit ovat samanvärisiä. Miten voidaan muuttaa väriä jokaisella tasolla? | |
| 54 | 54 | ||
| 55 | 55 | Komponenttipaletilla löytyy komponentti tähän: **TChartStyles**. `TChartStyle` on komponentti, joka mahdollistaa muokata kunkin pylväskuvaajan ulkoasua (eli "tyyliä") . | |
| 56 | 56 | ||
| 57 | 57 | Mennään komponenttipaletille, etsitään `TChartStyle` -komponentti joka on (todennäköisesti) 9. kuvake (sellainen kuvake jossa värillisten palkkien/pylväiden edessä on pensseli tai harja) ja lisäätään kyseinen komponentti lomakkeelle. | |
| 58 | 58 | ||
| 59 | 59 |  | |
| 60 | 60 | ||
| 61 | 61 | Ensin täytyy yhdistää TBarSeries ja TChartStyles komponentit. Kuvaajassa (TBarSeries) on tätä vastaava ominaisuus `Styles` tähän tarkoitukseen. | |
| 62 | 62 | ||
| 63 | 63 | Valitaan sitten komponentti (TChartStyles) ja mennään sen Styles omaisuuteen komponenttimuokkaimella. Klikkaa "..." kolme pistettä painiketta joka avaa ChartStyles editorin. Tässä voidaan lisätä tyyli kunkin ryhmän palkkeihin klikkaamalla "+" -painiketta viisi kertaa. Vaihtoehtoisesti voit klikata hiirellä `ChartStyles1` puun "Styles" solmun kohtaa ja valita "Lisää kohde". | |
| 64 | 64 | ||
| 65 | 65 |   | |
| 66 | 66 | ||
| 67 | 67 | Komponenttimuokkaimen puussa ChartStyleList:n alta voidaan valita kunkin tyyli ja nähdä tyylin ominaisuudet komponenttimuokkaimessa. `TChartStyle` indeksin 0 kuuluu alimmaisen palkille, indeksi 1 kuuluu seuraavalle palkille jne. Palkin värin muuttaminen onnistuu muuttamalla tyylin `Brush.Color` väriä. Kaavio välittömästi päivittää ja näyttää vastaavan palkin uudella värillä. Toista tämä muissakin tyyleissä. Tutustumalla `TChartStyle` muihin ominaisuuksiin oppii, mitä muuta sillä voidaan tehdä. | |
| 68 | 68 | ||
| 69 | 69 | ### Näytetään ChartStyles otsikkopalkissa | |
| 70 | 70 | ||
| 71 | 71 | Käyttämällä `ChartStyle` ominaisuutta `Text` voit määrittää näytettävä teksti otsikkopalkissa, kullekin palkin tasolle pylväässä. Kirjoita kunkin tyylin `Text` kohtaan vuorotellen "Vesivoima", "tuulivoima", "Biomassa", "Aurinkosähkö" ja "maalämpö" , alkaen indeksistä nolla. | |
| 72 | 72 | ||
| 73 | 73 | Aikaisemmin opitusta jo tiedetään että otsikkopalkki näytetään kun kaavion `Legend.Visible` ominaisuuden arvona on `true`. Se on oletusarvoisesti arvossa `false`. Se kuitenkin näyttää vain yhden merkinnän: punainen ruutu vastaa pylväskuvaajan käyttöä ilman `ChartStyles`. Tämä korjataan valitsemalla BarSeries ja avataan `Legend` solmu komponenttimuokkaimessa. Ominaisuus `Legend.Multiplicity` on edelleen arvossa `lmSingle` joka tuottaa vain yhden kohteen per kuvaaja. Muuta sen sijaan arvoon `lmStyle`. Tämä on oikea asetus, kun kuvaaja käyttää tyylejä. Nyt kaavio lukee kunkin tyylin `Text` arvon ja lisää ne otsikkopalkkiin. | |
| 74 | 74 | ||
| 75 | 75 |  | |
| 76 | 76 | ||
| 77 | 77 | ### Normalisoidaan pinotut pylväät 100% | |
| 78 | 78 | ||
| 79 | 79 | Kehityksen suhteellisen osuuden korostamiseksi pylväsryhmät voidaan pinotuissa pylväskaaviossa normalisoida 100%, eli kukin pylvään palkin arvo korvataan sen prosentuaalinen osuudella pinokorkeudessa. | |
| 80 | 80 | ||
| 81 | 81 | `TAChart` voi tehdä tämän kun hieman muutetaan nykyistä ohjelmaa. Keskeinen asia on tässä käyttää `TCalculatedChartSource`-komponenttia joka poimii tiedot, jotka liittyvät käytössä olevaan chartsource:n ja laskee suhteellisen osuuden. | |
| 82 | 82 | ||
| 83 | 83 | Lisää `TCalculatedChartSource` lomakkeelle. Aseta sen ominaisuus `Origin` osoittamaan RandomChartSource:a. Tämä tarkoittaa, että CalculatedChartSource tuottaa laskelmien tietojen perusteella tietoja kaavioon. On tärkeää, että jättää `AccumulationMethod` sen oletukseen, `camNone` , mikä tarkoittaa sitä, että lähtötiedot johdetaan ulostuloon muuttumattomana. Muut vaihtoehdot yhdistäisi lähtötietoihin arvot uudet arvot: `camAverage`, esimerkiksi aiheuttaisi keskiarvon laskemisen datapisteiden sisällä `AccumulationRange`. Mutta miten saamme prosenttilaskun jos `camNone` ei muuta mitään? Yksinkertaisesti sillä on `Percentage` ominaisuus! Normalisoituminen levitetään laskelmien jälkeen. Aseta `Percentage` arvoon `true` . | |
| 84 | 84 | ||
| 85 | 85 | Kaavion muutosta ei nähdä vielä, koska kuvaaja vielä saa sen tiedot RandomChartSource:sta. Mennään BarSeries ja valitaan `Source` ominaisuuteen CalculatedChartSource. | |
| 86 | 86 | ||
| 87 | 87 | Nyt näyttää tältä! | |
| 88 | 88 | ||
| 89 | 89 |  | |
| 90 | 90 | ||
| 91 | 91 | ## Näytetään todellisia tietoja | |
| 92 | 92 | ||
| 93 | 93 | Nyt kun kaavio on käytännössä lähes viimeistelty niin on aika poistaa satunnainen data ja korvata se "todellisilla arvoilla". Kuten johdannossa todettiin, haluamme näyttää uusiutuvan energian kehittymistä eri vuosina. Tiedot löytyvät [wikipedian](http://en.wikipedia.org/wiki/Renewable_energy_in_Germany) artikkelin lopusta | |
| 94 | 94 | ||
| 95 | 95 | Aluksi tehdään rohkea teko: poistetaan RandomChartSource, sitä ei enään tarvita - kaikki aiemmat tiedot ovat menetetään ja kaavio tyhjenee ... | |
| 96 | 96 | ||
| 97 | 97 | Miten saadaan uudet tiedot kuvaajalle? | |
| 98 | 98 | ||
| 99 | 99 | ### Tarjotaan todellisia tietoja pylväskuvaajalle | |
| 100 | 100 | ||
| 101 | 101 | Lisätään `TListChartSource` lomakkeelle. Se on tietojen koti. Muistetaan että jokainen datapiste koostuu projektissa viidestä y-arvosta. Siksi on asetettava tämän chartsource:n `YCount` arvoon `5` Useita Y-data-arvoja voidaan laittaa luetteloon metodilla `AddXYList` jossa voit määrittää kaikki y-arvot kerralla. | |
| 102 | 102 | ||
| 103 | 103 | ``` pascal | |
| 104 | 104 | function TListChartSource.AddXYList( | |
| 105 | 105 | AX: Double; const AY: array of Double; | |
| 106 | 106 | const ALabel: String = ''; | |
| 107 | 107 | AColor: TChartColor = clTAColor): Integer; | |
| 108 | 108 | ``` | |
| 109 | 109 | ||
| 110 | 110 | Mutta ei saa unohtaa, että `Double` array elementtien määrä täytyy vastata `YCount` määrittelyä. | |
| 111 | 111 | ||
| 112 | 112 | Yksinkertaisuuden vuoksi kirjoitettava data otetaan wikipedian sivulta ja annetaan ne ohjelmalle lomakkeen luonnissa `OnCreate` tapahtumassa kutsumalla ListChartSource:n `AddXYList` metodia: | |
| 113 | 113 | ||
| 114 | 114 | ``` pascal | |
| 115 | 115 | procedure TForm1.FormCreate(Sender: TObject); | |
| 116 | 116 | begin | |
| 117 | 117 | with ListChartSource1 do begin | |
| 118 | 118 | // Y0 = Vesivoima | |
| 119 | 119 | // Y1 = Tuulivoima (off-shore + on-shore) | |
| 120 | 120 | // Y2 = Biomassa + biojäte | |
| 121 | 121 | // Y3 = Aurinkosähkö | |
| 122 | 122 | // Y4 = Maalämpö | |
| 123 | 123 | // Kaikki arvot GWh | |
| 124 | 124 | // Lähde: http://en.wikipedia.org/wiki/Renewable_energy_in_Germany | |
| 125 | 125 | AddXYList(1990, [15580, 71, 221+1213, 0.6, 0]); | |
| 126 | 126 | AddXYList(1991, [15402, 100, 260+1211, 1.6, 0]); | |
| 127 | 127 | AddXYList(1992, [18091, 275, 296+1262, 3.2, 0]); | |
| 128 | 128 | AddXYList(1993, [18526, 600, 433+1203, 5.8, 0]); | |
| 129 | 129 | AddXYList(1994, [19501, 909, 569+1306, 8, 0]); | |
| 130 | 130 | AddXYList(1995, [20747, 1500, 665+1348, 11, 0]); | |
| 131 | 131 | AddXYList(1996, [18340, 2032, 759+1343, 16, 0]); | |
| 132 | 132 | AddXYList(1997, [18453, 2955, 880+1397, 26, 0]); | |
| 133 | 133 | AddXYList(1998, [18452, 4489, 1642+1618, 32, 0]); | |
| 134 | 134 | AddXYList(1999, [20686, 5528, 1849+1740, 42, 0]); | |
| 135 | 135 | AddXYList(2000, [24867, 9513, 2893+1844, 64, 0]); | |
| 136 | 136 | AddXYList(2001, [23241, 10509, 3348+1859, 75, 0]); | |
| 137 | 137 | AddXYList(2002, [23662, 15786, 4089+1949, 162, 0]); | |
| 138 | 138 | AddXYList(2003, [17722, 18713, 6086+2161, 313, 0]); | |
| 139 | 139 | AddXYList(2004, [19910, 25509, 7960+2117, 556, 0.2]); | |
| 140 | 140 | AddXYList(2005, [19576, 27229, 10978+3047, 1282, 0.2]); | |
| 141 | 141 | AddXYList(2006, [20042, 30710, 14841+3844, 2220, 0.4]); | |
| 142 | 142 | AddXYList(2007, [21169, 39713, 19760+4521, 3075, 0.4]); | |
| 143 | 143 | AddXYList(2008, [20446, 40574, 22872+4659, 4420, 17.6]); | |
| 144 | 144 | AddXYList(2009, [19036, 30602+38, 25989+4352, 6583, 18.8]); | |
| 145 | 145 | AddXYList(2010, [20956, 37619+174, 29085+4781, 11683, 27.7]); | |
| 146 | 146 | AddXYList(2011, [17674, 48315+568, 31920+5000, 19340, 18.8]); | |
| 147 | 147 | AddXYList(2012, [21200, 45325+675, 35950+4900, 28000, 25.4]); | |
| 148 | 148 | end; | |
| 149 | 149 | end; | |
| 150 | 150 | ``` | |
| 151 | 151 | ||
| 152 | 152 | Pitää muistaa linkittää ListChartSource CalculatedChartsource:n `Origin` kohtaan ja kääntää. Tälläinen on tulos kun `CalculatedChartSource.Percentage = true`: | |
| 153 | 153 | ||
| 154 | 154 |  | |
| 155 | 155 | ||
| 156 | 156 | ### Viimeistely | |
| 157 | 157 | ||
| 158 | 158 | Kaavion viimeistelyksi lisää otsikot akseleille ("Year" tai "Vuosi" vaaka-akselille. "Energy, GWh" tai "Energia GWh" pystyakselille. Lisäksi olisi hienoa näyttää otsikko kaavion yläpuolella ("Generation of renewable energy in Germany" tai "Uuden sukupolven uusiutuvien energialähteiden edistyminen Saksassa" ) ja alatunnisteeksiviittaus wikipediaan. | |
| 159 | 159 | ||
| 160 | 160 | Vaihda kaavion taustaväri (`BackColor`) valkoiseksi (`clWhite`). Vähennä `Margins.Bottom` arvoon `0` joka poistaa välin pylvään ja `x` akselin välillä. | |
| 161 | 161 | ||
| 162 | 162 | Lopuksi voisi lisätä checkbox:n (valintaruudun) vaihtamaan normaalin ja prosenttiosuuden näyttämiseen pinotussa pylväskaaviossa. Koodi liitetään checkbox:n `OnClick` tapahtumaan. | |
| 163 | 163 | ||
| 164 | 164 |  | |
| 165 | 165 | ||
| 166 | 166 | ## Yhteenveto | |
| 167 | 167 | ||
| 168 | 168 | Nämä ovat vaiheet luoda pinottu pylväsdiagrammi: | |
| 169 | 169 | ||
| 170 | 170 | - Tarvitaan vain yksi kuvaaja mutta se sisältää monia y-arvoja. | |
| 171 | 171 | - ChartSource:ssa pitää asettaa `YCount` | |
| 172 | 172 | - Data lisätään kutsumalla `AddXYList` metodia. | |
| 173 | 173 | ||
| 174 | 174 | taulukkoparametrin on vastattava `YCount` arvoa. | |
| 175 | 175 | ||
| 176 | 176 | - Lisää `TChartStyles` komponentti lomakkeelle ja linkitä ominaisuus `Style` pylväskuvaajaan. | |
| 177 | 177 | - Jokaiselle pinotulle pylvästasolle lisätään oma `TChartStyle`. | |
| 178 | 178 | ||
| 179 | 179 | - Värin valinta pinotussa pylväässä tapahtuu vastaavassa ChartStyle:ssä. Lisäksi kirjoita ChartStyle:n `Text` ominaisuuteen teksti joka myös näkyy legend kentässä. | |
| 180 | 180 | - Jotta legend kentässä näkyy teksti niin kuvaajan `Legend.Multiplicity` arvo pitää olla `lmStyle` | |
| 181 | 181 | ||
| 182 | 182 | - Normalisoidun pinotun pylväskaavion luomiseksi, lisää `TCalculatedChartSource` lomakkeelle. Linkki sen `Origin` ominaisuudessa chartsourceen kertoo piirtämiseen saatavan datan. Käytä CalculatedChartSource `Source`:n kuvaajassa. Aseta CalculatedChartSource:n `Percentage` ominaisuus arvoon `true` normalisoinnin aktivoimiseksi 100%. | |
| 183 | 183 | - Samoja menetelmiä voidaan soveltaa kun tehdään pinottu ala tai viiva-kuvaajaa. | |
| 184 | 184 | ||
| 185 | 185 | ## Lähdekoodi | |
| 186 | 186 | ||
| 187 | 187 | ### Project file | |
| 188 | 188 | ||
| 189 | 189 | ``` pascal | |
| 190 | 190 | program project1; | |
| 191 | 191 | ||
| 192 | 192 | {$mode objfpc}{$H+} | |
| 193 | 193 | ||
| 194 | 194 | uses | |
| 195 | 195 | {$IFDEF UNIX}{$IFDEF UseCThreads} | |
| 196 | 196 | cthreads, | |
| 197 | 197 | {$ENDIF}{$ENDIF} | |
| 198 | 198 | Interfaces, // this includes the LCL widgetset | |
| 199 | 199 | Forms, Unit1, tachartlazaruspkg | |
| 200 | 200 | { you can add units after this }; | |
| 201 | 201 | ||
| 202 | 202 | {$R *.res} | |
| 203 | 203 | ||
| 204 | 204 | begin | |
| 205 | 205 | RequireDerivedFormResource := True; | |
| 206 | 206 | Application.Initialize; | |
| 207 | 207 | Application.CreateForm(TForm1, Form1); | |
| 208 | 208 | Application.Run; | |
| 209 | 209 | end. | |
| 210 | 210 | ``` | |
| 211 | 211 | ||
| 212 | 212 | ### Unit1.pas | |
| 213 | 213 | ||
| 214 | 214 | ``` pascal | |
| 215 | 215 | unit Unit1; | |
| 216 | 216 | ||
| 217 | 217 | {$mode objfpc}{$H+} | |
| 218 | 218 | ||
| 219 | 219 | interface | |
| 220 | 220 | ||
| 221 | 221 | uses | |
| 222 | 222 | Classes, SysUtils, FileUtil, TAGraph, TASeries, TASources, TAStyles, | |
| 223 | 223 | Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls; | |
| 224 | 224 | ||
| 225 | 225 | type | |
| 226 | 226 | ||
| 227 | 227 | { TForm1 } | |
| 228 | 228 | ||
| 229 | 229 | TForm1 = class(TForm) | |
| 230 | 230 | CalculatedChartSource1: TCalculatedChartSource; | |
| 231 | 231 | Chart1: TChart; | |
| 232 | 232 | Chart1BarSeries1: TBarSeries; | |
| 233 | 233 | ChartStyles1: TChartStyles; | |
| 234 | 234 | CheckBox1: TCheckBox; | |
| 235 | 235 | ListChartSource1: TListChartSource; | |
| 236 | 236 | Panel1: TPanel; | |
| 237 | 237 | procedure CheckBox1Click(Sender: TObject); | |
| 238 | 238 | procedure FormCreate(Sender: TObject); | |
| 239 | 239 | private | |
| 240 | 240 | { private declarations } | |
| 241 | 241 | public | |
| 242 | 242 | { public declarations } | |
| 243 | 243 | end; | |
| 244 | 244 | ||
| 245 | 245 | var | |
| 246 | 246 | Form1: TForm1; | |
| 247 | 247 | ||
| 248 | 248 | implementation | |
| 249 | 249 | ||
| 250 | 250 | {$R *.lfm} | |
| 251 | 251 | ||
| 252 | 252 | { TForm1 } | |
| 253 | 253 | ||
| 254 | 254 | procedure TForm1.FormCreate(Sender: TObject); | |
| 255 | 255 | begin | |
| 256 | 256 | with ListChartSource1 do begin | |
| 257 | 257 | // Y0 = Hydropower | |
| 258 | 258 | // Y1 = Wind energy (off-shore + on-shore) | |
| 259 | 259 | // Y2 = Biomass + biogenic share of waste | |
| 260 | 260 | // Y3 = Photovoltaics | |
| 261 | 261 | // Y4 = Geothermal energy | |
| 262 | 262 | // all values in GWh | |
| 263 | 263 | // source: http://en.wikipedia.org/wiki/Renewable_energy_in_Germany | |
| 264 | 264 | AddXYList(1990, [15580, 71, 221+1213, 0.6, 0]); | |
| 265 | 265 | AddXYList(1991, [15402, 100, 260+1211, 1.6, 0]); | |
| 266 | 266 | AddXYList(1992, [18091, 275, 296+1262, 3.2, 0]); | |
| 267 | 267 | AddXYList(1993, [18526, 600, 433+1203, 5.8, 0]); | |
| 268 | 268 | AddXYList(1994, [19501, 909, 569+1306, 8, 0]); | |
| 269 | 269 | AddXYList(1995, [20747, 1500, 665+1348, 11, 0]); | |
| 270 | 270 | AddXYList(1996, [18340, 2032, 759+1343, 16, 0]); | |
| 271 | 271 | AddXYList(1997, [18453, 2955, 880+1397, 26, 0]); | |
| 272 | 272 | AddXYList(1998, [18452, 4489, 1642+1618, 32, 0]); | |
| 273 | 273 | AddXYList(1999, [20686, 5528, 1849+1740, 42, 0]); | |
| 274 | 274 | AddXYList(2000, [24867, 9513, 2893+1844, 64, 0]); | |
| 275 | 275 | AddXYList(2001, [23241, 10509, 3348+1859, 75, 0]); | |
| 276 | 276 | AddXYList(2002, [23662, 15786, 4089+1949, 162, 0]); | |
| 277 | 277 | AddXYList(2003, [17722, 18713, 6086+2161, 313, 0]); | |
| 278 | 278 | AddXYList(2004, [19910, 25509, 7960+2117, 556, 0.2]); | |
| 279 | 279 | AddXYList(2005, [19576, 27229, 10978+3047, 1282, 0.2]); | |
| 280 | 280 | AddXYList(2006, [20042, 30710, 14841+3844, 2220, 0.4]); | |
| 281 | 281 | AddXYList(2007, [21169, 39713, 19760+4521, 3075, 0.4]); | |
| 282 | 282 | AddXYList(2008, [20446, 40574, 22872+4659, 4420, 17.6]); | |
| 283 | 283 | AddXYList(2009, [19036, 30602+38, 25989+4352, 6583, 18.8]); | |
| 284 | 284 | AddXYList(2010, [20956, 37619+174, 29085+4781, 11683, 27.7]); | |
| 285 | 285 | AddXYList(2011, [17674, 48315+568, 31920+5000, 19340, 18.8]); | |
| 286 | 286 | AddXYList(2012, [21200, 45325+675, 35950+4900, 28000, 25.4]); | |
| 287 | 287 | end; | |
| 288 | 288 | end; | |
| 289 | 289 | ||
| 290 | 290 | procedure TForm1.CheckBox1Click(Sender: TObject); | |
| 291 | 291 | begin | |
| 292 | 292 | CalculatedChartSource1.Percentage := Checkbox1.Checked; | |
| 293 | 293 | if Checkbox1.Checked then | |
| 294 | 294 | Chart1.LeftAxis.Title.Caption := 'Contribution, %' | |
| 295 | 295 | else | |
| 296 | 296 | Chart1.LeftAxis.Title.Caption := 'Energy, GWh'; | |
| 297 | 297 | end; | |
| 298 | 298 | ||
| 299 | 299 | end. | |
| 300 | 300 | ``` | |
| 301 | 301 | ||
| 302 | 302 | ### Unit1.lfm | |
| 303 | 303 | ||
| 304 | - | ||
| 304 | + | ``` lfm | |
| 305 | 305 | object Form1: TForm1 | |
| 306 | 306 | Left = 596 | |
| 307 | 307 | Height = 270 | |
| 308 | 308 | Top = 353 | |
| 309 | 309 | Width = 517 | |
| 310 | 310 | Caption = 'Form1' | |
| 311 | 311 | ClientHeight = 270 | |
| 312 | 312 | ClientWidth = 517 | |
| 313 | 313 | OnCreate = FormCreate | |
| 314 | 314 | LCLVersion = '1.3' | |
| 315 | 315 | object Chart1: TChart | |
| 316 | 316 | Left = 0 | |
| 317 | 317 | Height = 248 | |
| 318 | 318 | Top = 22 | |
| 319 | 319 | Width = 517 | |
| 320 | 320 | AxisList = < | |
| 321 | 321 | item | |
| 322 | 322 | Minors = <> | |
| 323 | 323 | Title.LabelFont.Orientation = 900 | |
| 324 | 324 | Title.LabelFont.Style = [fsBold] | |
| 325 | 325 | Title.Visible = True | |
| 326 | 326 | Title.Caption = 'Energy, GWh' | |
| 327 | 327 | end | |
| 328 | 328 | item | |
| 329 | 329 | Alignment = calBottom | |
| 330 | 330 | Minors = <> | |
| 331 | 331 | Title.LabelFont.Style = [fsBold] | |
| 332 | 332 | Title.Visible = True | |
| 333 | 333 | Title.Caption = 'Year' | |
| 334 | 334 | end> | |
| 335 | 335 | BackColor = clWhite | |
| 336 | 336 | Foot.Alignment = taLeftJustify | |
| 337 | 337 | Foot.Brush.Color = clBtnFace | |
| 338 | 338 | Foot.Font.Color = clGray | |
| 339 | 339 | Foot.Text.Strings = ( | |
| 340 | 340 | 'Source: http://en.wikipedia.org/wiki/Renewable_energy_in_Germany' | |
| 341 | 341 | ) | |
| 342 | 342 | Foot.Visible = True | |
| 343 | 343 | Legend.Visible = True | |
| 344 | 344 | Margins.Bottom = 0 | |
| 345 | 345 | Title.Brush.Color = clBtnFace | |
| 346 | 346 | Title.Font.Color = clBlue | |
| 347 | 347 | Title.Font.Style = [fsBold] | |
| 348 | 348 | Title.Text.Strings = ( | |
| 349 | 349 | 'Generation of renewable energy in Germany' | |
| 350 | 350 | ) | |
| 351 | 351 | Title.Visible = True | |
| 352 | 352 | Align = alClient | |
| 353 | 353 | ParentColor = False | |
| 354 | 354 | object Chart1BarSeries1: TBarSeries | |
| 355 | 355 | Legend.Multiplicity = lmStyle | |
| 356 | 356 | BarBrush.Color = clRed | |
| 357 | 357 | Source = CalculatedChartSource1 | |
| 358 | 358 | Styles = ChartStyles1 | |
| 359 | 359 | end | |
| 360 | 360 | end | |
| 361 | 361 | object Panel1: TPanel | |
| 362 | 362 | Left = 0 | |
| 363 | 363 | Height = 22 | |
| 364 | 364 | Top = 0 | |
| 365 | 365 | Width = 517 | |
| 366 | 366 | Align = alTop | |
| 367 | 367 | BevelOuter = bvNone | |
| 368 | 368 | ClientHeight = 22 | |
| 369 | 369 | ClientWidth = 517 | |
| 370 | 370 | TabOrder = 1 | |
| 371 | 371 | object CheckBox1: TCheckBox | |
| 372 | 372 | Left = 8 | |
| 373 | 373 | Height = 19 | |
| 374 | 374 | Top = 0 | |
| 375 | 375 | Width = 119 | |
| 376 | 376 | Caption = 'Normalize to 100%' | |
| 377 | 377 | OnClick = CheckBox1Click | |
| 378 | 378 | TabOrder = 0 | |
| 379 | 379 | end | |
| 380 | 380 | end | |
| 381 | 381 | object ChartStyles1: TChartStyles | |
| 382 | 382 | Styles = < | |
| 383 | 383 | item | |
| 384 | 384 | Brush.Color = clBlue | |
| 385 | 385 | Text = 'Hydropower' | |
| 386 | 386 | end | |
| 387 | 387 | item | |
| 388 | 388 | Brush.Color = clSkyBlue | |
| 389 | 389 | Text = 'Wind energy' | |
| 390 | 390 | end | |
| 391 | 391 | item | |
| 392 | 392 | Brush.Color = clGreen | |
| 393 | 393 | Text = 'Biomass' | |
| 394 | 394 | end | |
| 395 | 395 | item | |
| 396 | 396 | Brush.Color = clYellow | |
| 397 | 397 | Text = 'Photovoltaic' | |
| 398 | 398 | end | |
| 399 | 399 | item | |
| 400 | 400 | Brush.Color = clMaroon | |
| 401 | 401 | Text = 'Geothermal' | |
| 402 | 402 | end> | |
| 403 | 403 | left = 336 | |
| 404 | 404 | top = 96 | |
| 405 | 405 | end | |
| 406 | 406 | object CalculatedChartSource1: TCalculatedChartSource | |
| 407 | 407 | Origin = ListChartSource1 | |
| 408 | 408 | left = 104 | |
| 409 | 409 | top = 96 | |
| 410 | 410 | end | |
| 411 | 411 | object ListChartSource1: TListChartSource | |
| 412 | 412 | YCount = 5 | |
| 413 | 413 | left = 232 | |
| 414 | 414 | top = 96 | |
| 415 | 415 | end | |
| 416 | 416 | end | |
| 417 | 417 | ``` | |
| 418 | 418 | ||
| 419 | 419 | --- | |
| 420 | 420 | *From the Free Pascal wiki, page "TAChart Tutorial: Stacked BarSeries/fi", as it stood on 2020-02-29 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* |
