用连接线绘制数据点,但留下间隙

时间:2015-05-18 07:49:21

标签: plot gnuplot transparency

我喜欢关注linespoints绘图风格:
http://www.gnuplotting.org/join-data-points-with-non-continuous-lines/

但是,当我用这种风格绘制几行时,我遇到了一个问题:

plot of data points with non-touching lines

正如你所看到的那样,第二个系列的要点也是第一个系列(线和点),这是我不想发生的事情。

使这成为可能的gnuplot的功能是pointintervalpointintervalbox

gnuplot的文档:

  

负值pointinterval,例如-N,表示点符号   仅针对每个第N个点绘制,并且是一个框(实际上是圆形)   在每个点符号后面填充背景消隐   颜色即可。命令set pointintervalbox控制此半径   消隐区域。它是默认半径的乘数,即   等于点大小。

http://www.bersch.net/gnuplot-doc/set-show.html#set-pointintervalbox

由于文档说,填写背景颜色,我希望使用透明背景,问题可以解决,但似乎是使用了白色。

Gnuplot版本

gnuplot> show version long

    G N U P L O T
    Version 5.0 patchlevel 0    last modified 2015-01-01 

    Copyright (C) 1986-1993, 1998, 2004, 2007-2015
    Thomas Williams, Colin Kelley and many others

    gnuplot home:     http://www.gnuplot.info
    faq, bugs, etc:   type "help FAQ"
    immediate help:   type "help"  (plot window: hit 'h')
Compile options:
-READLINE  +LIBREADLINE  +HISTORY  
-BACKWARDS_COMPATIBILITY  +BINARY_DATA  
+GD_PNG  +GD_JPEG  +GD_TTF  +GD_GIF  +ANIMATION  
-USE_CWDRC  +HIDDEN3D_QUADTREE  
+DATASTRINGS  +HISTOGRAMS  +OBJECTS  +STRINGVARS  +MACROS  +THIN_SPLINES  +IMAGE  +USER_LINETYPES +STATS +EXTERNAL_FUNCTIONS 

最小工作示例(MWE):

gnuplot-space-line-mark-style.gp

reset
set terminal pngcairo transparent size 350,262 enhanced font 'Verdana,10'
show version
set output 'non-continuous_lines.png'
set border linewidth 1.5
set style line 1 lc rgb '#0060ad' lt 1 lw 2 pt 7 pi -1 ps 1.5
set style line 2 lc rgb '#0020ad' lt 1 lw 2 pt 7 pi -1 ps 1.5
set pointintervalbox 3
unset key
set ytics 1
set tics scale 0.75
set xrange [0:5]
set yrange [0:4]
plot 'plotting_data1.dat' with linespoints ls 1,\
     'plotting_data2.dat' with linespoints ls 2

plotting_data1.dat

# X   Y
  1   2
  2   3
  3   2
  4   1

plotting_data2.dat

# X   Y
  1.2   2.4
  2   3.5
  3   2.5
  4   1.2

更新

pgfplots

上提供了有效的tex.stackoverflow.com解决方案

enter image description here

1 个答案:

答案 0 :(得分:2)

您可以使用gnuplot做很多事情。只是您允许它变得多么复杂。 您可以通过两步绘制来实现间隙。第一:只有with points和第二:with vectors,它们是通过执行一些几何计算而缩短的点之间的线。 参数L1确定间隙,需要根据数据和图形比例调整。在gnuplot 5.0和5.2上进行了测试。

修订版:

这里是创建间隙的版本,其与端子尺寸和图形比例无关。它只需要更多的扩展即可。但是,由于它需要存储在GPVAL_...变量中的终端和图形的大小,这些变量只能在 绘制后获得,因此遗憾的是,该过程需要重新绘制。 我不确定这是否适用于所有终端。我刚刚在wxt终端上进行了测试。

经验发现(对于Win7上的wxt-terminal):

pointsize 100(ps)对应于600像素(px),因此:Rpxps=6(点像素的比例像素)

term size 400,400(px)对应于8000,8000个终端单位(tu),因此:Rtupx=20(终端单位与像素之比)

编辑:因子Rtupx对于不同终端显然是不同的:wxt: 20qt: 10pngcairo: 1,您可以使用变量{ {1}}用于检查终端。

GPVAL_TERM

x和y的轴单位(au)与终端单位(tu)之比是不同的,

Rtupx = 1.                                   # for pngcairo terminal 1 tu/px
if (GPVAL_TERM eq "wxt") { Rtupx = 20. }     # 20 tu/px, 20 terminal units per pixel
if (GPVAL_TERM eq "qt")  { Rtupx = 10. }     # 10 tu/px, 10 terminal units per pixel

变量Rxautu = (GPVAL_X_MAX-GPVAL_X_MIN)/(GPVAL_TERM_XMAX-GPVAL_TERM_XMIN) Ryautu = (GPVAL_Y_MAX-GPVAL_Y_MIN)/(GPVAL_TERM_YMAX-GPVAL_TERM_YMIN) 以磅数单位给出。实际上,真实的间隙大小取决于点的大小(以及线的线宽)。为简单起见,此处的间隙大小是指从点中心到直线起点的距离。因此,GapSize在拥有GapSize=1.5的情况下将在两边造成pointsize 1.5的差距。以前版本的0.75在像素尺寸上已被L3(n)取代,并且不再需要早期版本的L3px(n)

代码:

L1

结果 :(两种不同的终端尺寸)

enter image description here enter image description here

说明:

  • 问题:为什么### "linespoints" with gaps between lines and points reset session $Data1 <<EOD # X Y 0 3 1 2 1.5 1 3 2 4 1 EOD $Data2 <<EOD 0 0 1 1 2 1 2 2 3 1 3.98 0.98 EOD GapSize = 1.5 Rtupx = 20. # 20 tu/px, 20 terminal units per pixel Rpxps = 6. # 6 px/ps, 6 pixels per pointsize # Ratio: axis units per terminal units Rxautu(n) = (GPVAL_X_MAX-GPVAL_X_MIN)/(GPVAL_TERM_XMAX-GPVAL_TERM_XMIN) Ryautu(n) = (GPVAL_Y_MAX-GPVAL_Y_MIN)/(GPVAL_TERM_YMAX-GPVAL_TERM_YMIN) dXpx(n) = (x3-x0)/Rxautu(n)/Rtupx dYpx(n) = (y3-y0)/Ryautu(n)/Rtupx L3px(n) = sqrt(dXpx(n)**2 + dYpx(n)**2) x1px(n) = dXpx(n)*GapSize*Rpxps/L3px(n) y1px(n) = dYpx(n)*GapSize*Rpxps/L3px(n) x2px(n) = dXpx(n)*(L3px(n)-GapSize*Rpxps)/L3px(n) y2px(n) = dYpx(n)*(L3px(n)-GapSize*Rpxps)/L3px(n) x1(n) = x1px(n)*Rtupx*Rxautu(n) + x0 y1(n) = y1px(n)*Rtupx*Ryautu(n) + y0 x2(n) = x2px(n)*Rtupx*Rxautu(n) + x0 y2(n) = y2px(n)*Rtupx*Ryautu(n) + y0 set style line 1 pt 7 ps 1.5 lc rgb "black" set style line 2 lw 2 lc rgb "black set style line 3 pt 7 ps 1.5 lc rgb "red" set style line 4 lw 2 lc rgb "red" plot \ $Data1 u (x3=NaN, y3=NaN,$1):2 w p ls 1 notitle, \ $Data1 u (y0=y3,y3=$2,x0=x3,x3=$1,x1(0)):(y1(0)): \ (x2(0)-x1(0)):(y2(0)-y1(0)) w vectors ls 2 nohead notitle, \ $Data2 u (x3=NaN, y3=NaN,$1):2 w p ls 3 notitle, \ $Data2 u (y0=y3,y3=$2,x0=x3,x3=$1,x1(0)):(y1(0)): \ (x2(0)-x1(0)):(y2(0)-y1(0)) w vectors ls 4 nohead notitle replot ### end of code (n)L3(n)x1(n)y1(n)
    x2(n)在计算y2(n),...时始终为n,在右侧不使用。
    答案:        使它们成为非常量表达式。或者,可以        将0添加为变量,例如L3(n);然而        紧凑性会丢失。

  • 问题x0,x3,y0,y3L3(x0, y0, x3, y3)部分是什么意思?
    答案:        using称为串行评估,该评估记录在        gnuplot文档中的表达式>运算符>二进制部分        (仅限v4.4或更高版本)。        串行评估仅在括号中进行,并保证        按从左到右的顺序进行。最右边的子表达式的值        返回。        这样做是为了初始化plot $Data1 using (x3=NaN,y3=NaN,$1):2        线段的后续绘制作为矢量。这与        点的绘制。

  • 问题:这如何绘制(,)个点的(x3,y3)个分段/向量?
    答案:        在绘制点时设置N-1可确保        第一个数据点初始数据点N设置为x3=NaN, y3=NaN        结果是对(x0,y0)(NaN,NaN)的求值也返回x1(0)
           Gnuplot通常会跳过y1(0)的点,即第一个        数据点未绘制向量。该代码画出了        迭代到达第二点时的第一点和第二点。

  • 问题:第二个NaN如何遍历所有点?
    答案:        NaN对此进行了解释:
           有一些具有特殊含义的文件名:plot '' u ...gnuplot> h special-filenames'''-'
           空文件名'+'告诉gnuplot重新使用文件名中的先前输入文件。        相同的绘图命令。因此,要绘制来自同一输入文件的两列:

    '++'
  • 问题:我们是否需要在''周围加上括号?
    答案 plot 'filename' using 1:2, '' using 1:3 对此进行了解释:
          每个可以是一个简单的列号,可以从一个列中选择值       输入文件的字段,一个与第一个列标签匹配的字符串       数据集的行,用括号括起来的表达式或特殊       函数未括在括号内,例如(y1(0))