Pergunta

Eu tenho um conjunto de "dados" de pontos que definem uma curva que desejo traçar com suavidade bezier.Então, quero preencher a área abaixo dessa curva entre alguns pares de valores de x.Se eu tivesse apenas um par de valores de x, não seria tão difícil porque eu defino um novo conjunto de dados e o ploto com fillcu.Exemplo:

example of what I want to do

O problema é que quero fazer isso várias vezes na mesma trama.

Editar:Exemplo mínimo de trabalho:

#!/usr/bin/gnuplot
set terminal wxt enhanced font 'Verdana,12'

set style fill transparent solid 0.35 noborder
plot 'data' using 1:2 smooth sbezier with lines ls 1
pause -1

Onde a estrutura dos 'dados' é:

x_point y_point

E percebi que o meu problema é que na verdade não consigo preencher nem uma curva, parece que está preenchida porque a inclinação ali é quase constante.

Foi útil?

Solução

Para preencher partes abaixo de uma curva, você deve usar o filledcurves estilo.Com a opção x1 você preenche a parte entre a curva e o eixo x.

Para preencher apenas partes da curva, você deve filtrar seus dados, ou seja,dê aos valores de x um valor de 1/0 (ponto de dados inválido) se estiverem fora do intervalo desejado e, caso contrário, o valor correto do arquivo de dados.No final você traça a própria curva:

set style fill transparent solid 0.35 noborder
filter(x,min,max) = (x > min && x < max) ? x : 1/0
plot 'data' using (filter($1, -1, -0.5)):2 with filledcurves x1 lt 1 notitle,\
     ''  using (filter($1, 0.2, 0.8)):2 with filledcurves x1 lt 1 notitle,\
     ''  using 1:2 with lines lw 3 lt 1 title 'curve'

Isso preenche o intervalo [-1:0.5] e [0.2:0.8].

Para dar um exemplo prático, uso o nome de arquivo especial +:

set samples 100
set xrange [-2:2]
f(x) = -x**2 + 4

set linetype 1 lc rgb '#A3001E'

set style fill transparent solid 0.35 noborder
filter(x,min,max) = (x > min && x < max) ? x : 1/0
plot '+' using (filter($1, -1, -0.5)):(f($1)) with filledcurves x1 lt 1 notitle,\
     ''  using (filter($1, 0.2, 0.8)):(f($1)) with filledcurves x1 lt 1 notitle,\
     ''  using 1:(f($1)) with lines lw 3 lt 1 title 'curve'

Com o resultado (com 4.6.4):

enter image description here

Caso seja necessário utilizar algum tipo de suavização, o filtro poderá afetar a curva de dados de forma diferente, dependendo da parte filtrada.Você pode primeiro gravar os dados suavizados em um arquivo temporário e depois usá-lo para plotagem 'normal':

set table 'data-smoothed'
plot 'data' using 1:2 smooth bezier
unset table

set style fill transparent solid 0.35 noborder
filter(x,min,max) = (x > min && x < max) ? x : 1/0
plot 'data-smoothed' using (filter($1, -1, -0.5)):2 with filledcurves x1 lt 1 notitle,\
     ''  using (filter($1, 0.2, 0.8)):2 with filledcurves x1 lt 1 notitle,\
     ''  using 1:2 with lines lw 3 lt 1 title 'curve'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top