创建一个normiles堆栈图非常合适,现在我想为特定范围内的盒子使用不同的颜色。
为此,我采纳了以下内容:
set palette maxcolors 2
set palette defined ( 0 '#C0504D', 1 '#00B059')
plot dataFileCity using (rounded(stringcolumn(1) eq city ? $2 : NaN)):
(100 / (bin_width * STATS_records)):($2 > 1300 ? 0 : 1)
smooth frequency with boxes palette
如果第2列的值高于1300,我希望颜色不同。
基于: Normalized histograms in gnuplot with added function plot 和 Color bars in different colors for some specific values in Gnuplot
但是,我发现光滑的频率使事情变得不起作用。如何传递值以创建不同的颜色?
答案 0 :(得分:0)
我知道这已经快 8 岁了,但我遇到了同样的问题,根据上面 Christoph 的评论,我找到了一种方法。
下面是我想要的图表:
但是,仅通过三元和 NaN
来选择某些行与 smooth freq
并不能很好地配合,而且我的直方图是错误的(似乎垃圾箱是相互重叠的,频率没有那么高正如他们应该的那样)。
这不起作用:
plot \
'filename' using ($1 >= 0 ? $1 : NaN) notitle smooth freq with boxes fillcolor rgb "green", \
'filename' using ($1 < 0 ? $1 : NaN) notitle smooth freq with boxes fillcolor rgb "red"
在 gnuplot 5.4.2 的手册中,本节描述了一个实验性功能,结合 set table
,我可以实现上图。
[实验] 要仅选择数据点的子集进行制表,您可以在命令末尾提供输入过滤条件 (if )。请注意,输入过滤器可能会引用不属于输出的数据列。在出现在 gnuplot 的发布版本中之前,此功能可能会发生重大变化。
plot <file> using 1:2:($4+$5) with table if (strcol(3) eq "Red")
-- p207 gnuplot v5.4.2 手册
所以方法是:
set table $my_data_block_green
设置下一个绘图命令以输出到 $my_data_block_green
数据块。我们将为每种颜色创建一个数据块,这是第一个。plot <file> with table if (<condition_for_green>)
只将匹配 <condition_for_green>
的行写入绿色数据块。set table $my_data_block_red
(如第 1 点)。plot <file> with table if (<condition_for_red>)
只将匹配 <condition_for_red>
的行写入红色数据块。unset table
将绘图命令写入表格。<file>
。相关代码(不是上图的完整代码):
set table $db1
plot <filename> using 7:(1) with table if ($7 >= 0)
set table $db2
plot <filename> using 7:(1) with table if ($7 < 0)
unset table
plot \
'$db1' using $1:.. .. fillcolor rgb "green", \
'$db2' using $1:.. .. fillcolor rgb "red"
希望能为某人节省几分钟时间。
答案 1 :(得分:0)
添加到@TKF 的回答中...无需将 smooth freq
数据拆分为两个表。
相反,将其绘制到一张表中,并通过 lc rgb variable
并通过定义适当的函数来设置颜色。
以下示例适用于 gnuplot>=5.2,对早期版本也进行了一些修改。
代码:
### histogram with split colors
reset session
# create some random test data
set print $Data
do for [i=1:2000] {
print sprintf("%g",int(invnorm(rand(0))*100))
}
set print
stats $Data u 1 nooutput
xmin = STATS_min
xmax = STATS_max
N = 20
myWidth = (xmax-xmin)/N
bin(col) = myWidth*floor(column(col)/myWidth)+myWidth/2.
set boxwidth myWidth
set key noautotitle
set style fill solid 0.3
set grid x,y
set table $Histo
plot $Data u (bin(1)) smooth freq
unset table
myColor(col) = column(col)<0 ? 0xff0000 : 0x00cc00
plot $Histo u 1:2:(myColor(1)) w boxes lc rgb var
### end of code
结果: