Gnuplot:如何防止Xticklabel被覆盖;设置xtics";

Gnuplot:如何防止Xticklabel被覆盖;设置xtics";,gnuplot,Gnuplot,我有这样一个三列的数据文件(名为“0.dat”,它有近10000行数据,下面只是一个示例): 第一列和第三列是用于打印的x坐标和y坐标。 第二列(ii)用于xtics标签 我希望xtic及其标签以3的间隔出现在x轴上,也就是说,如果有xtic标记和xtic标签“a d g”,则仅出现在x轴上的位置1 4 7 但是下面的脚本显示,我的数据文件中的每个点都创建了一个xtic,也就是说,“xticklabels”覆盖了“set xtics” 如何防止xticklabel覆盖“set xtics”?xt

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

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

我希望xtic及其标签以3的间隔出现在x轴上,也就是说,如果有xtic标记和xtic标签“a d g”,则仅出现在x轴上的位置1 4 7

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


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

xticlabels始终覆盖自动生成的标签

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

1) 定义标签的格式。然后,我们对每3个标签使用该格式,对其他2个插槽使用空白标签: 2) 跳过文件的第一行,该行不包含数据 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

替代方法

使用两个图,一个用于无tic标记的实际数据,一个仅用于有tic标记和标签的数据的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轴上。请参见修改后的答案。由于数据文件中的第一列是连续整数系列,我使用1:(-10)每3次修改
,使用($0):(-10)
(如果这确实有效,则不需要第一列数据)。但这会导致错误的结果。为什么?列0($0)从0开始计数,而不是从1开始,并且只计算实际读取的行数。我想你可以使用($0*3):(-10):xticlabels每3次使用
,应该是
($0*3+1)
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
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