Gnuplot填充曲线翻转轴

时间:2018-06-04 08:53:32

标签: gnuplot

有一种样式可以填充x的两个函数之间的空间。 例如,可以找到这种图的例子。在http://gnuplot.sourceforge.net/demo/fillbetween.html 有没有办法制作类似的情节,但有x和y轴翻转? 这是曲线的理想形状(当然没有旋转/镜像标签,标题和图例)......

Approximate desired look

可以使用闭合轮廓(如此处http://www.gnuplot.info/demo_svg_cvs/fillcrvs.html的最后一个示例)来完成,但这需要重新调整数据文件。还有其他选择吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

你不能直接这样做。来自help filledcurves

  

第三个变量填充在同一组中采样的两条曲线之间的区域    x坐标。它需要三列输入数据(x,y1,y2)。

我认为你不能直接指定(y,x1,x2)。作为一种解决方法,您可以将y轴和较大的函数之间的区域设置为某种颜色,然后将y轴和较小的函数之间的区域填充为白色:

x1(y) = cos(y)+1
x2(y) = cos(y)+2
xmax(y) = (x1(y) > x2(y) ? x1(y) : x2(y))
xmin(y) = (x1(y) < x2(y) ? x1(y) : x2(y))

plot '+' using (xmax($1)):1 with filledcurve y1, \
     '+' using (xmin($1)):1 with filledcurve y1 fillcolor rgb "white"

enter image description here

如果两个函数中的一个或两个都是负数,则可能需要稍微调整一下。

答案 1 :(得分:0)

使用gnuplot> = 5.2时,它可以进行进一步的调整,因为它允许使用数组。 以下代码显示了一种变通方法,如何实现垂直方向的曲线之间的填充曲线。您甚至可以使用透明度。如果下载附件的PNG,您会发现它实际上具有透明背景。解决方法的基本思想是制作封闭区域并填充它们。为此,您需要反转一个边框,将边框连接起来并绘制填充的边框。不幸的是,gnuplot没有功能来反转列中的数据点,因此您必须自己执行一个特殊的过程。

代码:

### "Vertical" filledcurves
reset session

# create some dummy data
N = 50
set samples N
set xrange [-5:5]
set table $Data
    plot '+' u (sin($1)):1:(rand(0)*0.3+1) with table
unset table

# put Borders into arrays
stats $Data nooutput
RowCount = STATS_records
array BorderX1[RowCount]
array BorderX2[RowCount]
array BorderY[RowCount]
set table $Dummy
    plot $Data u (BorderX1[$0+1]=$1-$3):(BorderX2[$0+1]=$1+$3):(BorderY[$0+1]=$2) with table
unset table

# reverse BorderX2 and merge borders
set samples RowCount
set table $Border
    plot '+' u (BorderX1[$0+1]):(BorderY[$0+1]) with table
    plot '+' u (BorderX2[RowCount-$0]):(BorderY[RowCount-$0]) with table
unset table

# make the plot
set object 1 rect at 0,-3 size 10,0.5 fs solid 1.0 fc rgb "black" back
set yrange[-5:5]
plot \
    $Border u 1:2 w filledcurves fc rgb "#AA00FF00" not,\
    $Border u ($1*1.5):2 w filledcurves fc rgb "#AAFFFF00" not,\
    $Data u ($1+2.5):2 w filledcurves y2 fc rgb "brown" not,\
    $Data u 1:2 w l lw 8 lc rgb "blue" not,\
    '+' u 1:(cos($1)-0.5):(cos($1)+0.5) w filledcurves lc rgb "grey" not,\
    '+' u 1:(cos($1)):(1) w l lw 3 dt 2 lc rgb "white" not
### end of code

结果:

enter image description here