【问题标题】:Gnuplot: how to prevent xticklabels from override "set xtics"Gnuplot:如何防止 xticklabels 覆盖“set xtics”
【发布时间】:2019-11-02 11:53:56
【问题描述】:

我有这样一个三列的数据文件(名为“0.dat”,有近10000行数据,以下只是举例):

i ii iii
1 a 1
2 b 2
3 c 6
4 d 8
5 e 10
6 f 12
7 g 14
8 h 16
9 i 18
10 j 20

第一列和第三列是用于绘图的 x 坐标和 y 坐标。 第二列 (ii) 用于 xtics 标签。

我希望xtic及其标签以3的间隔出现在x轴上,即只有在x轴的1 4 7位置,应该有xtic标记和xtic标签“a d g”。

但是下面的脚本显示我的数据文件中的每个点都创建了一个xtic,也就是说,“xticklabels”覆盖了“set xtics”。

set term png  size 800,600 
set output "0.png"
set grid
set xrang [1:]
set xtics 3
plot "0.dat" using 1:3:xticlabels(2) axes x1y1 w l
set output
pause 0

如何防止 xticklabels 覆盖“set xtics”?

【问题讨论】:

    标签: gnuplot


    【解决方案1】:

    xticlabels 总是覆盖自动生成的标签。

    但是,您可以将原始标签作为 xticlabel 的一部分。 这是一个将第 1 列内容打印为数字的选项 并将第 2 列内容作为字符串。

    1) 定义标签的格式。然后我们对每 3 个标签使用该格式,其他 2 个插槽使用空白标签: 2)跳过文件的第一行,其中不包含数据 3)每3行使用标签格式,否则使用空白标签

    set bmargin 3 # leave room for 2 lines of x labels
    label(i1,i2) = sprintf("%d\n%s",column(i1),stringcolumn(i2))
    
    plot '0.dat' skip 1 using 1:3:xticlabel(int($0)%3==0 ? label(1,2) : "") with lines
    

    替代方法

    使用两张图,一张用于没有标记的实际数据,一张用于仅 1/3 的带有标记和标签的数据。

    set bmargin 3 # leave room for 2 lines of x labels
    label(i1,i2) = sprintf("%d\n%s",column(i1),stringcolumn(i2))
    
    set yrange [0:*]  # So that a line at y = -10 will not show
    
    plot '0.dat' skip 1 using 1:3, \
         '0.dat' skip 1 every 3 using 1:(-10):xticlabel(label(1,2)) with lines
    

    【讨论】:

    • 感谢@Ethan 的解决方案。尽管如此,在这个解决方案中,每个数据点都会在 x 轴上创建一个 xtic 标记。因为我的数据文件有近 10000 行,这会导致 x 轴上有近 10000 个标记。我想要的只是那些 xtic 标记及其在一定间隔内的相关标签出现在 x 轴上。
    • 查看修改后的答案
    • 由于数据文件的第一列是一个连续的整数系列,我将every 3 using 1:(-10)修改为every 3 using ($0):(-10)(如果这样有效,则不需要第一列数据)。但这会导致错误的结果。为什么?
    • 第 0 列 ($0) 从 0 开始计数,而不是从 1 开始计数,并且只计算实际读取的行数。我想你可以使用every 3 using ($0 * 3):(-10):xticlabels
    • 应该是($0*3+1)
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2017-12-19
    • 2021-02-08
    • 2014-05-19
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多