用连接线绘制数据点但留下间隙
Plot data points with connecting lines but which leave gaps
我喜欢以下linespoints
绘图风格:
http://www.gnuplotting.org/join-data-points-with-non-continuous-lines/
但是,当我用这种风格绘制多条线时遇到了一个问题:
如您所见,第二系列的点也将第一系列(线和点)清空,这是我不希望发生的事情。
使这成为可能的 gnuplot 功能是 pointinterval
和 pointintervalbox
。
gnuplot 文档:
A negative value of pointinterval
, e.g. -N, means that point symbols
are drawn only for every Nth point, and that a box (actually circle)
behind each point symbol is blanked out by filling with the background
color. The command set pointintervalbox
controls the radius of this
blanked-out region. It is a multiplier for the default radius, which
is equal to the point size.
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
solution is given on tex.whosebug.com
您可以使用 gnuplot 做很多事情。这只是您允许它变得多么复杂的问题。
您可以通过两步绘图来实现差距。第一:仅 with points
和第二:with vectors
它们是通过执行一些几何计算缩短的点之间的线。
参数L1
决定了差距,需要根据数据和图表的比例进行调整。使用 gnuplot 5.0 和 5.2 测试。
修订版:
这是创建 gaps 的版本,与终端大小和图形比例无关。它只需要更多的缩放。但是,由于它需要存储在 GPVAL_...
变量中的终端和图形的大小,在 绘图后您只能得到 ,因此不幸的是,该过程需要重新绘图。
我不确定这是否适用于所有终端。我刚刚在 wxt 终端上测试过。
实验结果(对于 wxt-terminal on Win7):
pointsize 100
(ps) 对应于 600
像素 (px),因此:Rpxps=6
(像素与点大小之比)
term size 400,400
(px) 对应于 8000,8000
终端单位 (tu),因此:Rtupx=20
(终端单位与像素之比)
编辑: 因子 Rtupx
显然对于不同的终端是不同的:wxt: 20
、qt: 10
、pngcairo: 1
,你可以使用变量 GPVAL_TERM
来检查终端。
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
轴单位 (au) 与终端单位 (tu) 的比率对于 x 和 y 是不同的,并且是:
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
以磅为单位给出。实际上,real 间隙大小取决于点大小(以及线的线宽)。为简单起见,这里的间隙大小表示从点的中心到直线起点的距离。因此,当有 pointsize 1.5
时 GapSize=1.5
将导致每边有 0.75
的间隙。早期版本的 L3(n)
现在在像素尺寸上被 L3px(n)
取代,不再需要早期版本的 L1
。
代码:
### "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,):2 w p ls 1 notitle, \
$Data1 u (y0=y3,y3=,x0=x3,x3=,x1(0)):(y1(0)): \
(x2(0)-x1(0)):(y2(0)-y1(0)) w vectors ls 2 nohead notitle, \
$Data2 u (x3=NaN, y3=NaN,):2 w p ls 3 notitle, \
$Data2 u (y0=y3,y3=,x0=x3,x3=,x1(0)):(y1(0)): \
(x2(0)-x1(0)):(y2(0)-y1(0)) w vectors ls 4 nohead notitle
replot
### end of code
结果:(两种不同的终端尺寸)
说明:
问题:为什么L3(n)
、x1(n)
、y1(n)
的参数是(n)
, x2(n)
, y2(n)
?
n
始终是 0
当 L3(n)
,... 被计算并且不在右侧使用时。
答案:
使它们成为非 constant-expressions。或者,可以
添加 x0,x3,y0,y3
作为变量,例如L3(x0, y0, x3, y3)
;然而
紧凑性将丢失。
问题:plot $Data1 using (x3=NaN,y3=NaN,):2
中的using
是什么意思?
答案:
(,)
称为系列评估,记录在
gnuplot 文档中的 Expressions > Operator > Binary 部分
(仅 v4.4 或更新版本)。
序列评估仅出现在括号中,并保证
按从左到右的顺序进行。最右边子表达式的值
被退回。
这是为了 (x3,y3)
的初始化而完成的
随后将线段绘制为矢量。这无关紧要
点的绘制。
问题:这个N-1
segments/vectors如何画N
分?
答案:
在绘制点时设置 x3=NaN, y3=NaN
确保对于
第一个数据点初始数据点 (x0,y0)
设置为 (NaN,NaN)
结果是 x1(0)
和 y1(0)
的评估也 returns NaN
.
Gnuplot 一般 skips 指向 NaN
,即第一个
没有绘制矢量的数据点。代码在
当迭代到达第二个点时的第一个和第二个点。
问题:第二个plot '' u ...
如何遍历所有点?
答案:
gnuplot> h special-filenames
解释如下:
有几个文件名具有特殊含义:''
、'-'
、'+'
和 '++'
.
空文件名 ''
告诉 gnuplot re-use 中的前一个输入文件
相同的绘图命令。因此,要绘制同一输入文件中的两列:
plot 'filename' using 1:2, '' using 1:3
问题: (y1(0))
两边需要括号吗?
答案: gnuplot> h using
解释:
每个可能是一个简单的列号,从一个中选择值
输入文件的字段,匹配第一个列标签的字符串
数据集的行、括号中的表达式或特殊的
未包含在括号中的函数,例如 xticlabels(2)
.
我喜欢以下linespoints
绘图风格:
http://www.gnuplotting.org/join-data-points-with-non-continuous-lines/
但是,当我用这种风格绘制多条线时遇到了一个问题:
如您所见,第二系列的点也将第一系列(线和点)清空,这是我不希望发生的事情。
使这成为可能的 gnuplot 功能是 pointinterval
和 pointintervalbox
。
gnuplot 文档:
A negative value of
pointinterval
, e.g. -N, means that point symbols are drawn only for every Nth point, and that a box (actually circle) behind each point symbol is blanked out by filling with the background color. The commandset pointintervalbox
controls the radius of this blanked-out region. It is a multiplier for the default radius, which is equal to the point size.
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
solution is given on tex.whosebug.com
您可以使用 gnuplot 做很多事情。这只是您允许它变得多么复杂的问题。
您可以通过两步绘图来实现差距。第一:仅 with points
和第二:with vectors
它们是通过执行一些几何计算缩短的点之间的线。
参数L1
决定了差距,需要根据数据和图表的比例进行调整。使用 gnuplot 5.0 和 5.2 测试。
修订版:
这是创建 gaps 的版本,与终端大小和图形比例无关。它只需要更多的缩放。但是,由于它需要存储在 GPVAL_...
变量中的终端和图形的大小,在 绘图后您只能得到 ,因此不幸的是,该过程需要重新绘图。
我不确定这是否适用于所有终端。我刚刚在 wxt 终端上测试过。
实验结果(对于 wxt-terminal on Win7):
pointsize 100
(ps) 对应于 600
像素 (px),因此:Rpxps=6
(像素与点大小之比)
term size 400,400
(px) 对应于 8000,8000
终端单位 (tu),因此:Rtupx=20
(终端单位与像素之比)
编辑: 因子 Rtupx
显然对于不同的终端是不同的:wxt: 20
、qt: 10
、pngcairo: 1
,你可以使用变量 GPVAL_TERM
来检查终端。
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
轴单位 (au) 与终端单位 (tu) 的比率对于 x 和 y 是不同的,并且是:
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
以磅为单位给出。实际上,real 间隙大小取决于点大小(以及线的线宽)。为简单起见,这里的间隙大小表示从点的中心到直线起点的距离。因此,当有 pointsize 1.5
时 GapSize=1.5
将导致每边有 0.75
的间隙。早期版本的 L3(n)
现在在像素尺寸上被 L3px(n)
取代,不再需要早期版本的 L1
。
代码:
### "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,):2 w p ls 1 notitle, \
$Data1 u (y0=y3,y3=,x0=x3,x3=,x1(0)):(y1(0)): \
(x2(0)-x1(0)):(y2(0)-y1(0)) w vectors ls 2 nohead notitle, \
$Data2 u (x3=NaN, y3=NaN,):2 w p ls 3 notitle, \
$Data2 u (y0=y3,y3=,x0=x3,x3=,x1(0)):(y1(0)): \
(x2(0)-x1(0)):(y2(0)-y1(0)) w vectors ls 4 nohead notitle
replot
### end of code
结果:(两种不同的终端尺寸)
说明:
问题:为什么
L3(n)
、x1(n)
、y1(n)
的参数是(n)
,x2(n)
,y2(n)
?
n
始终是0
当L3(n)
,... 被计算并且不在右侧使用时。
答案: 使它们成为非 constant-expressions。或者,可以 添加x0,x3,y0,y3
作为变量,例如L3(x0, y0, x3, y3)
;然而 紧凑性将丢失。问题:
plot $Data1 using (x3=NaN,y3=NaN,):2
中的using
是什么意思?
答案:(,)
称为系列评估,记录在 gnuplot 文档中的 Expressions > Operator > Binary 部分 (仅 v4.4 或更新版本)。 序列评估仅出现在括号中,并保证 按从左到右的顺序进行。最右边子表达式的值 被退回。 这是为了(x3,y3)
的初始化而完成的 随后将线段绘制为矢量。这无关紧要 点的绘制。问题:这个
N-1
segments/vectors如何画N
分?
答案: 在绘制点时设置x3=NaN, y3=NaN
确保对于 第一个数据点初始数据点(x0,y0)
设置为(NaN,NaN)
结果是x1(0)
和y1(0)
的评估也 returnsNaN
.
Gnuplot 一般 skips 指向NaN
,即第一个 没有绘制矢量的数据点。代码在 当迭代到达第二个点时的第一个和第二个点。问题:第二个
plot '' u ...
如何遍历所有点?
答案:gnuplot> h special-filenames
解释如下:
有几个文件名具有特殊含义:''
、'-'
、'+'
和'++'
.
空文件名''
告诉 gnuplot re-use 中的前一个输入文件 相同的绘图命令。因此,要绘制同一输入文件中的两列:plot 'filename' using 1:2, '' using 1:3
问题:
(y1(0))
两边需要括号吗?
答案:gnuplot> h using
解释:
每个可能是一个简单的列号,从一个中选择值 输入文件的字段,匹配第一个列标签的字符串 数据集的行、括号中的表达式或特殊的 未包含在括号中的函数,例如xticlabels(2)
.