【问题标题】:How to make dashed grid lines intersect making crosshairs in gnuplot?如何使虚线网格线相交在gnuplot中制作十字准线?
【发布时间】:2019-04-11 04:59:17
【问题描述】:

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

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

例如,给定以下代码

set grid lc rgb "#000000" lt 1 dt (50, 25, 20, 25)
plot x**2

我得到了这个结果

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

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

【问题讨论】:

    标签: gnuplot line gridlines


    【解决方案1】:

    看起来 gnuplot 对于 x-grid 和 y-grid 不能有两种不同的 dashstyle。 我目前看到的一种解决方法是在彼此之上绘制两个相同的图。一个带有适当的 x 网格线,另一个带有适当的 y 网格线。

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

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

    有了这个,您可以自动创建虚线,从而在主要网格线的交叉点产生十字准线。

    假设是:

    1. 您的第一次和最后一次抽动在边界上
    2. 你知道 x 和 y 间隔的数量

    您还需要知道图形大小。这些值存储在变量GPVAL_TERM... 中,但仅在 绘图之后。这就是为什么您必须replot 才能获得正确的值。

    这种解决方法至少应该在主要网格线的交点处始终提供十字准线。

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

    代码:

    ### 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
    

    结果:

    【讨论】:

    • 太棒了!这可以完成工作。很遗憾,它在 qt 终端上不起作用。所以首先,我们应该提交一个错误吗?在哪里?相同的代码应该独立于终端给出相同的结果。
    • 可能,您可以为 qt 终端以某种方式对其进行调整,但到目前为止我还没有成功。你是对的,我也希望这也适用于其他终端。如果您想提交错误报告,可以在这里进行:sourceforge.net/p/gnuplot/bugs 也许我们会得到开发人员的一些回复。
    • 另一方面,这不适用于pngcairo 或最有用的终端。具体来说,pngcairo 不接受 dt (length, space, length, space) 语法。它可能不是一个错误,但它应该是。这很烦人。
    • 原来我错了。它确实接受它,但比例远非显而易见。
    【解决方案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
    

    但这会使垂直网格线保持实心。

    【讨论】:

    • 我可能遇到了问题,因为在我的情况下,运行该代码生成的绘图具有实心的垂直线和水平线。不知何故,网格的第二个命令覆盖了前一个。
    • 试试set grid x y mx my lt -1 lc "black" lw 1 , lt -1 lc bgnd lw 16看看@Ethan描述的效果。
    • 哦,成功了。现在我明白了,它在黑色线条上叠加了白色线条。
    • 很好,不知道 lt -1(默认边框 lt)和 colourspec "bgnd"。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多