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

Plot 使用连接线绘制数据点,但会留下间隙,plot,gnuplot,transparency,Plot,Gnuplot,Transparency,我喜欢下面的linespoints打印样式: 但是,我在使用此样式绘制多条线时遇到了一个问题: 正如你所看到的,第二个系列的要点与第一个系列(线和点)一样,我不想发生什么 使这成为可能的gnuplot的特性是pointinterval和pointintervalbox gnuplot的文档: pointinterval的负值,例如-N,表示点符号 仅为每N个点绘制一个长方体(实际上是圆) 在每个点后面,用背景填充符号,使其消失 颜色。命令set pointintervalbox控制该点的半径

我喜欢下面的
linespoints
打印样式:

但是,我在使用此样式绘制多条线时遇到了一个问题:

正如你所看到的,第二个系列的要点与第一个系列(线和点)一样,我不想发生什么

使这成为可能的gnuplot的特性是
pointinterval
pointintervalbox

gnuplot的文档:

pointinterval
的负值,例如-N,表示点符号 仅为每N个点绘制一个长方体(实际上是圆) 在每个点后面,用背景填充符号,使其消失 颜色。命令
set pointintervalbox
控制该点的半径 被封锁的地区。它是默认半径的倍增,默认半径为 等于点大小

既然医生说,用背景色填充,我希望用透明的背景来解决这个问题,但似乎用的是白色

Gnuplot版本 最小工作示例(MWE):
gnuplot空格线标记样式.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\u data1.dat

# X   Y
  1   2
  2   3
  3   2
  4   1
# X   Y
  1.2   2.4
  2   3.5
  3   2.5
  4   1.2
plotting_data2.dat

# X   Y
  1   2
  2   3
  3   2
  4   1
# X   Y
  1.2   2.4
  2   3.5
  3   2.5
  4   1.2
更新 给出了一个工作方案


使用gnuplot可以做很多事情。这只是你允许它变得多么复杂的问题。 可以通过两步绘图来实现间隙。第一个:仅使用点
,第二个:
使用向量
,这些向量是通过执行一点几何计算而缩短的点之间的线。
参数
L1
确定间隙,需要根据数据和图形比例进行调整。使用gnuplot 5.0和5.2进行测试

修订版:

### "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
此版本创建的间隙与端子大小和图形比例无关。它只需要更多的缩放。但是,由于它需要存储在
GPVAL\uu…
-变量中的终端和图形的大小,您只能在打印后获得这些变量,因此,遗憾的是,该过程需要重新打印。 我不确定这是否适用于所有终端。我刚在wxt终端上测试过

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
实证结果(针对Win7上的wxt终端):

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

术语大小400400
(px)对应于
80008000
终端单元(tu),因此:
Rtupx=20
(终端单元与像素的比率)

编辑:不同终端的系数
Rtupx
明显不同:
wxt:20
qt:10
pngcairo:1
,您可以使用变量
GPVAL\u 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
x和y轴单位(au)与终端单位(tu)的比率不同,分别为:

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
以点大小单位给出。实际上,实际间隙大小取决于点大小(以及线的线宽)。为简单起见,此处“间隙大小”表示从点中心到直线起点的距离。因此,当点大小为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,$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
  • 问题:我们是否需要
    (y1(0))
    周围的括号?
    回答:
    gnuplot>h使用
    说明:
    每个列都可以是一个简单的列号,从一个列中选择值 输入文件的字段,与第一个字段中的列标签匹配的字符串 数据集的行、括号内的表达式或特殊 未包含在括号中的函数,如
    xticlabels(2)


  • 恐怕gnuplot没有解决方案。Gnuplot将每个点绘制两次,一次使用背景色,一次使用原始颜色。如果gnuplot尊重透明的背景色,那么它也不会隐藏一个绘图的线条。要正确地执行此操作,必须更改gnuplot源,以物理方式缩短线段,而不仅仅是过度绘制线段。所以这将是一个功能请求。@Christoph:谢谢你的评论。你是否知道另一种绘图软件可以做到这一点?可以使用不同的透明层。我认为pgfplots可以做到这一点。不,我不知道如何使用pgfplots或任何其他绘图软件。pgfplots能够做到这一点的几率非常高,因此您可以尝试在上提问。关于您的答案,我有几个问题。我已经用我自己的初步答复把它们添加到你的答复中。如果你有时间检查它们,并在必要时纠正它们,这将是非常好的。谢谢你的回答。(好的,带有向量的样式
    自那时起就存在了。)感谢您的编辑。嗯,我尽量简短。您的所有问题都有助于更好地理解代码。你的答案都很好。是的,这是我在创建像
    L3(n)
    这样的函数时考虑到的紧凑性,这些函数实际上独立于
    n
    。可以改进的一点是
    L1
    在尺度上的依赖性。理想情况下,它应该是与绝对x和y范围无关的相同视觉间隙。某种程度上与点大小有关(以像素或屏幕单位或其他任何单位)。也许你有一些想法?事实上这是可以改进的。不幸的是,我也不知道解决办法。理想情况下,间隙应根据点大小而不是轴的比例进行缩放。当然,它不应该对x-y范围比敏感。gnu中有不同的坐标系