如何控制在 gnuplot 中打印多少个 xlabel?
How to control how many xlabels are printed in gnuplot?
我正在使用 Gnuplot 的颜色框和数据矩阵来制作每日显示 activity 的热图样式:
数据文件的样本部分:
Week commencing,29 Jun 2020,06 Jul 2020,13 Jul 2020,20 Jul 2020,27 Jul 2020,03 Aug 2020,10 Aug 2020,17 Aug 2020,24 Aug 2020,31 Aug 2020,07 Sep 2020,14 Sep 2020,21 Sep 2020,28 Sep 2020,05 Oct 2020,12 Oct 2020,19 Oct 2020,26 Oct 2020,02 Nov 2020,09 Nov 2020
Mon,11,6,0,4,4,9,10,7,5,0,22,10,9,8,9,2,4,11,11,7
Tues,3,5,0,6,3,4,11,3,6,12,6,3,4,4,9,12,2,1,8,2
Weds,10,1,0,9,4,1,6,5,6,3,2,5,1,5,7,5,8,10,2,12
Thurs,6,3,0,8,3,2,7,14,10,12,14,8,1,3,19,11,8,16,3,7
Fri,16,1,2,5,10,3,0,1,10,1,13,10,0,10,6,10,7,4,9,5
Sat,6,6,8,21,2,7,0,11,0,7,2,23,2,8,11,11,5,3,12,0
Sun,8,7,3,1,8,2,8,2,2,2,6,6,3,3,2,2,4,5,8,0
使用此脚本:
DATAFILE="done_tasks_matrix.csv"
set term png size 800, 300 font "Avenir,9"
set datafile separator comma columnheaders
set palette rgbformula -9,2,-9
set cbrange [0:*]
set cblabel "Completed tasks (Goals + Projects + Other)"
unset cbtics
set xrange writeback
set yrange [6.5:-0.5] writeback # to get it displaying Mon->Sun not Sun->Mon down the page
set xdata time
set timefmt "%d %b %Y" # format of the dates in the input
set format x "%d %b" # format of dates to show
set output "/Users/jonathan/Dropbox/NPSummaries/done_tasks_heatmap.png"
plot DATAFILE matrix rowheaders columnheaders using 1:2:3 with image, \
DATAFILE matrix rowheaders columnheaders using 1:2:( == 0 ? "" : sprintf("%g",) ) with labels font ",8" tc rgb "#22BB22"
当我收集到更多数据时,xlabels 重叠了。我找不到让它在 n 标签中只显示 1 的方法。但是,在带有日期的更简单的折线图上,xlabel Gnuplot 似乎会自动删除标签以确保它们不重叠。
是否可以删除一些 xlabels,或者我是否需要更改输入数据以使一些为空?
额外的问题:为什么输出包括第二条绘图线作为文本,并遵守其说明?
或者,您可以旋转 xtics
set xtics rotate by -90
奖励:将 notitle
放在第二个情节之后:
plot DATAFILE matrix rowheaders columnheaders using 1:2:3 with image, \
DATAFILE matrix rowheaders columnheaders using 1:2:( == 0 ? "" : sprintf("%g",) ) with labels font ",8" tc rgb "#22BB22" notitle
正如@Tom Solid 已经指出的那样,最简单的方法可能就是旋转 xtic 标签。
您的“奖励问题”也可以通过插入一行来回答:unset key
.
顺便说一下,你的代码中的set xdata time
、set timefmt "%d %b %Y"
等是没有效果的。列headers 将仅用作 xtic 标签的文本。
一个不同的(更复杂的)建议是将日期转换为日历周。这将节省 space。但请记住,一周的开始时间(周日或周一?)以及第 1 周是哪一周有不同的定义。
代码:
### schedule with calendar weeks
reset session
$Data <<EOD
Week commencing,29 Jun 2020,06 Jul 2020,13 Jul 2020,20 Jul 2020,27 Jul 2020,03 Aug 2020,10 Aug 2020,17 Aug 2020,24 Aug 2020,31 Aug 2020,07 Sep 2020,14 Sep 2020,21 Sep 2020,28 Sep 2020,05 Oct 2020,12 Oct 2020,19 Oct 2020,26 Oct 2020,02 Nov 2020,09 Nov 2020
Mon,11,6,0,4,4,9,10,7,5,0,22,10,9,8,9,2,4,11,11,7
Tue,3,5,0,6,3,4,11,3,6,12,6,3,4,4,9,12,2,1,8,2
Wed,10,1,0,9,4,1,6,5,6,3,2,5,1,5,7,5,8,10,2,12
Thu,6,3,0,8,3,2,7,14,10,12,14,8,1,3,19,11,8,16,3,7
Fri,16,1,2,5,10,3,0,1,10,1,13,10,0,10,6,10,7,4,9,5
Sat,6,6,8,21,2,7,0,11,0,7,2,23,2,8,11,11,5,3,12,0
Sun,8,7,3,1,8,2,8,2,2,2,6,6,3,3,2,2,4,5,8,0
EOD
set datafile separator comma
unset key
set palette rgbformula -9,2,-9
set cbrange [0:*]
set cblabel "Completed tasks (Goals + Projects + Other)"
unset cbtics
set style fill solid 1.0
set locale "English_US" # if not already set, to correctly interpret the month abbreviations
set xlabel "Calendar week"
myCW(col) = sprintf("%s",strftime("%W",strptime("%d %b %Y",strcol(col)))) # date --> calendar week
stats [*:*][*:*] $Data u 2 skip 1 nooutput # get the number of columns
MaxCol = STATS_columns
set xrange [-0.5:MaxCol-1.5]
set yrange [6.5:-0.5]
plot $Data matrix rowheaders using 1:2:3 skip 1 with image, \
$Data matrix rowheaders using 1:2:(==0 ? "" : sprintf("%g",) ) skip 1 with labels font ",8" tc rgb "#22BB22", \
for [i=2:MaxCol] $Data u (i-2):(NaN):xtic(myCW(i)) every ::0::0
### end of code
结果:
加法:
@JGC,这就是 gnuplot 的优势,不知何故会有解决方案,有时有点麻烦,但大多数情况下存在一些解决方法。
通常,我认为数据是给定的和固定的。在某些情况下,您可能已经在创建数据时更改数据格式并使其适应 gnuplot 的“特殊需求”以实现您的特殊愿望。
正如我提到的,您的标签太长了。 plot ... matrix columnheaders
只会将它们全部用作文本标签。我不知道你可以直接跳过一些。但这是 gnuplot,...所以,有一个解决方法。
你需要知道你有多少列。这个,你可以用stats
查出来。但是,如果第一行是 headers 或字符串,gnuplot 无法识别列,这就是为什么您必须跳过第一行,即 skip 1
。尽管语法 plot for [i=2:*] u 1:(column(i)) ...
应该循环所有列,但我发现这会导致 gnuplot 挂起或崩溃(我还没有找到为什么会这样以及如何定期重现它)。
使用以下构造,您可以 select 您希望显示多少个 xtic 标签:for [i=2+Noffset:MaxCol:Nxtic] $Data u (i-2):(NaN):xtic(strcol(i)) every ::0::0
。此处:每个 Nxtic=4
标签的偏移量为 Noffset=1
。此外,我认为让一些 xtic 标记可见很重要,尤其是当您的 xtic 标签相当长时。否则你不知道日期实际属于哪一列。
代码:
### schedule from matrix with every nth label only
reset session
$Data <<EOD
Week commencing,29 Jun 2020,06 Jul 2020,13 Jul 2020,20 Jul 2020,27 Jul 2020,03 Aug 2020,10 Aug 2020,17 Aug 2020,24 Aug 2020,31 Aug 2020,07 Sep 2020,14 Sep 2020,21 Sep 2020,28 Sep 2020,05 Oct 2020,12 Oct 2020,19 Oct 2020,26 Oct 2020,02 Nov 2020,09 Nov 2020
Mon,11,6,0,4,4,9,10,7,5,0,22,10,9,8,9,2,4,11,11,7
Tue,3,5,0,6,3,4,11,3,6,12,6,3,4,4,9,12,2,1,8,2
Wed,10,1,0,9,4,1,6,5,6,3,2,5,1,5,7,5,8,10,2,12
Thu,6,3,0,8,3,2,7,14,10,12,14,8,1,3,19,11,8,16,3,7
Fri,16,1,2,5,10,3,0,1,10,1,13,10,0,10,6,10,7,4,9,5
Sat,6,6,8,21,2,7,0,11,0,7,2,23,2,8,11,11,5,3,12,0
Sun,8,7,3,1,8,2,8,2,2,2,6,6,3,3,2,2,4,5,8,0
EOD
set datafile separator comma
unset key
set palette rgbformula -9,2,-9
set cbrange [0:*]
set cblabel "Completed tasks (Goals + Projects + Other)"
unset cbtics
set style fill solid 1.0
stats [*:*][*:*] $Data u 2 skip 1 nooutput # get the number of columns
MaxCol = STATS_columns
Nxtic = 4
Noffset = 1
set xtics out
set yrange [6.5:-0.5]
plot $Data matrix rowheaders using 1:2:3 skip 1 with image, \
$Data matrix rowheaders using 1:2:(==0 ? "" : sprintf("%g",) ) skip 1 with labels font ",8" tc rgb "#22BB22", \
for [i=2+Noffset:MaxCol:Nxtic] $Data u (i-2):(NaN):xtic(i) every ::0::0
### end of code
结果:
主要问题
我找不到使用某些选项“删除一些 xlabels”的简单方法。如您所说,如果您可以像下面这样轻松地“更改输入数据,使某些数据为空白”,这是获得所需输出的捷径。
# Week commencing,29 Jun 2020,06 Jul 2020,13 Jul 2020,20 Jul 2020,27 Jul 2020,03 Aug 2020,10 Aug 2020,17 Aug 2020,24 Aug 2020,31 Aug 2020,07 Sep 2020,14 Sep 2020,21 Sep 2020,28 Sep 2020,05 Oct 2020,12 Oct 2020,19 Oct 2020,26 Oct 2020,02 Nov 2020,09 Nov 2020
Week commencing,29 Jun,,,20 Jul,,,10 Aug,,,31 Aug,,,21 Sep,,,12 Oct,,,02 Nov,
Mon,11,6,0,4,4,9,10,7,5,0,22,10,9,8,9,2,4,11,11,7
Tues,3,5,0,6,3,4,11,3,6,12,6,3,4,4,9,12,2,1,8,2
Weds,10,1,0,9,4,1,6,5,6,3,2,5,1,5,7,5,8,10,2,12
Thurs,6,3,0,8,3,2,7,14,10,12,14,8,1,3,19,11,8,16,3,7
Fri,16,1,2,5,10,3,0,1,10,1,13,10,0,10,6,10,7,4,9,5
Sat,6,6,8,21,2,7,0,11,0,7,2,23,2,8,11,11,5,3,12,0
Sun,8,7,3,1,8,2,8,2,2,2,6,6,3,3,2,2,4,5,8,0
第一行是对原行的注释。第二行
被插入以存储要在 xtics 上显示的标签。如果你有这样的输入文件,你可以简单地运行你的脚本并得到这样的图像。
奖金(?)问题
您还可以通过执行以下操作删除图例中的长字符串,
set key noautotitle
“设置键自动标题”是默认设置。并且绘图命令中没有明确给出标题字符串(包括关键字“notitle”),如您所见,绘图命令本身的字符串将显示在图例中。上面的命令禁用此默认设置。
我正在使用 Gnuplot 的颜色框和数据矩阵来制作每日显示 activity 的热图样式:
数据文件的样本部分:
Week commencing,29 Jun 2020,06 Jul 2020,13 Jul 2020,20 Jul 2020,27 Jul 2020,03 Aug 2020,10 Aug 2020,17 Aug 2020,24 Aug 2020,31 Aug 2020,07 Sep 2020,14 Sep 2020,21 Sep 2020,28 Sep 2020,05 Oct 2020,12 Oct 2020,19 Oct 2020,26 Oct 2020,02 Nov 2020,09 Nov 2020
Mon,11,6,0,4,4,9,10,7,5,0,22,10,9,8,9,2,4,11,11,7
Tues,3,5,0,6,3,4,11,3,6,12,6,3,4,4,9,12,2,1,8,2
Weds,10,1,0,9,4,1,6,5,6,3,2,5,1,5,7,5,8,10,2,12
Thurs,6,3,0,8,3,2,7,14,10,12,14,8,1,3,19,11,8,16,3,7
Fri,16,1,2,5,10,3,0,1,10,1,13,10,0,10,6,10,7,4,9,5
Sat,6,6,8,21,2,7,0,11,0,7,2,23,2,8,11,11,5,3,12,0
Sun,8,7,3,1,8,2,8,2,2,2,6,6,3,3,2,2,4,5,8,0
使用此脚本:
DATAFILE="done_tasks_matrix.csv"
set term png size 800, 300 font "Avenir,9"
set datafile separator comma columnheaders
set palette rgbformula -9,2,-9
set cbrange [0:*]
set cblabel "Completed tasks (Goals + Projects + Other)"
unset cbtics
set xrange writeback
set yrange [6.5:-0.5] writeback # to get it displaying Mon->Sun not Sun->Mon down the page
set xdata time
set timefmt "%d %b %Y" # format of the dates in the input
set format x "%d %b" # format of dates to show
set output "/Users/jonathan/Dropbox/NPSummaries/done_tasks_heatmap.png"
plot DATAFILE matrix rowheaders columnheaders using 1:2:3 with image, \
DATAFILE matrix rowheaders columnheaders using 1:2:( == 0 ? "" : sprintf("%g",) ) with labels font ",8" tc rgb "#22BB22"
当我收集到更多数据时,xlabels 重叠了。我找不到让它在 n 标签中只显示 1 的方法。但是,在带有日期的更简单的折线图上,xlabel Gnuplot 似乎会自动删除标签以确保它们不重叠。
是否可以删除一些 xlabels,或者我是否需要更改输入数据以使一些为空?
额外的问题:为什么输出包括第二条绘图线作为文本,并遵守其说明?
或者,您可以旋转 xtics
set xtics rotate by -90
奖励:将 notitle
放在第二个情节之后:
plot DATAFILE matrix rowheaders columnheaders using 1:2:3 with image, \
DATAFILE matrix rowheaders columnheaders using 1:2:( == 0 ? "" : sprintf("%g",) ) with labels font ",8" tc rgb "#22BB22" notitle
正如@Tom Solid 已经指出的那样,最简单的方法可能就是旋转 xtic 标签。
您的“奖励问题”也可以通过插入一行来回答:unset key
.
顺便说一下,你的代码中的set xdata time
、set timefmt "%d %b %Y"
等是没有效果的。列headers 将仅用作 xtic 标签的文本。
一个不同的(更复杂的)建议是将日期转换为日历周。这将节省 space。但请记住,一周的开始时间(周日或周一?)以及第 1 周是哪一周有不同的定义。
代码:
### schedule with calendar weeks
reset session
$Data <<EOD
Week commencing,29 Jun 2020,06 Jul 2020,13 Jul 2020,20 Jul 2020,27 Jul 2020,03 Aug 2020,10 Aug 2020,17 Aug 2020,24 Aug 2020,31 Aug 2020,07 Sep 2020,14 Sep 2020,21 Sep 2020,28 Sep 2020,05 Oct 2020,12 Oct 2020,19 Oct 2020,26 Oct 2020,02 Nov 2020,09 Nov 2020
Mon,11,6,0,4,4,9,10,7,5,0,22,10,9,8,9,2,4,11,11,7
Tue,3,5,0,6,3,4,11,3,6,12,6,3,4,4,9,12,2,1,8,2
Wed,10,1,0,9,4,1,6,5,6,3,2,5,1,5,7,5,8,10,2,12
Thu,6,3,0,8,3,2,7,14,10,12,14,8,1,3,19,11,8,16,3,7
Fri,16,1,2,5,10,3,0,1,10,1,13,10,0,10,6,10,7,4,9,5
Sat,6,6,8,21,2,7,0,11,0,7,2,23,2,8,11,11,5,3,12,0
Sun,8,7,3,1,8,2,8,2,2,2,6,6,3,3,2,2,4,5,8,0
EOD
set datafile separator comma
unset key
set palette rgbformula -9,2,-9
set cbrange [0:*]
set cblabel "Completed tasks (Goals + Projects + Other)"
unset cbtics
set style fill solid 1.0
set locale "English_US" # if not already set, to correctly interpret the month abbreviations
set xlabel "Calendar week"
myCW(col) = sprintf("%s",strftime("%W",strptime("%d %b %Y",strcol(col)))) # date --> calendar week
stats [*:*][*:*] $Data u 2 skip 1 nooutput # get the number of columns
MaxCol = STATS_columns
set xrange [-0.5:MaxCol-1.5]
set yrange [6.5:-0.5]
plot $Data matrix rowheaders using 1:2:3 skip 1 with image, \
$Data matrix rowheaders using 1:2:(==0 ? "" : sprintf("%g",) ) skip 1 with labels font ",8" tc rgb "#22BB22", \
for [i=2:MaxCol] $Data u (i-2):(NaN):xtic(myCW(i)) every ::0::0
### end of code
结果:
加法:
@JGC,这就是 gnuplot 的优势,不知何故会有解决方案,有时有点麻烦,但大多数情况下存在一些解决方法。
通常,我认为数据是给定的和固定的。在某些情况下,您可能已经在创建数据时更改数据格式并使其适应 gnuplot 的“特殊需求”以实现您的特殊愿望。
正如我提到的,您的标签太长了。 plot ... matrix columnheaders
只会将它们全部用作文本标签。我不知道你可以直接跳过一些。但这是 gnuplot,...所以,有一个解决方法。
你需要知道你有多少列。这个,你可以用
stats
查出来。但是,如果第一行是 headers 或字符串,gnuplot 无法识别列,这就是为什么您必须跳过第一行,即skip 1
。尽管语法plot for [i=2:*] u 1:(column(i)) ...
应该循环所有列,但我发现这会导致 gnuplot 挂起或崩溃(我还没有找到为什么会这样以及如何定期重现它)。使用以下构造,您可以 select 您希望显示多少个 xtic 标签:
for [i=2+Noffset:MaxCol:Nxtic] $Data u (i-2):(NaN):xtic(strcol(i)) every ::0::0
。此处:每个Nxtic=4
标签的偏移量为Noffset=1
。此外,我认为让一些 xtic 标记可见很重要,尤其是当您的 xtic 标签相当长时。否则你不知道日期实际属于哪一列。
代码:
### schedule from matrix with every nth label only
reset session
$Data <<EOD
Week commencing,29 Jun 2020,06 Jul 2020,13 Jul 2020,20 Jul 2020,27 Jul 2020,03 Aug 2020,10 Aug 2020,17 Aug 2020,24 Aug 2020,31 Aug 2020,07 Sep 2020,14 Sep 2020,21 Sep 2020,28 Sep 2020,05 Oct 2020,12 Oct 2020,19 Oct 2020,26 Oct 2020,02 Nov 2020,09 Nov 2020
Mon,11,6,0,4,4,9,10,7,5,0,22,10,9,8,9,2,4,11,11,7
Tue,3,5,0,6,3,4,11,3,6,12,6,3,4,4,9,12,2,1,8,2
Wed,10,1,0,9,4,1,6,5,6,3,2,5,1,5,7,5,8,10,2,12
Thu,6,3,0,8,3,2,7,14,10,12,14,8,1,3,19,11,8,16,3,7
Fri,16,1,2,5,10,3,0,1,10,1,13,10,0,10,6,10,7,4,9,5
Sat,6,6,8,21,2,7,0,11,0,7,2,23,2,8,11,11,5,3,12,0
Sun,8,7,3,1,8,2,8,2,2,2,6,6,3,3,2,2,4,5,8,0
EOD
set datafile separator comma
unset key
set palette rgbformula -9,2,-9
set cbrange [0:*]
set cblabel "Completed tasks (Goals + Projects + Other)"
unset cbtics
set style fill solid 1.0
stats [*:*][*:*] $Data u 2 skip 1 nooutput # get the number of columns
MaxCol = STATS_columns
Nxtic = 4
Noffset = 1
set xtics out
set yrange [6.5:-0.5]
plot $Data matrix rowheaders using 1:2:3 skip 1 with image, \
$Data matrix rowheaders using 1:2:(==0 ? "" : sprintf("%g",) ) skip 1 with labels font ",8" tc rgb "#22BB22", \
for [i=2+Noffset:MaxCol:Nxtic] $Data u (i-2):(NaN):xtic(i) every ::0::0
### end of code
结果:
主要问题
我找不到使用某些选项“删除一些 xlabels”的简单方法。如您所说,如果您可以像下面这样轻松地“更改输入数据,使某些数据为空白”,这是获得所需输出的捷径。
# Week commencing,29 Jun 2020,06 Jul 2020,13 Jul 2020,20 Jul 2020,27 Jul 2020,03 Aug 2020,10 Aug 2020,17 Aug 2020,24 Aug 2020,31 Aug 2020,07 Sep 2020,14 Sep 2020,21 Sep 2020,28 Sep 2020,05 Oct 2020,12 Oct 2020,19 Oct 2020,26 Oct 2020,02 Nov 2020,09 Nov 2020
Week commencing,29 Jun,,,20 Jul,,,10 Aug,,,31 Aug,,,21 Sep,,,12 Oct,,,02 Nov,
Mon,11,6,0,4,4,9,10,7,5,0,22,10,9,8,9,2,4,11,11,7
Tues,3,5,0,6,3,4,11,3,6,12,6,3,4,4,9,12,2,1,8,2
Weds,10,1,0,9,4,1,6,5,6,3,2,5,1,5,7,5,8,10,2,12
Thurs,6,3,0,8,3,2,7,14,10,12,14,8,1,3,19,11,8,16,3,7
Fri,16,1,2,5,10,3,0,1,10,1,13,10,0,10,6,10,7,4,9,5
Sat,6,6,8,21,2,7,0,11,0,7,2,23,2,8,11,11,5,3,12,0
Sun,8,7,3,1,8,2,8,2,2,2,6,6,3,3,2,2,4,5,8,0
第一行是对原行的注释。第二行 被插入以存储要在 xtics 上显示的标签。如果你有这样的输入文件,你可以简单地运行你的脚本并得到这样的图像。
奖金(?)问题
您还可以通过执行以下操作删除图例中的长字符串,
set key noautotitle
“设置键自动标题”是默认设置。并且绘图命令中没有明确给出标题字符串(包括关键字“notitle”),如您所见,绘图命令本身的字符串将显示在图例中。上面的命令禁用此默认设置。