
Certamente, muitos de vocês que folhearam publicações científicas ocidentais viram gráficos bonitos e simples. Talvez alguns de vocês tenham se perguntado o que esses especialistas visualizam seus dados. E agora existe uma ferramenta gráfica linda e muito simples que está em quase todo lugar: Windows, linux, android e outros, tenho certeza que existe até um DOS. É confiável, simples e permite que você apresente quaisquer dados tabulares de texto na forma de belos gráficos.
Por que gnuplot?
Se você já leu meus artigos " Teste de velocidade simultâneo em vários modems LTE ", " Oscilações harmônicas ", " Crie um gerador de números aleatórios em hardware "), deve ter notado belos gráficos.

Gráfico da postagem sobre o gerador de números aleatórios

Foto do post sobre modems speetest Os
gráficos são simples e interessantes. A vantagem mais valiosa do gnuplot é que para plotá-los você só precisa de um arquivo de texto com os dados brutos, gnuplot em seu sistema operacional favorito (embora OpenWRT) e seu editor de teste
À primeira vista, pode parecer que o gnuplot é mais difícil de usar para plotagem do que o MS Excel. Mas só parece que sim, o limite de entrada é um pouco maior (você não pode usar o mouse para clicar nele, você precisa ler a documentação aqui), mas na prática é muito mais fácil e conveniente. Eu escrevi um roteiro uma vez e o usei durante toda a minha vida. É realmente muito mais difícil para mim traçar um gráfico no Exel, onde tudo não é lógico, do que no gnuplot. E a principal vantagem do gnuplot é que você pode incorporá-lo aos seus programas e visualizar os dados instantaneamente. Além disso, o gnuplot sem problemas constrói um gráfico a partir de um arquivo de 30 gigabytes de dados estatísticos, enquanto o Exel simplesmente travou e não pôde abri-lo.
As vantagens do gnuplot incluem o fato de que pode ser facilmente integrado ao código em linguagens de programação padrão. Existem bibliotecas prontas para várias linguagens, eu pessoalmente me deparei com php e python. Assim, você pode gerar gráficos diretamente de seu programa.
Por exemplo, direi que minha boa amiga, quando estava escrevendo sua dissertação, dominava o gnuplot (de minha apresentação). Ela nunca é uma técnica, mas ela descobriu em uma noite. Depois disso, ela construiu gráficos apenas ali, e o nível de seu trabalho começou a diferir favoravelmente em relação ao background de colegas que usavam o Excel. Para mim, pessoalmente, um indicador da alta qualidade do trabalho científico são os gráficos construídos por programas especializados.
Assim, o gnuplot é simples, acessível e bonito. Vamos mais longe.
Gnuplot - aplicativo
Existem duas maneiras de trabalhar com o gnuplot: modo de comando e modo de execução de script. Eu recomendo usar o segundo modo imediatamente, pois é o mais conveniente e rápido. Além disso, a funcionalidade é absolutamente a mesma.
Mas para começar, rodamos o gnuplot no modo de comando. Execute o gnuplot a partir da linha de comando ou da forma que estiver disponível para o seu sistema operacional. Você pode começar a treinar nem mesmo lendo este artigo, mas desde o primeiro comando de ajuda . Ela vai mostrar uma ajuda linda e você pode ir mais longe. Mas veremos os destaques.
O gráfico é traçado pelo comando plot . Como parâmetros de comando, você pode especificar uma função ou o nome do arquivo de dados. Bem como qual coluna de dados usar e como conectar os pontos, como denotá-los, etc. Vamos ilustrar.
gnuplot> plot sin(x)

Depois de executar o comando, será aberta uma janela onde haverá um gráfico seno com assinaturas padrão. Vamos melhorar este gráfico e descobrir algumas opções adicionais ao mesmo tempo.
Vamos assinar os eixos.
set xlabel "X"
Especifica o rótulo para o eixo de abscissa.
set ylabel "Y"
Especifica o rótulo para o eixo das ordenadas.
Vamos adicionar uma grade para mostrar onde o gráfico é construído.
set grid
Não gosto do fato de que a senoide no eixo das ordenadas repousa no final do gráfico, então definiremos os limites dos valores aos quais o gráfico será limitado.
set yrange [-1.1:1.1]
Assim, o gráfico será traçado desde o valor mínimo de -1,1 até o valor máximo de 1,1.
Da mesma forma, defino o intervalo da abscissa de modo que apenas um período da sinusóide seja visível.
set xrange[-pi:pi]
Precisamos adicionar um título à nossa programação para que tudo seja Feng Shui.
set title "Gnuplot for habr" font "Helvetica Bold, 20"
Observe que você pode definir fontes e seus tamanhos. Consulte a documentação do gnuplot para saber quais fontes podem ser usadas.
E finalmente, além do seno no gráfico, vamos desenhar também o cosseno e também definir o tipo de linha e sua cor. E também adicionar legendas, o que estamos desenhando.
plot sin(x) title "sinux" lc rgb "red", cos(x) title "cosinus" lc rgb "green"
Aqui desenhamos dois gráficos em uma tela, em vermelho e verde. Em geral, há muitas opções de linhas (linha pontilhada, traço, sólido), larguras de linha, cores. Bem como tipos de pontos. Meu objetivo é apenas demonstrar o leque de possibilidades. Vamos reunir todos os comandos em uma pilha e executá-los sequencialmente. Para redefinir as configurações anteriores, digite redefinir.
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"
Como resultado, temos essa beleza.

Não é mais uma pena publicar a programação em uma revista científica.
Se você honestamente repetiu tudo isso depois de mim, deve ter notado que inserir manualmente todas as vezes, até mesmo copiar, de alguma forma não é comme il faut. Mas este é um script pronto? Então, vamos fazê-lo!
Saia do modo de comando com o comando exit e crie um arquivo:
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"
Nós o tornamos executável e o executamos.
chmod +x testsin.gpi
./testsin.gpi
Como resultado, obtemos a mesma janela com gráficos. Se “-persist” não for adicionado ao título, a janela será fechada automaticamente após a execução do script.
Mas muitas vezes não é muito necessário criar uma janela, além disso, nem sempre é conveniente usá-la e você pode trabalhar em um sistema operacional sem uma GUI. Com muito mais frequência, você precisa receber arquivos gráficos. Pessoalmente, prefiro o formato vetorial pós-escrito, já que com um grande número de pontos, você pode dar zoom em diferentes partes do gráfico sem perder qualidade. E também o visualizador no Linux atualiza automaticamente a janela com o gráfico quando o arquivo postscript é alterado, o que também é muito conveniente.
Para enviar dados para um arquivo e não para a tela, você precisa reatribuir o terminal.
set terminal png size 800, 600
set output "result.png"
Como você pode imaginar, indicamos o tipo de arquivo, sua resolução e, a seguir, indicamos o nome do arquivo. Adicione essas duas linhas ao início do nosso script e teremos essa imagem na pasta atual.

Para salvar em postscript, você precisa usar os seguintes comandos:
set terminal postscript eps enhanced color solid
set output "result.ps"
Dados reais
Senos, cossenos são certamente legais de desenhar, mas ainda assim desenhar dados reais é muito mais interessante! Deixe-me lembrá-lo de uma tarefa recente sobre a qual escrevi um artigo - exibir gráficos da velocidade da Internet em longos períodos de tempo. O formato dos dados foi o seguinte.
Operador; #Teste; Encontro; Tempo; Coordenadas; Baixe Mb / s; Upload Mb / s; ping; Testeserver
Rostelecom; 0; 05/21/2020; 09: 56: 00; NA, NA; 3,7877656948451692; 5,231226008184113; 132,227; MaximaTelecom (Moscou) [0,12 km]: 132,227 ms
Rostelecom; 1; 05/21/2020; 10: 01: 02; NA, NA; 5,274994541394363; 5,1088572634075815; 127,52; MaximaTelecom (Moscou) [0,12 km]: 127,52 ms
Rostelecom; 2; 21/05/2020; 10: 04: 35; NA, NA; 3,61044819424076; 4,624132180211938; T máximo 135,456; 0,12 km]: 135,456 ms
Pode ser visto que temos um ponto e vírgula como separador, precisamos mostrar a velocidade de download, a velocidade de upload depende do tempo. Além disso, se você prestar atenção à data e hora estão em colunas diferentes. Agora vou te contar como eu consegui contornar isso. Citarei imediatamente o script pelo qual o gráfico foi construído.
#! /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"
No início do arquivo, configuramos o arquivo de saída postscript (ou png, se necessário).
definir separador de arquivo de dados ';' - definimos o caractere delimitador. As colunas são separadas por espaço por padrão, mas o arquivo csv oferece muitas opções de delimitador e você deve ser capaz de usar todas elas.
definir grade xtics ytics - definir a grade (você pode definir a grade apenas ao longo de um eixo).
definir o tempo xdata é um ponto importante, estamos falando sobre o fato de que no eixo X o formato dos dados será o tempo.
definir timefmt '% d.% m.% Y;% H:% M:% S ' - definir o formato dos dados de hora. Observe que o caractere delimitador de coluna (";") está incluído no formato de hora, portanto, trataremos duas colunas como uma.
Definimos os rótulos dos eixos e do gráfico. Em seguida, construímos um gráfico.
traçar "Rostelecom.csv" usando 3: 6 com as linhas do título "Download", '' usando 3: 7 com as linhas do título "Upload" - plotamos a velocidade de download e a velocidade de upload em um gráfico. Usando 3: 6 é o número da coluna em nosso arquivo de dados de origem, a partir do qual estamos construindo (X: Y).
Em seguida, plotamos o gráfico de ping da mesma maneira. O gráfico resultante será semelhante a este.

Esta é uma captura de tela do postscript. As linhas retas no gráfico se devem ao fato de que existem lacunas de dados. Aqui está um exemplo muito real de plotagem.
E 3D ???
Você quer 3D? Eu os tenho!
Pensei por muito tempo que exemplo de gráficos tridimensionais dar, e não encontrei nada melhor do que visualizar a imagem. Na verdade, em essência, uma imagem é um gráfico tridimensional, onde o brilho do pixel é a coordenada z. Então, vamos brincar de hooligan.
Tire a foto mais famosa de Einstein.

E vamos fazer um gráfico disso. Para fazer isso, converta-o para o formato pgm ASCII e remova todos os espaços, substituindo-o por uma nova linha, com um comando tão simples.
convert Einstein.jpg -compress none pgm:- | tr -s '\012\015' ' ' | tr -s ' ' '\012'> outfile.pgm
Para aqueles que não entendem o que está acontecendo aqui, eu explico: usamos imagemagic para converter a imagem para o formato pgm e, em seguida, usamos tr para substituir o retorno de carro por uma nova linha para um espaço e, em seguida, todos os espaços para um retorno de carro e salvamos tudo em outfile. pgm. Qualquer pessoa com dificuldades pode abrir o arquivo no gimp e exportá-lo como pgm-ASCII.
Depois disso, abra o arquivo resultante com nosso editor favorito
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()
Salve-o como convert.py e execute:
python convert.py > res.txt
É isso, agora res.txt contém as coordenadas do Einstein ... Hmm, ou melhor, as coordenadas da imagem dele. Bem, em geral, essa é a ideia :).
…
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
...
Arquivo de amostra.
O script para construir essa beleza é assim.
#! /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
Antes de analisarmos o script, se você repetir isso, eu recomendo fortemente que você execute as linhas do script no modo de comando para que possa girar o gráfico com o mouse (é claro, sem especificar o terminal definido). É muito legal!
Primeiro, definimos o tipo de dados de saída, bem como os limites dos dados. As bordas são definidas de acordo com o tamanho da imagem, e mais, a partir da parte inferior, separei 256 caracteres ao longo do eixo Z para que a projeção da imagem seja visível. Em seguida, dirigimos o gráfico, rotulamos os eixos. Usando o comando unset key - eu desabilito as legendas (não é necessário no gráfico). E aí vem a verdadeira magia!
definir paleta cinza - definimos a paleta. Se deixado como padrão, o gráfico será colorido como em um termovisor. Quanto mais alto, mais amarelo é o ponto, mais baixo, mais escuro é o vermelho.
definir hidden3d- por assim dizer, estica a superfície curva (remove as linhas), formando assim uma bela superfície convexa.
definir pm3d em bs - ative o estilo de desenho de dados 3D, que desenha dados com uma coordenada de grade e cor. Leia mais na documentação, uma descrição mais detalhada está além do escopo do artigo.
definir dgrid3d 100,100 qnorm 2 - definir o tamanho das células da grade para 100x100 e o anti-aliasing entre as células. O valor 100x100 já é muito grande e o programa é muito lento. qnorm 2 é anti-aliasing (interpolação de dados entre células).
splot "./res.txt" com l - desenhe o gráfico resultante. "Com l" significa desenhar o gráfico com linhas. Este é um pequeno hack, porque os pontos são visíveis no gráfico (pequenos pontos podem ser definidos).
Após o lançamento, esperamos um pouco, e obtemos um "baixo-relevo" poligonal. Experimente experimentar as configurações para obter outras opções de renderização.

A imagem está no modo de comando após ser girada.
Uma anedota imediatamente vem à mente.
Como encontrar a Praça Lenin?
Só uma pessoa sem educação responderá a esta pergunta, que é necessário multiplicar a altura de Lenin pela largura de Lenin.
Uma pessoa educada sabe como assumir uma integral sobre uma superfície.
Usando o gnuplot em seus programas
O exemplo é tirado de stackoverflow com minhas pequenas modificações.
O código gera um arquivo de texto e constantemente faz com que o gráfico seja reconstruído. Vou anexar o código sob o spoiler para não rasgar o artigo.
Amostra de código C usando 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;
}
O código funciona de forma muito simples, abrimos um pipe:
gp = popen("gnuplot -","w");
É semelhante à barra vertical do bash, onde escrevemos outro comando após um comando, apenas dentro do programa. Gravamos os dados no arquivo lorenzgplot.dat. Chame o comando splot no gnuplot uma vez:
fprintf(gp, "splot './lorenzgplot.dat' with lines \n");
E então, ao adicionar um novo ponto, reconstruímos o gráfico.
fprintf(gp, "replot \n");
Como resultado, temos uma construção lenta muito boa do Atrator Lorenz. Abaixo está um vídeo feito quase dez anos atrás com uma câmera velha, então não xingue muito. O importante no vídeo é que tudo funciona muito bem em um hardware tão antigo como o Nokia N800. É desejável assistir sem som.
É importante entender que o comando replot consome muito bem a memória e o tempo do processador, ou seja, tal plotagem não desacelera tanto o sistema. Então, com todo o amor pelo gnuplot, essa não é a melhor maneira de usá-lo. Outro problema é que essa janela não pode ser fechada ou movida.
Conclusão
Por fim, quero mostrar um vídeo no qual coletei centenas de gráficos da distribuição logarítmica aleatória de registros de partículas radioativas, dados reais de um estudo. O vídeo pode e deve ser assistido com som.
Neste artigo, não pude contar nem mesmo uma milésima parte das capacidades deste plotter, exceto que familiarizei um pouco o leitor com este programa. Em seguida, você mesmo deve procurar exemplos, ler a documentação no site oficial gnuplot.sourceforge.net ou www.gnuplot.info . Certifique-se de olhar os exemplos, há muitas coisas interessantes e úteis.
Para começar, também posso recomendar uma breve introdução ao gnuplot (rus) . Estou sinceramente surpreso que um programa tão maravilhoso não seja estudado em todas as universidades técnicas da mesma forma que o Latex. Por alguma razão, aprendemos MS Excel e Word.
Aprender gnuplot não é difícil, passei literalmente alguns dias tentando descobrir do zero. Mas com este artigo, acredito que tudo ficará mais rápido para você. Agora eu esqueci de quaisquer plotters Exel / Calc, eu só uso o gnuplot. Além disso, não conheço nem um décimo de todas as possibilidades de traçar gráficos.
Quero observar que existem muitos outros plotters, não piores do que o gnuplot, especialmente por ser bastante antigo. Mas para mim o gnuplot acabou sendo o mais simples e abrangente. Além disso, é o plotter mais comum e há um grande número de exemplos de seu uso na web. Obrigado por ler!
