Gnuplot dan apa yang dimakan dengannya



Tentunya banyak dari Anda yang membuka-buka publikasi ilmiah Barat telah melihat grafik yang indah dan sederhana. Mungkin beberapa dari Anda bertanya-tanya apa para pakar ini memvisualisasikan data mereka. Dan sekarang ada alat grafik yang cantik dan sangat sederhana yang hampir ada di mana-mana: Windows, linux, android, dan lainnya, saya yakin bahkan ada DOS. Ini dapat diandalkan, sederhana dan memungkinkan Anda untuk menyajikan data teks-tabel apa pun dalam bentuk grafik yang indah.



Mengapa gnuplot?



Jika Anda telah membaca artikel saya " Tes kecepatan simultan pada beberapa modem LTE ", " Osilasi harmonik ", " Buat generator angka acak perangkat keras "), Anda mungkin telah memperhatikan grafik yang indah.





Grafik dari posting tentang generator nomor acak





Gambar dari posting tentang modem speetest Grafiknya



sederhana dan keren. Keuntungan paling berharga dari gnuplot adalah untuk memplotnya Anda hanya memerlukan file teks dengan data mentah, gnuplot pada OS favorit Anda (meskipun OpenWRT) dan editor tes vim favorit Anda.



Sekilas, mungkin terlihat bahwa gnuplot lebih sulit digunakan untuk plot daripada MS Excel. Tetapi tampaknya seperti itu, ambang masuknya sedikit lebih tinggi (Anda tidak dapat menggunakan mouse untuk mengkliknya, Anda perlu membaca dokumentasi di sini), tetapi dalam praktiknya, hasilnya jauh lebih mudah dan nyaman. Saya pernah menulis skrip dan telah menggunakannya sepanjang hidup saya. Jauh lebih sulit bagi saya untuk memplot grafik di Exel, di mana semuanya tidak logis, daripada di gnuplot. Dan keuntungan utama dari gnuplot adalah Anda dapat menyematkannya ke dalam program Anda dan memvisualisasikan data dengan cepat. Juga gnuplot tanpa masalah membuat grafik dari file data statistik berukuran 30 gigabyte, sementara Exel mengalami crash dan tidak dapat membukanya.



Kelebihan dari gnuplot termasuk fakta bahwa ia dapat dengan mudah diintegrasikan ke dalam kode dalam bahasa pemrograman standar. Ada perpustakaan yang sudah jadi untuk banyak bahasa, saya pribadi menemukan php dan python. Dengan demikian, Anda dapat membuat grafik langsung dari program Anda.



Misalnya, saya akan mengatakan bahwa teman baik saya, ketika dia menulis disertasinya, menguasai gnuplot (atas saran saya). Dia tidak pernah menjadi teknisi, tapi dia menemukannya dalam satu malam. Setelah itu, dia hanya membuat grafik di sana, dan level pekerjaannya mulai berbeda dengan latar belakang rekan-rekannya yang menggunakan Excel. Bagi saya pribadi, indikator kualitas karya ilmiah yang tinggi adalah grafik yang dibangun oleh program khusus.



Jadi, gnuplot itu sederhana, mudah diakses, dan indah. Mari melangkah lebih jauh.



Gnuplot - aplikasi



Ada dua cara untuk bekerja dengan gnuplot: mode perintah dan mode eksekusi skrip. Saya sarankan untuk segera menggunakan mode kedua, karena ini adalah yang paling nyaman dan tercepat. Selain itu, fungsinya benar-benar sama.



Tetapi untuk memulai, kami menjalankan gnuplot dalam mode perintah. Jalankan gnuplot dari baris perintah, atau dengan cara yang tersedia untuk OS Anda. Anda dapat memulai pelatihan bahkan dengan membaca artikel ini, tetapi langsung dari perintah bantuan pertama . Dia akan menunjukkan bantuan yang luar biasa dan Anda bisa melangkah lebih jauh. Tapi kita akan membahas hal-hal penting.



Grafik diplot dengan perintah plot . Sebagai parameter perintah, Anda dapat menentukan fungsi atau nama file data. Serta kolom data mana yang akan digunakan dan bagaimana menghubungkan titik-titik, bagaimana menunjukkannya, dll. Mari kita ilustrasikan.



gnuplot> plot sin(x)







Setelah menjalankan perintah, sebuah jendela akan terbuka di mana akan ada grafik sinus dengan tanda tangan default. Mari perbaiki grafik ini dan cari tahu beberapa opsi tambahan pada saat yang bersamaan.

Mari kita tanda tangani kapaknya.



set xlabel "X"


Menentukan label untuk sumbu absis.



set ylabel "Y"


Menentukan label untuk sumbu ordinat.



Mari tambahkan kisi untuk menunjukkan di mana grafik dibuat.



set grid


Saya tidak suka fakta bahwa sinusoid pada sumbu ordinat terletak di ujung grafik, jadi kami akan menetapkan batas nilai yang akan dibatasi oleh grafik.



set yrange [-1.1:1.1] 


Dengan demikian, grafik akan digambar dari nilai minimum -1.1 hingga nilai maksimum 1.1.

Demikian juga, saya menetapkan kisaran untuk absis sehingga hanya satu periode sinusoid yang terlihat.



set xrange[-pi:pi]


Kita perlu menambahkan judul ke jadwal kita agar semuanya sesuai Feng Shui.



set title "Gnuplot for habr" font "Helvetica Bold, 20"


Perhatikan bahwa Anda dapat mengatur font dan ukurannya. Lihat dokumentasi gnuplot untuk font apa yang dapat digunakan.



Dan terakhir, selain sinus pada grafik, mari kita juga menggambar cosinusnya, dan juga mengatur jenis garis dan warnanya. Dan juga tambahkan legenda, apa yang kita gambar.



plot sin(x) title "sinux" lc rgb "red", cos(x)  title "cosinus" lc rgb "green"


Di sini kami menggambar dua grafik pada satu kanvas, dengan warna merah dan hijau. Secara umum, ada banyak pilihan untuk garis (garis putus-putus, guratan, solid), lebar garis, warna. Serta jenis poin. Tujuan saya hanya untuk mendemonstrasikan berbagai kemungkinan. Mari kita bawa semua perintah ke dalam satu tumpukan dan jalankan secara berurutan. Untuk mengatur ulang pengaturan sebelumnya, masukkan reset.



reset
set xlabel "X" 
set ylabel "Y"
set grid
set yrange [-1.1:1.1]
set xrange[-pi:pi]
set title "Gnuplot for habr" font "Helvetica Bold, 20"
plot sin(x) title "sinux"  lc rgb "red", cos(x)  title "cosinus" lc rgb "green"


Hasilnya, kita mendapatkan keindahan seperti itu.





Tidaklah memalukan lagi untuk menerbitkan jadwal tersebut di jurnal ilmiah.



Jika Anda benar-benar mengulangi semua ini setelah saya, Anda mungkin telah memperhatikan bahwa memasukkannya secara manual setiap kali, bahkan menyalin, entah bagaimana tidak biasa. Tapi apakah ini skrip yang sudah jadi? Jadi, ayo kita lakukan!

Keluar dari mode perintah dengan perintah keluar dan buat file:



vim testsin.gpi


#! /usr/bin/gnuplot -persist
set xlabel "X" 
set ylabel "Y"
set grid
set yrange [-1.1:1.1]
set xrange[-pi:pi]
set title "Gnuplot for habr" font "Helvetica Bold, 20"
plot sin(x) title "sinux"  lc rgb "red", cos(x)  title "cosinus" lc rgb "green"


Kami membuatnya dapat dieksekusi dan menjalankannya. Nah, jangan lupa cara keluar vim.



chmod +x testsin.gpi
./testsin.gpi


Hasilnya, kami mendapatkan jendela yang sama dengan grafik. Jika Anda tidak menambahkan "-persist" ke judul, jendela akan tertutup secara otomatis setelah skrip dijalankan.



Tetapi seringkali tidak terlalu perlu membuat jendela, ditambah lagi tidak selalu nyaman untuk menggunakannya, dan Anda dapat bekerja di sistem operasi tanpa GUI. Lebih sering Anda perlu menerima file grafik. Secara pribadi, saya lebih suka format vektor postscript, karena dengan sejumlah besar titik, Anda dapat memperbesar berbagai bagian grafik tanpa kehilangan kualitas. Dan juga penampil di Linux secara otomatis menyegarkan jendela dengan grafik ketika file postscript diubah, yang juga sangat nyaman.



Untuk mengeluarkan data ke file dan bukan ke layar, Anda perlu menetapkan ulang terminal.



set terminal png size 800, 600
set output "result.png"


Seperti yang Anda duga, kami menunjukkan jenis file, resolusinya, lalu kami menunjukkan nama file. Tambahkan dua baris ini ke awal skrip kami, dan kami mendapatkan gambar ini di folder saat ini.







Untuk menyimpan ke postscript, Anda perlu menggunakan perintah berikut:



set terminal postscript eps enhanced color solid
set output "result.ps"


Data nyata



Sinus, cosinus memang keren untuk digambar, tetapi tetap menggambar data nyata jauh lebih menarik! Izinkan saya mengingatkan Anda tentang tugas baru - baru ini yang saya tulis dalam artikel - menampilkan grafik kecepatan Internet dalam jangka waktu yang lama. Format datanya adalah sebagai berikut.



Operator; #Uji; Tanggal; Waktu; Koordinat; Unduh Mb / s; Unggah Mb / s; ping; Testserver

Rostelecom; 0; 05/21/2020; 09: 56: 00; NA, NA; 3.7877656948451692; 5.231226008184113; 132.227; MaximaTelecom (Moskow) [0,12 km]: 132.227 ms

Rostelecom; 1; 05/21/2020; 10: 01: 02; NA, NA; 5.274994541394363; 5.1088572634075815; 127.52; MaximaTelecom (Moskow) [0.12 km]: 127.52 ms

Rostelecom; 2; 05/21/2020; 10: 04: 35; NA, NA; 3.61044819424076; 4.624132180211938; 135.456; MaximaTe 0,12 km]: 135,456 md


Terlihat bahwa kita memiliki titik koma sebagai pemisah, kita perlu menampilkan kecepatan download, kecepatan upload tergantung waktu. Apalagi jika Anda memperhatikan tanggal dan waktu berada di kolom yang berbeda. Sekarang saya akan memberi tahu Anda bagaimana saya mengatasi ini. Saya akan segera mengutip skrip yang digunakan untuk membuat grafik.



#! /usr/bin/gnuplot -persist
set terminal postscript eps enhanced color solid
set output "Rostelecom.ps"

#set terminal png size 1024, 768
#set output "Rostelecom.png"
 
set datafile separator ';'
set grid xtics ytics
set xdata time
set timefmt '%d.%m.%Y;%H:%M:%S'

set ylabel "Speed Mb/s"
set xlabel 'Time'
set title "Rostelecom Speed"

plot "Rostelecom.csv" using 3:6 with lines title "Download", '' using 3:7 with lines title "Upload"
 
set title "Rostelecom 2 Ping"
set ylabel "Ping ms"
plot "Rostelecom.csv" using 3:8 with lines title "Ping"


Di awal file, kami menetapkan file output postscript (atau png, jika diperlukan).



setel pemisah file data ';' - kami mengatur karakter pembatas. Kolom dipisahkan oleh spasi secara default, tetapi file csv menawarkan banyak opsi pembatas dan Anda harus dapat menggunakan semuanya.

set grid xtics ytics - setel grid (Anda hanya dapat mengatur grid sepanjang satu sumbu).

mengatur waktu xdata adalah poin penting, kita berbicara tentang fakta bahwa pada sumbu X format data akan menjadi waktu.

atur timefmt '% d.% m.% Y;% H:% M:% S ' - atur format data waktu. Harap dicatat bahwa karakter pembatas kolom (";") disertakan dalam format waktu, jadi kami akan memperlakukan dua kolom sebagai satu.



Kami mengatur label sumbu dan grafik. Kemudian kami membuat grafik.



plot "Rostelecom.csv" menggunakan 3: 6 dengan judul baris "Download", '' menggunakan 3: 7 dengan judul baris "Upload" - kami memplot kecepatan download dan kecepatan upload dalam satu grafik. Menggunakan 3: 6 adalah nomor kolom di file data sumber kita, dari mana kita membangun (X: Y).



Kemudian kami memplot grafik ping dengan cara yang sama. Grafik yang dihasilkan akan terlihat seperti ini.





Ini adalah tangkapan layar dari postscript. Garis lurus pada grafik disebabkan oleh adanya celah data. Berikut adalah contoh plot yang sangat nyata.



Dan 3D ???



Apakah Anda ingin 3D? Aku memiliki mereka!



Lama sekali saya berpikir tentang contoh grafik tiga dimensi yang akan diberikan, dan tidak menemukan sesuatu yang lebih baik daripada memvisualisasikan gambar. Memang, pada dasarnya, gambar adalah grafik tiga dimensi, di mana kecerahan pikselnya adalah koordinat z. Jadi, mari bermain hooligan kecil.

Ambil foto Einstein yang paling terkenal.





Dan mari kita buat grafik darinya. Untuk melakukan ini, ubah ke format pgm ASCII dan hapus semua spasi, ganti dengan baris baru, dengan perintah sederhana.



convert Einstein.jpg  -compress none pgm:- | tr -s '\012\015' ' '  | tr -s ' ' '\012'> outfile.pgm 


Bagi mereka yang tidak mengerti apa yang terjadi di sini, saya jelaskan: kami menggunakan imagemagic untuk mengonversi gambar ke format pgm, lalu menggunakan tr untuk mengganti carriage return dengan baris baru ke spasi, lalu semua spasi ke carriage kembali dan menyimpan semuanya di outfile. pgm. Siapapun yang kesulitan dapat membuka file di gimp dan mengekspornya sebagai pgm-ASCII.



Kemudian kami membuka file yang dihasilkan dengan editor vim favorit kami dan menghapus judul darinya. Dalam kasus saya, ini adalah tiga baris pertama. Jangan lupa untuk mengetahui resolusi file dari judulnya, dalam hal ini 325x408 piksel. Itu saja, kami mendapat file teks koordinat Z! Sekarang tugas kita adalah menambahkan koordinat X dan Y, untuk ini kita akan menjalankan semua ini melalui skrip Python.



f = open('outfile.pgm')
for x in range(408):
	for y in range(325):
		line = f.readline()
		print ('%d %d %s' % (x, y, line)),
f.close()


Simpan ini sebagai convert.py dan jalankan:



python convert.py > res.txt


Itu saja, sekarang res.txt berisi koordinat Einstein ... Hmm, atau lebih tepatnya koordinat gambarnya. Nah, secara umum, Anda mendapatkan ide :).



...

406 317 60

406 318 54

406 319 30

406 320 41

406 321 84

406 322 101

406 323 112

406 324 119

407 0 128

407 1 53

407 2 89

407 3 95

407 4 87

...


File contoh.



Naskah untuk membangun keindahan ini terlihat seperti ini.



#! /usr/bin/gnuplot -persist
#set terminal png size 1024, 768
#set output "result.png"
#set grid xtics ytics

#set terminal postscript eps enhanced color solid
#set output "result.ps"

set title "Albert Einstein"
set palette gray
set hidden3d
set pm3d at bs
set dgrid3d 100,100 qnorm 2
set xlabel "X" font "Helvetica Bold	,18"
set ylabel "Y" rotate by 90 font "Helvetica Bold	,18"
set zlabel "Z" font "Helvetica Bold	,18"

set xrange [0:408]
set yrange [0:325]
set zrange [-256:256]
unset key 
splot "./res.txt" with l 


Sebelum kita pergi ke parsing skrip, jika Anda mengulangi ini, saya sangat menyarankan Anda untuk mengeksekusi baris skrip dalam mode perintah sehingga Anda dapat memutar grafik dengan mouse (tentu saja, tanpa menentukan terminal yang ditetapkan). Itu sangat keren!



Pertama, kami menetapkan tipe data keluaran, serta batas datanya. Perbatasan diatur sesuai dengan ukuran gambar, dan ditambah dari bawah saya telah memberi jarak 256 karakter di sepanjang sumbu Z sehingga proyeksi gambar terlihat. Selanjutnya, kita menuju grafik, beri label sumbu. Menggunakan perintah tombol unset - Saya menonaktifkan legenda (tidak diperlukan pada grafik). Dan inilah keajaiban yang sesungguhnya!



atur palet abu - abu - kita mengatur palet. Jika dibiarkan sebagai default, grafik akan diberi warna seperti pada thermal imager. Semakin tinggi, semakin kuning bintiknya, semakin rendah semakin gelap warna merahnya.



atur hidden3d- seolah-olah, meregangkan permukaan lengkung (menghilangkan garis), sehingga membentuk permukaan cembung yang indah.



set pm3d di bs - aktifkan gaya menggambar data 3D, yang menggambar data dengan koordinat dan warna kisi. Baca lebih lanjut di dokumentasi, penjelasan yang lebih detail berada di luar cakupan artikel.



set dgrid3d 100,100 qnorm 2 - setel ukuran sel grid ke 100x100, dan antialiasing antar sel. Nilai 100x100 sudah sangat besar, dan programnya sangat lambat. qnorm 2 adalah anti-aliasing (interpolasi data antar sel).



splot "./res.txt" dengan l - gambar grafik yang dihasilkan. "Dengan l" berarti menggambar grafik dengan garis. Ini adalah peretasan kecil, karena titik-titiknya terlihat pada grafik (titik-titik kecil dapat diatur).



Setelah peluncuran, kami menunggu beberapa saat, dan kami mendapatkan "relief dasar" poligonal. Cobalah bereksperimen dengan pengaturan untuk mendapatkan opsi rendering lainnya.





Gambar berada dalam mode perintah setelah diputar.



Sebuah anekdot segera muncul di benak.

Bagaimana menemukan Lenin Square?

Hanya orang yang tidak berpendidikan yang akan menjawab pertanyaan ini, bahwa perlu untuk mengalikan tinggi Lenin dengan lebar Lenin.

Orang yang terpelajar tahu untuk mengambil bagian integral dari suatu permukaan.


Menggunakan gnuplot dalam program Anda



Contoh diambil dari stackoverflow dengan sedikit modifikasi saya.



Kode menghasilkan file teks dan secara konstan menyebabkan grafik dibangun kembali. Saya akan melampirkan kode di bawah spoiler agar artikel tidak robek.



Contoh kode C menggunakan gnuplot
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>


float s=10.;
float r=28.;
float b=8.0/3.0;
/* Definimos las funciones */
float f(float x,float y,float z){
    return s*(y-x);
}
float g(float x,float y,float z){
    return x*(r-z)-y;
}
float h(float x,float y,float z){
    return x*y-b*z;
}
FILE *output;
FILE *gp;

int main(){
    gp = popen("gnuplot -","w");
    output = fopen("lorenzgplot.dat","w");
    float t=0.; 
    float dt=0.01;
    float tf=30;
    float x=3.;
    float y=2.;
    float z=0.;
    float k1x,k1y,k1z, k2x,k2y,k2z,k3x,k3y,k3z,k4x,k4y,k4z;
    fprintf(output,"%f %f %f \n",x,y,z);
    fprintf(gp, "splot './lorenzgplot.dat' with lines \n");
/* Ahora Runge Kutta de orden 4 */  
    while(t<tf){
        /* RK4 paso 1 */
        k1x = f(x,y,z)*dt;
        k1y = g(x,y,z)*dt;
        k1z = h(x,y,z)*dt;
        /* RK4 paso 2 */
        k2x = f(x+0.5*k1x,y+0.5*k1y,z+0.5*k1z)*dt;
        k2y = g(x+0.5*k1x,y+0.5*k1y,z+0.5*k1z)*dt;
        k2z = h(x+0.5*k1x,y+0.5*k1y,z+0.5*k1z)*dt;
        /* RK4 paso 3 */
        k3x = f(x+0.5*k2x,y+0.5*k2y,z+0.5*k2z)*dt;
        k3y = g(x+0.5*k2x,y+0.5*k2y,z+0.5*k2z)*dt;
        k3z = h(x+0.5*k2x,y+0.5*k2y,z+0.5*k2z)*dt;
        /* RK4 paso 4 */
        k4x = f(x+k3x,y+k3y,z+k3z)*dt;
        k4y = g(x+k3x,y+k3y,z+k3z)*dt;
        k4z = h(x+k3x,y+k3y,z+k3z)*dt;
        /* Actualizamos las variables y el tiempo */
        x += (k1x/6.0 + k2x/3.0 + k3x/3.0 + k4x/6.0);
        y += (k1y/6.0 + k2y/3.0 + k3y/3.0 + k4y/6.0);
        z += (k1z/6.0 + k2z/3.0 + k3z/3.0 + k4z/6.0);
        /* finalmente escribimos sobre el archivo */

        fprintf(output,"%f %f %f \n",x,y,z);
        fflush(output); 
        usleep(10000);
        fprintf(gp, "replot \n");
        fflush(gp);
        t += dt;
    }
    fclose(gp);
    fclose(output);
    return 0;
}




Kode bekerja dengan sangat sederhana, kami membuka pipa:



gp = popen("gnuplot -","w");


Ini mirip dengan bilah vertikal di bash, ketika kita menulis perintah lain setelah satu perintah, hanya di dalam program. Kami menulis data ke file lorenzgplot.dat. Panggil perintah splot di gnuplot satu kali:



fprintf(gp, "splot './lorenzgplot.dat' with lines \n");


Dan kemudian, saat menambahkan titik baru, kami membuat ulang grafik.



fprintf(gp, "replot \n");


Akibatnya, kita mendapatkan konstruksi lambat yang bagus dari Penarik Lorenz. Di bawah ini adalah video yang diambil hampir sepuluh tahun yang lalu dengan kamera tua, jadi jangan terlalu banyak bersumpah. Yang penting dalam video ini adalah semuanya berfungsi dengan baik pada perangkat keras lama seperti Nokia N800. Diinginkan untuk menontonnya tanpa suara.







Penting untuk dipahami bahwa perintah replot memakan waktu memori dan prosesor dengan sangat baik, artinya, plot seperti ini tidak terlalu memperlambat sistem. Jadi, dengan semua kecintaan pada gnuplot, ini bukanlah cara terbaik untuk menggunakannya. Masalah lainnya adalah jendela ini tidak dapat ditutup atau dipindahkan.



Kesimpulan



Akhirnya, saya ingin menunjukkan video di mana saya mengumpulkan ratusan grafik dari distribusi logaritmik acak dari pendaftaran partikel radioaktif, data nyata dari satu penelitian. Video dapat dan harus ditonton dengan suara.







Dalam artikel ini, saya tidak dapat memberi tahu bahkan seperseribu bagian dari kemampuan plotter ini, kecuali bahwa saya sedikit membiasakan pembaca dengan program ini. Selanjutnya, Anda harus mencari contoh sendiri, baca dokumentasi di situs resmi gnuplot.sourceforge.net atau www.gnuplot.info . Perhatikan contohnya, ada banyak hal yang menarik dan bermanfaat.



Sebagai permulaan, saya juga dapat merekomendasikan Pengenalan singkat tentang gnuplot (rus) . Saya sangat terkejut bahwa program luar biasa seperti itu tidak dipelajari di semua universitas teknik yang setara dengan Latex. Untuk beberapa alasan, kami mempelajari MS Excel dan Word.



Mempelajari gnuplot tidak sulit, saya menghabiskan beberapa hari untuk mencoba mencari tahu dari awal. Tetapi dengan artikel ini, saya yakin semuanya akan lebih cepat untuk Anda. Sekarang saya lupa tentang komplotan Exel / Calc, saya hanya menggunakan gnuplot. Selain itu, saya bahkan tidak tahu sepersepuluh dari semua kemungkinan membuat grafik.



Saya ingin mencatat bahwa ada banyak komplotan lain, tidak lebih buruk dari gnuplot, terutama karena sudah cukup tua. Tapi bagi saya, gnuplot ternyata yang paling sederhana dan terlengkap. Plus, ini adalah plotter yang paling umum, dan ada banyak sekali contoh penggunaannya di web. Terima kasih sudah membaca!






All Articles