如何在gnuplot中创建十字准线使虚线网格线相交?

如何在gnuplot中创建十字准线使虚线网格线相交?,gnuplot,line,gridlines,Gnuplot,Line,Gridlines,我正在绘制一些数据,我想使用虚线网格线 任何虚线网格线都可以,但我更喜欢“长划线、短划线、长划线”格式 例如,给定以下代码 set grid lc rgb "#000000" lt 1 dt (50, 25, 20, 25) plot x**2 我得到这个结果 但我宁愿网格线相交总是发生在两条虚线的中间,就像这样 如果我可以使水平网格线不同于垂直网格线,并且可以为每一条网格线添加一些偏移量,那么我可以想象有一种方法可以实现这一点。但我似乎也不能那样做。不太可能。我能想到的最接近的是 set

我正在绘制一些数据,我想使用虚线网格线

任何虚线网格线都可以,但我更喜欢“长划线、短划线、长划线”格式

例如,给定以下代码

set grid lc rgb "#000000" lt 1 dt (50, 25, 20, 25)
plot x**2
我得到这个结果

但我宁愿网格线相交总是发生在两条虚线的中间,就像这样


如果我可以使水平网格线不同于垂直网格线,并且可以为每一条网格线添加一些偏移量,那么我可以想象有一种方法可以实现这一点。但我似乎也不能那样做。

不太可能。我能想到的最接近的是

set grid x y mx my
set grid lt -1 lc "black" lw 1 , lt -1 lc bgnd lw 16
set ticscale 1.0, 0.01
set mxtics 4
plot x**2 lw 2
但这会使垂直网格线保持不变。

对于x-grid和y-grid,gnuplot似乎不能有两种不同的DashStyle。 我目前看到的一种解决方法是在彼此的顶部绘制两个相同的绘图。一个具有适当的x轴网线,另一个具有适当的y轴网线

如果您想要比例为
(50-25-20-25)
,则这对应于两个TIC之间的
(25-25-20-25-25-0)
(5-5-4-5-5-0)
。 此外,破折号和间隙长度数字,例如in
dt(50,25,20,25)
,似乎与图形大小存在固定关系。“经验”因子为11,具有良好的近似性(至少对于我在gnuplot 5.2.6下测试的wxt终端而言)

编辑:实际上,下面的代码使用
qt
终端给出了不同的结果。这不仅仅是一个不同的因素。如果不深入了解源代码,它会更加复杂,可能很难解决。因此,以下内容似乎适用于
wxt
terminal(甚至可能在Windows下?),这可能是一个幸运的发现

使用此选项,可以自动创建虚线,从而在主栅格线的交点处生成十字光标

假设是:

  • 你的第一次和最后一次抽搐都在边界上
  • 你知道x和y间隔的数量
  • 您还需要知道图表的大小。这些值存储在变量
    GPVAL\u TERM…
    中,但仅在打印后。这就是为什么您必须
    replot
    才能获得正确的值

    此解决方案至少应始终在主栅格线的交点处提供十字光标

    编辑2:只是为了“完整性”。在不同端子上获得相同(或类似)外观的自定义虚线图案的因素差异很大<代码>wxt约11,
    qt
    约5.6,
    pngcairo
    约0.25。这不是我所期望的。此外,这些因素似乎略微取决于x和y以及图形大小。为了获得“精确”的十字准线,您可能需要进一步调整这些数字

    代码:

    结果:


    我可能有问题,因为在我的例子中,运行该代码时,生成的绘图同时具有垂直和水平实线。不知何故,grid的第二个命令覆盖了前一个命令。尝试设置grid x y mx my lt-1 lc“black”lw 1,lt-1 lc bgnd lw 16以查看@Ethan所描述的效果。哦,这就成功了。现在我明白了,它将白线叠加在黑线之上。很好,我不知道lt-1(默认边框lt)和颜色规范“bgnd”。太棒了!这就行了。可惜它在qt终端上不起作用。所以,首先,我们应该提交一个bug吗?哪里相同的代码应该独立于终端给出相同的结果。也许,您可以对qt终端进行调整,但我到目前为止还没有成功。你说得对,我也希望这也能在其他终端上使用。如果你想提交一个bug报告,你可以在这里这样做:也许我们会从开发者那里得到一些响应。另一方面,使用
    pngcairo
    或最有用的终端是行不通的。具体来说,pngcairo不接受
    dt(长度、空间、长度、空间)
    语法。它可能不是一个bug,但应该是。真烦人,结果我错了。它确实接受了这一点,但比例远不明显。
    ### dashed grid lines with crosshairs at intersections
    reset session
    
    TERM = "wxt"   # choose terminal
    
    if (TERM eq "wxt") {
        set term wxt size 800,600
        FactorX = 11.    # wxt
        FactorY = 11.    # wxt
    }
    if (TERM eq "qt") {
        set term qt size 800,600
        FactorX = 5.58  # qt
        FactorY = 5.575   # qt
    }
    if (TERM eq "pngcairo") {
        set term pngcairo size 800,600
        set output "tbDashTest.png"
        FactorX = 0.249    # pngcairo
        FactorY = 0.251    # pngcairo
    }
    
    set multiplot
    set ticscale 0,0
    
    Units = 24   # pattern (5,5,4,5,5,0) are 24 units
    
    # set interval and repetition parameters
    IntervalsY = 10
    RepetitionsY = 1
    IntervalsX = 4
    RepetitionsX = 3
    
    # initial plot to get graph size
    plot x**2
    gX = real(GPVAL_TERM_YMAX-GPVAL_TERM_YMIN)/IntervalsY/Units/FactorY/RepetitionsY
    gY = real(GPVAL_TERM_XMAX-GPVAL_TERM_XMIN)/IntervalsX/Units/FactorX/RepetitionsX
    # first plot with x-grid lines
    set grid xtics lt 1 lc rgb "black" dt (gX*5,gX*5,gX*4,gX*5,gX*5,0)
    replot
    unset grid
    # second plot with y-grid lines
    set grid ytics lt 1 lc rgb "black" dt (gY*5,gY*5,gY*4,gY*5,gY*5,0)
    replot
    
    unset multiplot
    set output
    ### end of code