gnuplot:有没有办法在空间上绘制垂直线? [英] gnuplot: Is there a way to plot vertical lines spatially?

查看:75
本文介绍了gnuplot:有没有办法在空间上绘制垂直线?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图绘制一个变量的几条垂直线,相对于距离的x轴(m)和高度的y轴(m)绘制速度(m/s).每个速度曲线都是在不同位置测得的高度的函数.因此,目的是观察这些轮廓在空间上如何变化.

I am trying to plot several vertical lines of a variable, say velocity (m/s), against a x-axis of distance (m) and a y-axis of height(m). Each of the velocity profiles come as a function of height measured at different locations. So the aim is to observe how these profiles change spatially.

我想通过将垂直轮廓移动x分量来解决此问题,该x分量对应于每个轮廓的测量位置.因此,如果我们假设第二个x轴表示速度,那么我希望它在每个测量点都重置为0.

I have thought to approach this by shifting the vertical profiles by the x-component corresponding to the location where each profile was measured. So if we suppose that the second x-axis depicts velocity I want it to reset to 0 at every point of measurement.

所需结果的草图(忽略黑色):

Sketch of desired outcome (ignoring black colour):

有人对正确的行动方针有任何想法吗?我正在使用 gnuplot ,但欢迎使用其他替代方法.预先感谢.

Does anyone have any idea of what the right course of action would be? I am using gnuplot but any alternatives are welcome. Thanks in advance.

下面您可能会看到我使用的数据(代码段中的文件 verProfiles )

Below you may have a look at the data I use (file verProfiles in the code snippet)

<身体>
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点.

*The numbers 1, 4 and 8 in the names of U variables in the table above denote the location where the measurements are taken hence each U profile should start and the respective x point in the graph.

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

The gnuplot code that I've written so far and generates a false graph is:

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"

生成的错误图形为:

推荐答案

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

Assuming I've understood your intention correctly, this would be my suggestion. You want to offset your x-data by 1,4, and 8, so you have to add these values to your columns $2, $3, $4. If I understood your sketch with 0 m/s correctly, you also want to subtract the first velocity value from it. Please correct me if I'm wrong. So, you take the pseudocolumn 0 (check help pseudocolumns), which is basically the line number starting from 0. If $0==0 (check ternary operator help ternary) you assign the current value (only the first value) of your column to a variable, e.g. xoff=$2and subtract it from all following values in your column. Since you have a header you have to skip one line, i.e. skip 1.

如果您希望所有的x轴都从0开始,那么可以使用箭头和标签来完成此操作,也可以根据实际需要使用多重图来完成(请检查 help multiplot ).

In case you want several x-axes on top all starting from 0, this could be either done with arrows and labels or depending on what exactly you need maybe with multiplots (check help multiplot).

检查以下内容作为起点:

Check the following as starting point:

代码:

### 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 )的功能,该功能可以将多幅绘图彼此相邻或重叠放置.您可以定义每个子图的原点(检查帮助原点)和大小(检查帮助大小).但是,子图的坐标和大小以屏幕坐标给出.现在的问题是:如何将图放置在相对于第一个图的所需位置?使用标签,箭头和对象,您可以使用屏幕,图形和轴坐标(请检查帮助坐标),但是我不知道您可以使用上一个绘图的轴坐标.因此,您必须自己使用一些内部gnuplot变量 GPVAL _... 计算这些位置.它看起来很复杂,但只是一些坐标变换.

Maybe now I have a better idea about what you probably want. I guess you "simply" want to have subplots at defined locations within a "Main"plot. gnuplot offers the feature of multiplot (check help multiplot) which will place several plots next to or on top of each other. You can define the origin (check help origin) and the size (check help size) of each subplot. However, the coordinates and sizes of the subplots are given in screen coordinates. The problem is now: how to place the plot at the desired location relative to the first plot? With labels, arrows, and objects you can use screen, graph and axes coordinates (check help coordinates), but I am not aware that you can use axis coordinates of the previous plot. So, you have to calculate these positions yourself using some internal gnuplot variables GPVAL_.... It looks complicated but is just some coordinate transformation.

代码:

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

结果:

这篇关于gnuplot:有没有办法在空间上绘制垂直线?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆