Frage

Ich habe eine Reihe von Punktdaten, die eine Kurve definieren, die ich mit Bezier Smooth zeichnen möchte.Ich möchte also den Bereich unterhalb dieser Kurve zwischen einigen Paaren von x-Werten füllen.Wenn ich nur ein Paar x-Werte hätte, wäre das nicht so schwierig, weil ich einen neuen Datensatz definiere und ihn mit Filledcu zeichne.Beispiel:

example of what I want to do

Das Problem ist, dass ich das mehrmals in derselben Handlung machen möchte.

Bearbeiten:Minimales Arbeitsbeispiel:

#!/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

Wobei die Struktur von „Daten“ ist:

x_point y_point

Und mir wurde klar, dass mein Problem darin besteht, dass ich tatsächlich nicht einmal eine Kurve füllen kann, sie scheint gefüllt zu sein, weil die Steigung dort fast konstant ist.

War es hilfreich?

Lösung

Um Teile unterhalb einer Kurve zu füllen, müssen Sie die verwenden filledcurves Stil.Mit der Option x1 Sie füllen den Teil zwischen der Kurve und der x-Achse.

Um nur Teile der Kurve zu füllen, müssen Sie Ihre Daten filtern, d. h.Geben Sie den x-Werten einen Wert von 1/0 (ungültiger Datenpunkt), wenn sie außerhalb des gewünschten Bereichs liegen, andernfalls der korrekte Wert aus der Datendatei.Am Ende zeichnen Sie die Kurve selbst auf:

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'

Das füllt das Sortiment [-1:0.5] Und [0.2:0.8].

Um ein funktionierendes Beispiel zu geben, verwende ich den speziellen Dateinamen +:

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'

Mit dem Ergebnis (mit 4.6.4):

enter image description here

Wenn Sie eine Glättung verwenden müssen, wirkt sich der Filter je nach gefiltertem Teil möglicherweise unterschiedlich auf die Datenkurve aus.Sie können die geglätteten Daten zunächst in eine temporäre Datei schreiben und diese dann für das „normale“ Plotten verwenden:

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'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top