【问题标题】:gnuplot: Is there a way to plot vertical lines spatially?gnuplot:有没有办法在空间上绘制垂直线?
【发布时间】:2021-01-06 13:37:14
【问题描述】:

我正在尝试针对距离 (m) 的 x 轴和高度 (m) 的 y 轴绘制变量的几条垂直线,例如速度 (m/s)。每个速度剖面都作为在不同位置测量的高度的函数。因此,目的是观察这些轮廓如何在空间上发生变化。

我曾考虑通过将垂直轮廓移动与测量每个轮廓的位置相对应的 x 分量来解决此问题。因此,如果我们假设第二个 x 轴描绘速度,我希望它在每个测量点重置为 0。

预期结果草图(忽略黑色):

有没有人知道正确的做法是什么?我正在使用 gnuplot,但欢迎使用任何替代方案。提前致谢。

编辑:

下面你可以看看我使用的数据(文件verProfiles在代码sn-p中)

z(m) U_1(m/s)* U_4(m/s)* U_8(m/s)*
0.50 1.66 1.82 1.95
0.75 1.85 2.04 2.11
1.00 2.00 2.20 2.18
1.25 2.12 2.34 2.21
1.50 2.23 2.36 2.22
1.75 2.33 2.37 2.22
2.00 2.41 2.38 2.22

*上表中 U 变量名称中的数字 1、4 和 8 表示进行测量的位置,因此每个 U 轮廓应该开始以及图中相应的 x 点。

到目前为止,我编写并生成 false 图的 gnuplot 代码是:

outName="U_test.png"

set terminal pngcairo font "helvetica,20" size 800, 1000
set xtics nomirror
set x2tics
set xrange [0:10] noreverse nowriteback
set autoscale x2fix
set yrange [0:2.5]
set grid
set mxtics 4
set mx2tics 4
set mytics 4
set key left top
set key samplen 2
set key spacing 0.75
set xlabel  "x"
set x2label "Ux [m s^{-1}]"
set ylabel "z"
set output "$outName"

inp0="verProfiles"

plot \
    inp0 u 2:1 t "U_1" axes x2y1 w lp ps 2 lw 2 lc rgb "#009E73", \
    inp0 u 3:1 t "U_4" axes x2y1 w lp ps 2 lw 2 lc rgb "#3F8B77", \
    inp0 u 4:1 t "U_8" axes x2y1 w lp ps 2 lw 2 lc rgb "#7EA99E"

生成的假图是:

【问题讨论】:

  • 欢迎来到 StackOverflow!如果我们不知道您的数据格式是什么样的,就很难提出任何建议。请提供示例数据,以防您有一些 gnuplot 代码。
  • 你好,你有每个速度和高度的x分量吗?
  • 您好,感谢您的关注。我根据@theozh 评论编辑了我的帖子。速度剖面的 x 分量分别为 1、4 和 8 米,但任何抽象数字都应该有效。

标签: plot graph gnuplot


【解决方案1】:

假设我已正确理解您的意图,这就是我的建议。 您希望通过148 偏移您的x 数据,因此您必须将这些值添加到您的列$2$3$4。 如果我正确理解了您的 0 m/s 草图,您还想从中减去第一个速度值。 如果我错了,请纠正我。 因此,您采用伪列 0(检查 help pseudocolumns),它基本上是从 0 开始的行号。如果 $0==0(检查三元运算符 help ternary)您分配列的当前值(仅第一个值)到一个变量,例如xoff=$2并从列中的所有后续值中减去它。由于您有标题,因此您必须跳过一行,即skip 1

如果您希望顶部的多个 x 轴都从 0 开始,这可以使用箭头和标签来完成,也可以根据您的实际需要使用多图来完成(检查 help multiplot)。

检查以下作为起点:

代码:

### plotting with different offsets
reset session

$Data <<EOD
z(m)  U_1(m/s)*  U_4(m/s)*  U_8(m/s)*
0.50       1.66       1.82       1.95
0.75       1.85       2.04       2.11
1.00       2.00       2.20       2.18
1.25       2.12       2.34       2.21
1.50       2.23       2.36       2.22
1.75       2.33       2.37       2.22
2.00       2.41       2.38       2.22
EOD

set xrange[0:10]
set xtics 1
set yrange [0.3:2.4]
set grid xtics, ytics

vs = "1 4 8"
set for [v in vs] arrow from v, graph 0 to v, graph 1 lw 1.5 lc "black" dt 2 nohead

plot $Data u ($0==0?xoff=$2:0, $2+1-xoff):1 skip 1 w lp ps 1.5 lw 2 pt 7 lc "red"   ti "U_1", \
     ''    u ($0==0?xoff=$3:0, $3+4-xoff):1 skip 1 w lp ps 1.5 lw 2 pt 7 lc "green" ti "U_4", \
     ''    u ($0==0?xoff=$4:0, $4+8-xoff):1 skip 1 w lp ps 1.5 lw 2 pt 7 lc "black" ti "U_8"
### end of code

结果:

加法:

也许现在我对您可能想要的东西有了更好的了解。 我猜你“只是”希望在“主”图中的定义位置有子图。 gnuplot 提供了multiplot(检查help multiplot)的功能,它将多个图彼此相邻或重叠放置。 您可以定义每个子图的原点(检查help origin)和大小(检查help size)。 但是,子图的坐标和大小以屏幕坐标给出。 现在的问题是:如何将绘图放置在相对于第一个绘图的所需位置? 使用标签、箭头和对象,您可以使用屏幕、图形和轴坐标(检查help coordinates),但我不知道您可以使用上一个绘图的轴坐标。 因此,您必须使用一些内部 gnuplot 变量 GPVAL_... 自己计算这些位置。它看起来很复杂,但只是一些坐标变换。

代码:

### plotting with different offsets
reset session

$Data <<EOD
z(m)  U_1(m/s)*  U_4(m/s)*  U_8(m/s)*
0.50       1.66       1.82       1.95
0.75       1.85       2.04       2.11
1.00       2.00       2.20       2.18
1.25       2.12       2.34       2.21
1.50       2.23       2.36       2.22
1.75       2.33       2.37       2.22
2.00       2.41       2.38       2.22
EOD

set for [v in "1 4 8"] arrow from v, graph 0 to v, graph 1 lw 1.5 lc "black" dt 2 nohead

XFirstToGrphRel(x) = (x-MainXMin)/(MainXMax - MainXMin)   # relative position to graph 
YFirstToGrphRel(y) = (y-MainYMin)/(MainYMax - MainYMin)
PosX(x) = XminScrRel+GraphInScrSizeX*XFirstToGrphRel(x)   # screen positon of the subplot
PosY(y) = YminScrRel+GraphInScrSizeY*YFirstToGrphRel(y)
SizeX(dx) = GraphInScrSizeX*dx/(MainXMax - MainXMin)      # screen size of a subplot 
SizeY(dy) = GraphInScrSizeY*dy/(MainYMax - MainYMin)

set multiplot 

    set xlabel "x / m"
    set xrange[0:12]
    set xtics 1
    set ylabel "z / m"
    set yrange [0.3:2.4]
    set ytics 0.5
    set grid xtics, ytics

    plot 0 w p ps 0 notitle    # plot nothing, just background plot
    # store the current terminal values for later use
    MainXMin = GPVAL_X_MIN
    MainXMax = GPVAL_X_MAX
    MainYMin = GPVAL_Y_MIN
    MainYMax = GPVAL_Y_MAX
    GraphInScrSizeX = real(GPVAL_TERM_XMAX-GPVAL_TERM_XMIN)/GPVAL_TERM_XSIZE*GPVAL_TERM_SCALE  # real() to avoid integer division
    GraphInScrSizeY = real(GPVAL_TERM_YMAX-GPVAL_TERM_YMIN)/GPVAL_TERM_YSIZE*GPVAL_TERM_SCALE
    XminScrRel = real(GPVAL_TERM_XMIN)/GPVAL_TERM_XSIZE*GPVAL_TERM_SCALE   
    YminScrRel = real(GPVAL_TERM_YMIN)/GPVAL_TERM_YSIZE*GPVAL_TERM_SCALE

    unset arrow
    set margins 0,0,0,0
    unset xlabel
    unset xtics
    set x2label "v / m/s"
    set x2range [0:2.5]
    set x2tics 0.5 offset 0.5
    unset ylabel
    set format y ""
    set yrange [0.5:2.0]
    set grid x2tics, ytics
    
    set object 1 rect from graph 0, graph 0 to graph 1, graph 1 behind fc "white"
    set size SizeX(2),SizeY(1.5)

    set origin PosX(1),PosY(0.5)
    plot $Data u 2:1 axes x2y1 w lp pt 7 lc "red" notitle
    
    set origin PosX(4.0),PosY(0.5)
    plot $Data u 3:1 axes x2y1 w lp pt 7 lc "green" notitle
    
    set origin PosX(8.0),PosY(0.5)
    plot $Data u 4:1 axes x2y1 w lp pt 7 lc "blue" notitle
    
unset multiplot
### end of code

结果:

【讨论】:

  • 这是一项有趣的工作。提供的数据与草图不符。草图中的 0 值表明垂直虚线作为速度剖面的原点。因此,正值位于虚线的右侧,而负值位于左侧。我认为与其减去第一个值,我可以将每个值乘以比例因子以避免大数字(大于最大 x 分量)。
  • @petrosca 我想使用multiplot 可能会更好,因为据我了解,您希望在“主”图中对齐子图。查看修改后的答案。
  • @petrosca 更笼统,请参见此处:stackoverflow.com/a/65640036/7295599
猜你喜欢
  • 2021-09-19
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多