问题描述
设置对数刻度y时,与裁剪值无关,没有0值(对应于对数刻度的-infinity)绘制(垂直)线。 例如。在这个(M)WE中:
reset
$DATA << EOD
10
0.1
9
0.01
8
1e-3
7
1e-4
6
1e-5
5
1e-6
4
1e-7
3
1e-8
2
1e-9
1
0
1
10
EOD
set xrange [*:|$DATA|-1]
set xtics 1
set yrange [0.5:*]
set logscale y
set grid
set style data linespoints
plot $DATA
show clip
从(18 | 1)到(19 | 0)以及从(19 | 0)到(20 | 1)都没有画出垂直线。
除了将0值更改为类似1e-99之外,还有其他方法来获取这些行吗?
解决方法
您期望什么? log(0)
未定义,因此应将这一点放在哪里?
根据您的建议,您可以将0
替换为一个较小的值,例如1e-99
或1e-323
可能是似乎起作用的最小值。
如果您的数据中有多个0
值,并且您不想手动更改数据,但是希望向下绘制一条垂直线,则可以定义一个函数,将0
替换为数量很少。
代码:
### replace 0 with some very small value
reset session
$Data << EOD
10
0.1
9
0.01
8
1e-3
7
1e-4
6
1e-5
5
1e-6
4
1e-7
3
1e-8
2
1e-9
1
0
1
10
EOD
set xtics 1
set yrange [0.5:*]
set logscale y
set grid
myZero(n) = n==0 ? 1e-323 : n
plot $Data u 0:(myZero($1)) w lp pt 7
### end of code
结果: