Eu sei como criar um histograma (basta usar "with boxes") no gnuplot se o meu arquivo .dat já tiver dados em bin corretamente. Existe uma maneira de obter uma lista de números e fazer com que o gnuplot forneça um histograma com base nos intervalos e tamanhos de lixeira fornecidos pelo usuário?
202
Respostas:
sim, e é rápido e simples, embora muito oculto:
confira
help smooth freq
para ver por que o acima faz um histogramapara lidar com intervalos, basta definir a variável xrange.
fonte
set boxwidth binwidth
acima. Foi realmente útil para mim.Tenho algumas correções / adições à resposta muito útil do Born2Smile:
set boxwidth binwidth
bin
função:bin(x,width)=width*floor(x/width) + width/2.0
fonte
bin(x,width)=width*floor(x/width) + binwidth/2.0
(cálculos de ponto flutuante)bin(x,width)=width*floor(x/width) + width/2.0
. Se estamos passandowidth
como argumento, use-o. :-)Tenha muito cuidado: todas as respostas desta página estão implicitamente tomando a decisão de onde o compartimento começa - a borda esquerda da bandeja mais à esquerda, se você quiser - fora das mãos do usuário. Se o usuário estiver combinando alguma dessas funções para classificar dados com sua própria decisão sobre o início da classificação (como é feito no blog vinculado acima), as funções acima estão incorretas. Com um ponto de partida arbitrário para classificar 'Min', a função correta é:
Você pode ver por que isso está correto seqüencialmente (ajuda a desenhar algumas caixas e um ponto em algum lugar em uma delas). Subtraia Min do seu ponto de dados para ver a que distância ele está. Em seguida, divida por largura de caixa para trabalhar efetivamente em unidades de 'bandejas'. Em seguida, 'coloque o piso' no resultado para ir para a borda esquerda dessa bandeja, adicione 0,5 para ir para o meio da bandeja, multiplique pela largura para que você não esteja mais trabalhando em unidades de caixas, mas em uma escala absoluta novamente e, finalmente, adicione novamente o deslocamento mínimo que você subtraiu no início.
Considere esta função em ação:
por exemplo, o valor 1.1 realmente cai no compartimento esquerdo:
A resposta do Born2Smile só está correta se os limites do compartimento ocorrerem em (n + 0,5) * largura do bin (onde n é executado sobre números inteiros). A resposta do mas90 está correta apenas se os limites do compartimento ocorrerem em n * largura de caixa.
fonte
Deseja traçar um gráfico como este? sim? Então você pode dar uma olhada no artigo do meu blog: http://gnuplot-surprising.blogspot.com/2011/09/statistic-analysis-and-histogram.html
Linhas principais do código:
fonte
Como de costume, o Gnuplot é uma ferramenta fantástica para plotar gráficos de aparência agradável e pode ser feita para executar todos os tipos de cálculos. No entanto , o objetivo é plotar dados em vez de servir como calculadora, e geralmente é mais fácil usar um programa externo (por exemplo, Octave) para fazer cálculos mais "complicados", salvar esses dados em um arquivo e usar o Gnuplot para produzir o gráfico. Para o problema acima, verifique se a função "hist" está em Octave
[freq,bins]=hist(data)
, e plote isso no Gnuplot usandofonte
Achei essa discussão extremamente útil, mas experimentei alguns problemas de "arredondamento".
Mais precisamente, usando uma largura de caixa de 0,05, notei que, com as técnicas apresentadas aqui acima, os pontos de dados que lêem 0,1 e 0,15 caem na mesma bandeja. Esse (comportamento obviamente indesejado) provavelmente ocorre devido à função "andar".
A seguir, é minha pequena contribuição para tentar contornar isso.
Este método recursivo é para x> = 0; pode-se generalizar isso com mais declarações condicionais para obter algo ainda mais geral.
fonte
Não precisamos usar o método recursivo, pode ser lento. Minha solução é usar uma função definida pelo usuário, em vez da função instrinsic int ou floor.
Esta função dará
rint(0.0003/0.0001)=3
, enquantoint(0.0003/0.0001)=floor(0.0003/0.0001)=2
.Por quê? Por favor, veja a função Perl int e zeros de preenchimento
fonte
Eu tenho uma pequena modificação na solução do Born2Smile.
Eu sei que isso não faz muito sentido, mas você pode querer apenas por precaução. Se seus dados forem inteiros e você precisar de um tamanho de lixeira flutuante (talvez para comparação com outro conjunto de dados ou densidade de plotagem em uma grade mais fina), será necessário adicionar um número aleatório entre 0 e 1 no piso interno. Caso contrário, haverá picos devido a erro de arredondamento.
floor(x/width+0.5)
não funcionará porque criará um padrão que não é fiel aos dados originais.fonte
Com relação às funções de binning, eu não esperava o resultado das funções oferecidas até o momento. Ou seja, se minha largura de caixa for 0,001, essas funções centralizarão as caixas em 0,0005 pontos, enquanto eu acho que é mais intuitivo centralizá-las nos limites de 0,001.
Em outras palavras, eu gostaria de ter
A função de binning que criei é
Aqui está um script para comparar algumas das funções bin oferecidas a esta:
e aqui está a saída
fonte