gpt4 book ai didi

plot - 用连接线绘制数据点,但留有空隙

转载 作者:行者123 更新时间:2023-12-04 04:23:36 24 4
gpt4 key购买 nike

我喜欢以下linespoints绘图样式:
http://www.gnuplotting.org/join-data-points-with-non-continuous-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解决方案

最佳答案

您可以使用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,您可以使用变量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


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以磅为单位。实际上,实际间隙大小取决于点的大小(以及线的线宽)。为了简单起见,此处的间隙大小是指从点中心到直线起点的距离。因此,当 GapSize=1.5具有 pointsize 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


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

enter image description here
enter image description here

说明:


问题:为什么在 (n)L3(n)x1(n)y1(n)x2(n)中有参数 y2(n)
计算 n,...时 0始终为 L3(n),并且不在右侧使用。
回答:
使它们成为非常量表达式。或者,可以
x0,x3,y0,y3添加为变量,例如 L3(x0, y0, x3, y3);但是,那
紧凑性将丢失。
问题: using中的 plot $Data1 using (x3=NaN,y3=NaN,$1):2部分是什么意思?
回答:
(,)称为串行评估,该评估记录在
gnuplot文档中的表达式>运算符>二进制部分
(仅限v4.4或更高版本)。
串行评估仅在括号中进行,并保证
按从左到右的顺序进行。最右边的子表达式的值
返回。
这是为了初始化 (x3,y3)
线段的后续绘制作为矢量。这与
点的绘制。
问题:如何为 N-1点绘制 N段/向量?
回答:
在绘制点时设置 x3=NaN, y3=NaN可确保
第一个数据点初始数据点 (x0,y0)设置为 (NaN,NaN)
结果是 x1(0)y1(0)的评估也返回 NaN
Gnuplot通常会跳过 NaN的点,即第一个
数据点未绘制向量。该代码画出了
迭代到达第二点时的第一和第二点。
问题:第二个 plot '' u ...如何遍历所有点?
回答:
gnuplot> h special-filenames对此进行了解释:
有一些具有特殊含义的文件名: '''-''+''++'
空文件名 ''告诉gnuplot重新使用文件名中的先前输入文件。
相同的绘图命令。因此,要绘制来自同一输入文件的两列:

          plot 'filename' using 1:2, '' using 1:3

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

关于plot - 用连接线绘制数据点,但留有空隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30297735/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com