【问题标题】:GNUPlot - How to control interline spacing in tick labels?GNUPlot - 如何控制刻度标签中的行间距?
【发布时间】:2014-09-14 16:40:33
【问题描述】:

我正在尝试绘制一个在其 xticks 上有两行标签的图表。我不能再减少字体,因为它变得不可读(该图是 2x2 多图的一部分)。 问题是标签中的两行之间的距离太大,以至于它们变得太靠近下一列的标签。

我想减小行间距,使标签的行之间变得更近,但离其他标签的行更远。

我考虑过手动放置标签(使用函数来计算每行的位置),但在这样做之前,我想知道是否有人有更简单的解决方案。

非常感谢!

我在 Ubuntu 14 上使用“gnuplot 4.6 patchlevel 4”。以下是 MWE:

# Requires gnuplot >= 4.6
set terminal pdf color solid font "Helvetica, 10" enhanced size 4, 3.72
set output 'mwe.pdf'
set border 3 lc rgb "#000000"
set bmargin 9
set ylabel offset -1
TicksFont = ", 10"
Title2Font = ", 14"

set yrange[0:180 < * ]
set format y "%.0f%%"

set xtics out scale 0, 0 nomirror rotate by 90 right offset 0,0 font TicksFont
set ytics out nomirror font TicksFont
unset key

set datafile separator ";"
set style fill transparent solid 1.0 border -1
set style data boxes
set boxwidth 1.0

#Bottom-left plot
set title "C) Third (sub)plot" font Title2Font

plot '-' using ($0):2:(0xFF8080):xtic(1) notitle lc rgb variable
# Label; Value
01. Aaaaa:\nAaaaaaaaa(AA);                  100
02. Bbbbb:\nBbbbbbbbbbbb(BB);               20
03. Ccccc: Ccccccc(Ccc),\nCccccccc(CCC);    30
04. Dddd: DDDD,\nDDDDDDDDDDDD(DD);          40
;NaN
01. Aaaaa:\nAaaaaaaaa(AA);                  100
02. Bbbbb:\nBbbbbbbbbbbb(BB);               20
03. A single-liner;                         30
04. Dddd: DDDD,\nDDDDDDDDDDDD(DD);          40
;NaN
01. Aaaaa:\nAaaaaaaaa(AA);                  100
02. Bbbbb:\nBbbbbbbbbbbb(BB);               20
03. A single-liner;                         30
04. Dddd: DDDD,\nDDDDDDDDDDDD(DD);          40
05. Eeee: EEEE,\nEEEEEEEEEEEE(EE);          50
end;

【问题讨论】:

    标签: label gnuplot spacing


    【解决方案1】:

    在 gnuplot 中,您不能直接控制用于标签的行高。但是对于您的问题,有一个非常肮脏的解决方法:

    您可以在换行符处拆分标签,使用增强的标签语法更改每行的字体大小,但为换行符设置不同的字体大小。所以一个标签

    set label at 0,0 "first line\nsecond line" font ",10"
    

    改为

    set label at 0,0 "{/=10 first line}\n{/=10 second line} font ",8"
    

    您的脚本更改为:

    # Requires gnuplot >= 4.6
    set terminal pdf color solid font "Helvetica, 10" enhanced size 4, 3.72
    set output 'mwe.pdf'
    set border 3 lc rgb "#000000"
    set bmargin 9
    set ylabel offset -1
    TickSize = 10
    TicksFont = ", ".TickSize
    Title2Font = ", 14"
    
    set yrange[0:180 < * ]
    set format y "%.0f%%"
    
    set xtics out scale 0, 0 nomirror rotate by 90 right offset -0.1,0 font ",8"
    set ytics out nomirror font TicksFont
    unset key
    
    set datafile separator ";"
    set style fill transparent solid 1.0 border -1
    set style data boxes
    set boxwidth 1.0
    
    #Bottom-left plot
    set title "C) Third (sub)plot" font Title2Font
    
    set_label_size(s) = sprintf('{/=%d %s}', TickSize, s)
    label(s) = strstrt(s, "\n") ? set_label_size(s[:strstrt(s, "\n")-1])."\n".set_label_size(s[strstrt(s, "\n")+1:]) : set_label_size(s)
    
    plot '-' using ($0):2:(0xFF8080):xtic(label(strcol(1))) notitle lc rgb variable
    # Label; Value
    01. Aaaaa:\nAaaaaaaaa(AA);                  100
    02. Bbbbb:\nBbbbbbbbbbbb(BB);               20
    03. Ccccc: Ccccccc(Ccc),\nCccccccc(CCC);    30
    04. Dddd: DDDD,\nDDDDDDDDDDDD(DD);          40
    ;NaN
    01. Aaaaa:\nAaaaaaaaa(AA);                  100
    02. Bbbbb:\nBbbbbbbbbbbb(BB);               20
    03. A single-liner;                         30
    04. Dddd: DDDD,\nDDDDDDDDDDDD(DD);          40
    ;NaN
    01. Aaaaa:\nAaaaaaaaa(AA);                  100
    02. Bbbbb:\nBbbbbbbbbbbb(BB);               20
    03. A single-liner;                         30
    04. Dddd: DDDD,\nDDDDDDDDDDDD(DD);          40
    05. Eeee: EEEE,\nEEEEEEEEEEEE(EE);          50
    end;
    

    之前(左)和之后(右):

    【讨论】:

    • 哦!这真是太棒了!非常感谢你的伎俩。这个答案解决了标题中所说的问题(刻度线的水平偏移需要手动调整一次),展示了如何更改标签内的字体大小以及如何在GNUplot上使用C风格的函数!
    【解决方案2】:

    您可以切换到epslatex 终端并直接在您的gnuplot 脚本上使用latex 语法。然后您可以使用带有负参数的\vspace{} 命令来减小行间距,如下所示:

    \shortstack{01. Aaaaa: \vspace{-0.2em} \\ Aaaaaaaaa(AA)}
    

    虽然您需要转义反斜杠:

    \\shortstack{01. Aaaaa: \\vspace{-0.2em} \\\\ Aaaaaaaaa(AA)}
    

    【讨论】:

    • 这个答案似乎也很有趣,特别是因为它允许在乳胶中进行更复杂的后期编辑。但是,我需要继续为这些图形生成 PDF 文件(尽管我想我也可以使用 gnuplot 生成的 tex 文件来生成一个独立的 PDF 图形)。
    • 经验丰富的会员的问题:鉴于我现在不能自己尝试这个答案,但它似乎很有趣(并且正确),我是否也应该接受这个答案?
    • @Mike 您确实可以使用set term epslatex standalone,然后只使用pdflatex 来生成PDF 文件。我所做的是我有一个外部 tex 文件,我在其中加载 gnuplot 生成的文件。这样我可以加载更多的包等等(standalone header 也允许一些包)。您可以查看我之前给出的这个答案,以了解我是如何做到的,包括裁剪:stackoverflow.com/questions/22427878/…。关于你的第二个问题,你只能接受一个答案,应该是克里斯托夫的。
    • @Miguel 您还可以使用自动包含的gnuplot.cfg 文件。 @Mike您可以通过相应地更改我的答案中的labelset_label_size函数来组合这两个答案并即时执行Miguel建议的格式。
    【解决方案3】:

    是否可以仅更改整个绘图的大小,例如将绘图宽度从 4 英寸更改为 6 英寸,将高度从 3.72 更改为 5.58?

    这样,如果您将纵横比包含在不同的文档中,就会保留纵横比。

    之前:

    之后:

    【讨论】:

    • 好吧,很遗憾,这是不可接受的。由于图像在最终文档中具有固定宽度(pdflatex 中为 1\textwidth),因此增加宽度会改变纵横比。为了保持宽度,我猜乳胶会计算字体大小,并且标签最终会比原始情况小。 (无论如何,谢谢!)
    • 此时,我已经通过手工制作标签解决了我的问题。但是,这让我的程序员大脑感到刺痛,所以我仍然想知道是否有人有更好的解决方案。
    • 如何同时更改高度和宽度(我想您提到您已经使用了最小字体大小,否则我会建议这样做)。只要纵横比相同,乳胶代码就不必更改。
    • 抱歉造成误会。我的意思是我在纸上使用最小的可读字体。该图形以固定宽度(例如 15 厘米)绘制在最终文档中。我认为如果我改变图形的比例,那么它的高度会被调整以保持给定宽度的比例。图中所有的字体都是通过pdflatex重新计算来匹配最终大小的。这意味着如果我想保持最小(最终)字体大小,我唯一的解决方案是将标签放得更近。我认为第一个答案以简单的方式解决了问题,但我非常感谢您的回答!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    相关资源
    最近更新 更多