Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 20. 6. 2020 00:48:01

regine
Člen
Registrace: 11. 1. 2014
Příspěvků: 34

Jak vytvořit graf hodnot ve stejnou hodinu za 1 měsíc - VYŘEŠENO

Mám odečet teplot (z teplotního dataloggeru) v jednohodinových intervalech (24 hodnot za den) po dobu 1 měsíce.
Dva sloupce A = čas, B = teplota. Počet řádků 720 (24x30).
Potřebuji graf, srovnávající teploty v odměřenou hodinu za 30 dní.
30 křivek vynesených po 1 hodině na ose X.
Osa X hodiny (24 hodin) a osa Y je teplota.
PLS, jak na to? Před-připravit nějaké seskupení? Napsat nějaké makro (LibreOfice Basic téměř neumím) s cyklem?
___
Uvedeno jako zjednodušující příklad k pochopení problému. Tabulka měření je rozsáhlejší (počet řádků měření, tedy dnů). Vytvářet klasicky pomocí "Chart Wizard" po jednotlivých dnech (křivkách) "Add" by bylo nelidské.
___
Doplněno: snímek tabulky Ve sloupcích jsem už vytvořil POMOCNÉ hodnoty, které jsou C=datum, D=čas a E=pořadová hodina dne.
pro čas jsem použil > =RIGHT(B2;8)
pro datum jsem stvořil > =MID(B2;4;2)&"."&LEFT(B2;2)&"."&MID(B2;7;4)

Editoval regine (22. 6. 2020 18:53:22)


LibreOffice 6.2.8.2 užíván v Ubuntu, občas ve Windows

Offline

#2 20. 6. 2020 07:15:32

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Jak vytvořit graf hodnot ve stejnou hodinu za 1 měsíc - VYŘEŠENO

regine napsal(a)

Mám odečet teplot (z teplotního dataloggeru) v jednohodinových intervalech (24 hodnot za den) po dobu 1 měsíce.
Dva sloupce A = čas, B = teplota. Počet řádků 720 (24x30).
Potřebuji graf, srovnávající teploty v odměřenou hodinu za 30 dní.
Osa X hodiny (24 hodin) a Y teplota.
PLS, jak na to? Před-připravit nějaké seskupení? ....

     Podle zadání máte pouze dva sloupce, čas a teplota. Nyní je potřeba vědět, zda je tam také datum. To je často spojeno s časem. Report dataloggeru může být proveden různě. Například datum na samostatném řádku a vlastní data už jen čas a hodnota.
     Viděl jsem něco podobného u průmyslového lisu kde byla pouze hlavička ze které se dal odečíst údaj o dni. Ostatní byly už jen časy po cyklech (necelé minutě) a nejméně 3 zaznamenávané parametry z D/A převodníků. V případě nestabilních stavů tam vyskočilo více dat z jiných čidel. Stroj běžel v nepřetržitém provozu a restart raportu byl až třeba po několika dnech (ačkoliv to bylo proti technologickému postupu). Byl to souhrn z čidel za celou linku mimo vstupního šneku. Prostě hrůza. Na začátku jsme ani nevěděli co hledat.


     Takže pokud je Váš popis úplný nemáte v reportu údaje o datumu, ale může jít také o více souběžných komparací různých čidel - takový graf už je opravdu složitý. Nejprve asi bude nutné uvést co mají grafy znázornit (například extrémní hodnoty, hodnoty typické pro určitý čas apod.).
     To se dá dovodit pouze tak, že se najde čas buď 00:00, nebo 24:00 (při formátu HH:MM) a tak se najde začátek dne. Vlastní úprava pro vytvoření grafu předpokládá rozprostřít hodiny jednotlivých dnů do osy "X", jednotlivé dny do osy "Y". Je to typické 2D uspořádání původního datového údaje z 1D.
     Problém je v tom, že objem dat je stejný jako při nestrukturovaném výpisu. Tabulka bude sice dobře orientována, ale dat je to mnoho i když se na to díváme jako na jediný logger.


     Řešením je kontingenční tabulka která by měla být vybavena pouze popisem sloupců. Sloupce by měly obsahovat údaj YYMMDD + HH (minuta není potřebná a je možné uvést co nejkratší formu datumu - možná jenom den, protože měsíc a rok může být uveden v záhlaví grafu DD+HH).
     Z tabulky pokusně vyseparovat to co nás zajímá. To jste neuvedl, ale vždy se má něco demonstrovat, například extrémy. Z toho se dá dovodit například delší sledovaný úsek jako průměr. Například po 4 hodinách, nebo jen třeba začátek směn (6.00, 14.00, 22.00).


     Následně podle analýzy vytvořit jednotlivé grafy. Obecně by to mohlo být 30 grafů s 24 – mi položkami (nadepsané hodiny a zobrazené hodnoty), nebo 24 grafů (stejná hodina) po 30-ti položkách (dnech).


POSTUP ÚPRAV na formát 2D.
     Naimportujeme report do Calcu (sloupec A hodina, sloupec B teplota). Do pomocného sloupce C, vložíme nejprve pořadové číslo.  To uděláme nejlépe jako vzorec „=ROW()". Pokud report obsahuje nějaké záhlaví – které je na prvním řádku uděláme číslování od druhého takto „=ROW()-1". Následně hned vzorce zkopírujeme a vložíme zpět jen jako čísla. (Nyní už můžeme například řadit podle potřeby a k původnímu uspořádání se vrátíme právě podle sloupce „C".)
     Nyní sice můžeme seřadit soubor podle jednotlivých hodin, ale nás zajímá nejprve datum. Potřebujeme oddělit jednotlivé dny nejlépe jedním, nebo dvěma prázdnými řádky.


     Postup : Do sloupce D a E (popřípadě F – když bychom chtěli 2 řádky mezi dny). Zadáme vzorec :
ve sloupci D pro příslušný řádek – například 2.

=Max(D1:E1) + 1

Dále do sloupce E vzorec který testuje následující řádek a v případě, že najde hodnotu 00:00 (respektive 24:00 – tedy první hodinu dne) tak přidá číslo řádku. Před každým novým dnem se tak vytvoří vedle sebe dvě čísla, která nakonec spojíme do jednoho sloupce (hodnoty z „E" přidáme za hodnoty v D a seřadíme sloupec podle D. Tím vzniknou mezery mezi dny.

IF(A3 = 00:00;D1+1,"")

     Nyní máme rozdělení pouze naznačené tak, že tam kde má vzniknout prázdný řádek je záznam ve sloupci E. To je choulostivé a musíme nejprve Sloupce D a E zkopírovat a vložit zpět jen jako čísla (zde se může snadno stát chyba – proto máme ještě ve sloupci C původní pořadí ke kterému se můžeme vždy vrátit).
     Následně seřadíme k sobě pouze čísla ze sloupce E (pozor systém nabízí seřezaní celého souboru – to se stát nesmí). Takto seřazení hodnoty z E vystřihneme a vložíme na konec sloupce D.
     Vybereme celý datový úsek (předpokládáme od 2. řádku) a seřadíme podle sloupce D vzestupně. Teprve nyní nám vznikly skutečně řádky mezi jednotlivými dny. Měli bychom zkontrolovat, zda jsou původní hodnoty sloupce C ve vzestupném řazení. Pokud je zde nějaký problém, začneme od začátku. Pokud je vše v pořádku můžeme pomocné sloupce C...E smazat (ale raději si sloupce C ponechte pro všechny případy možných oprav.


     Zbývá transponovat jednotlivé dny do řádků. To uděláme také pomocí vzorců :
Nejprve přidáme do sloupce D relativní číslování. Začneme od druhého řádku. Cílem je zjistit kolik dní má který měsíc. Podle toho doplníme manuálně potřebný počet řádků tak aby na každý měsíc vycházelo 31 + 1 řádek - například za únorem (28 dní) bude 5 prázdných řádků, jindy jen dva, nebo žádný – pokud má měsíc 31 dnů. 
     Do uvolněného sloupce E zadáme vzorec který vykopírujeme do 31 řádků :

=IF(A2 = "";"";B2)

Tento vzorec je ve sloupci a kvůli transpozici musíme všech 31 vzorců vybrat a pomocí F4 (Pro LibreOffice) udělat z relativních adres adresy absolutní :

=IF($A$2 = "";"";$B$2)
…..
=IF($A$32 = "";"";$B$32)

     Teprve nyní sloupec vystřihneme a vložíme s volbou transponovat (dialog vložit jinak). Transponovaná řádek musí být nejlépe na řádku prvního údaje. Zkontrolujeme zda jsou hodnoty ze sloupce v řádku. Když vzorce fungují správně odstraníme ze vzorce dolary – tím vytvoříme relativní adresy které můžeme kopírovat do dalších řádků. Odstranění je možné tak, že celý úsek vzorců máme vybraný a pomocí F4 se proklikáme až k čistě relativní podobě. Jinou možností je dialog Najít a nahradit – na vybraném úseku řádku zadáme najít dolar ($) a nahradit (nic).


     Teprve nyní můžeme celý řádek (31 hodnot) zkopírovat a postupně vložit do stejného sloupce a prvního řádku dne (hodina 00:00, nebo 24:00). Když máme všechny dny vykopírované do řádků, musíme celý úsek od řádku 2 do řádku XY zkopírovat a vložit jen jako čísla.
     Posledním úkonem je seřazení podle :
1. - sloupec E
2. - sloupec C
     Máme hotovou tabulku 2D a proto můžeme smazat sloupce A:C. Doplníme hlavičkové údaje (kterými bude asi hodina). Přidáme podle potřeby sloupec A kam zadáme den. To může být problém. Často víme jen to, kterým dnem report začínal, nebo končil.

     Vypadá to složitě, ale není to tak hrozné když se zamyslíte nad každým krokem. Je možné udělat instruktážní Calc který by demonstroval StepByStep postup pomocí maker a komentů. Také se k tomu chystám, ale má to hodně variant tak to odkládám.
     Spíš bych pomohl tak, že vytvořím makro, které proces provede bez ukecaných komentářů a celkem rychle. Musel bych ale vidět skutečný raport jinak to nedám dohromady. Pokud budete mít zájem postněte sem vzor, nebo mi to pošlete privátně na email uvedený hned pod těmito řádky.


PS vlastní graf neřeším ale předpokládám použití grafu z volby VLOŽIT > GRAF nejspíš "čárový", nebo plošný.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#3 20. 6. 2020 14:44:56

regine
Člen
Registrace: 11. 1. 2014
Příspěvků: 34

Re: Jak vytvořit graf hodnot ve stejnou hodinu za 1 měsíc - VYŘEŠENO

Díky. Už jsem hledal na netu. Například zde, pomocí makra. Jde mi o diskusi, zda jdu správnou cestou.
Nebo raději tabulku exportovat do databáte LO Base Database, kterou jsem ještě nikdy nepoužil. Kdysi jsem pracoval s SQL databázemi jako IBM-Informix. A zda z databáze je možné vytvořit graf (jednodušeji). V IBM-Informixu na to byl GUI-generátor.

Editoval regine (20. 6. 2020 14:46:49)


LibreOffice 6.2.8.2 užíván v Ubuntu, občas ve Windows

Offline

#4 20. 6. 2020 20:19:14

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,435

Re: Jak vytvořit graf hodnot ve stejnou hodinu za 1 měsíc - VYŘEŠENO

regine napsal(a)

Mám odečet teplot (z teplotního dataloggeru) v jednohodinových intervalech (24 hodnot za den) po dobu 1 měsíce.
Dva sloupce A = čas, B = teplota. Počet řádků 720 (24x30).
Potřebuji graf, srovnávající teploty v odměřenou hodinu za 30 dní.
30 křivek vynesených po 1 hodině na ose X.
Osa X hodiny (24 hodin) a osa Y je teplota.
PLS, jak na to? Před-připravit nějaké seskupení? Napsat nějaké makro (LibreOfice Basic téměř neumím) s cyklem?...


     Vaše řešení je na správné cestě, ale asi si neuvědomujete své původní zadání. Jak jste psal potřebujete v jednohodinových intervalech (24 hodnot za den) po dobu 1 měsíce. .
     V tom okamžiku potřebujete uspořádání 2D - 24 sloupců, a počet řádků shodný s počtem dnů v měsíci (min 28 a max 31). To co jsem popisoval ráno je právě metoda kterou vytvoříte uspořádání 2D. Myslím že i to makro které uvádíte vyžaduje úsek - konkrétně popsaný jako "W71:AD120" - tedy když takový úsek posuneme do A1 je to úsek A1:H50 - tedy 8 sloupců a 50 řádků. Toto je tabulka 2D kterou potřebujete vytvořit, jen by měla mít 25 sloupců (1 + 24) a rozsah řádků podle počtu dnů v měsíci (28 - 31).


     Když byste pustil makro do takového sloupce tak se asi slušného grafu nedočkáte. 720 řádků je moc. Musel byste dělat graf pro jednotlivý den. To je snadnější tak že vyberete 1 den (24 řádků) a čas použijete pro osu "X", teplotu pro osu "Y" - budete muset nejspíš přepsat na jiný typ grafů - dá se to udělat. Potom musíte udělat 28 - 31 grafů pro každý den.
     Ale příprava tabulky je výhodnější - dá se rozebrat na 24 grafů, které mohou vyhodnocovat teplotu v různých dnes a ve stejné hodině. Také můžete udělat průměr pro každou hodinu dne (z celého měsíce) a tu zadávat jako údaj pro korelaci. Tady jde právě o to co chcete z grafu vytěžit.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#5 22. 6. 2020 18:51:21

regine
Člen
Registrace: 11. 1. 2014
Příspěvků: 34

Re: Jak vytvořit graf hodnot ve stejnou hodinu za 1 měsíc - VYŘEŠENO

Pro zajímavost prvotní výsledek zde.
1. Generována kontingenční tabulka, kde řádky=dny, sloupce=hodiny dne (1-24)
2. Použito výše uvedené makro, upravené na rozsah kontingenční tabulky a popis.
Zbývá hraní si s vylepšením zobrazení. THX za pomoc.


LibreOffice 6.2.8.2 užíván v Ubuntu, občas ve Windows

Offline

Zápatí