GNUplot - segregacja wartości na osiach

Ogólne pogawędki i dywagacje
woody28
Posty: 2
Rejestracja: śr lut 14, 2018 11:22 pm

GNUplot - segregacja wartości na osiach

Post autor: woody28 »

Realizuję projekt odczytu temperatury zewnętrznej w przedziale 24-godz. w interwale jednogodzinnym oraz wyniki wyświetlam w czasie rzeczywistym na wykresie generowanym automatycznie na serwerze Debian w GNUplot. Odczyt temperatury zapisuje do pliku w formie dwóch kolumn(pierwsza pełna godzina, druga temperatura).
Problem polega na tym, że GNUplot segreguje wartości na osi X od najmniejszej do największej tj. od 0...do 23. Potrzebuję by program zaznaczał wartości na osi w kolejności dokładnie takiej jak jest w pliku danych, co pozwoli na generowanie czytelniejszego wykresu(pełną dobę wstecz do godziny wyświetlenia wykresu) Mam nadzieję, że w miarę zrozumiale opisałem problem. Poniżej przykład danych wykonanych o godz 13-stej i wygenerowany wykres oraz kod.
13 3.25
14 3.06
15 1.06
16 0.31
17 0.25
18 0.25
19 -0.19
20 -0.19
21 -0.50
22 -0.50
23 -0.62
00 -0.56
01 -0.94
02 -1.00
03 -1.31
04 -1.50
05 -1.50
06 -1.50
07 -1.81
08 -1.31
09 -0.69
10 -0.69
11 0.50
12 0.12
wykres.png
wykres.png (7.22 KiB) Przejrzano 3157 razy

Kod: Zaznacz cały

#!/usr/bin/gnuplot
reset
set terminal png small size 800,600;
set output '/baza/wymiany/wykres.png';
set xlabel " Godzina" font "Arial-Bold, 14";
set ylabel " Temp. w C" font "Arial-Bold, 14";
set title'Wykres temperatury w czasie dobowym';
set  xtics nomirror; #usuniecie obramowania
set  ytics nomirror;
set border 3;
set xtics 2;
set grid;
unset key;
plot "/home/log/dane_wyk.txt" using 1:2 with linespoints linetype 3 linewidth 2 pointtype 7
Pewnie można by to zrobić za pomocą pętli "for" ale to już wyższa szkoła jazdy.
Może ktoś kojarzy polecenie, które mi umknęło w dokumentacji gnuplota do braku segregacji danych na osi X?
OpenOffice 2.4 pod Ubuntu 9.04
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: GNUplot - segregacja wartości na osiach

Post autor: Jan_J »

Gnuplotowe zaklęcie
plot "datafile" using 1:2 with lp
potrakuje kolumnę 1 jako źródło danych dla osi X, a 2 jako dane dla osi Y.
W przypadku tylko dwóch kolumn w pliku klauzulę using 1:2 można pominąć.

Jeżeli przyjąć, że w Twoim problemie częstotliwość odczytów jest stała, znaczy to że pierwsza kolumna w pliku zawiera etykietki dla osi poziomej, druga wartości rzędnych, a odciętymi są liczby porządkowe.

Ograniczenie do pojedynczej kolumny, powiedzmy drugiej:
plot "datafile" using 2 with lp
nakreśli dane z 2 kolumny na osi Y z uwzględnieniem ich kolejności na osi X.
Tyle z pamięci, bo składni etykiet nie używam na codzień.

Pomógł nieoceniony stackoverflow: np. https://stackoverflow.com/questions/480 ... in-gnuplot
Wg recepty (w samym poście chodzi o coś trochę innego),
plot "datafile" using 2:xticlabel(1) with lp
jest OK.
To samo zresztą da się znaleźć w helpie, choć być może większym wysiłkiem.

W przypadku zmiennych odległości między odczytami nie ma siły, będzie trzeba prowadzić jakąś rachubę "czasu". Nie jestem pewien, czy damy wtedy radę bez dodatkowej kolumny (potrzebne jest kumulowanie wartości z kolumny i ich skalowanie, może to się da zrobić automagicznie).
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
woody28
Posty: 2
Rejestracja: śr lut 14, 2018 11:22 pm

Re: GNUplot - segregacja wartości na osiach

Post autor: woody28 »

SUPER, o to chodziło. :D

Kod: Zaznacz cały

plot "datafile" using 2:xticlabel(1) with lp
Szukać w helpie szukałem, ale pod złym hasłem.
Dziękuję
OpenOffice 2.4 pod Ubuntu 9.04
ODPOWIEDZ