gnuplot带有条件格式的平滑频率

时间:2013-11-21 14:00:35

标签: plot gnuplot frequency palette

创建一个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 plotColor bars in different colors for some specific values in Gnuplot

但是,我发现光滑的频率使事情变得不起作用。如何传递值以创建不同的颜色?

2 个答案:

答案 0 :(得分:0)

我知道这已经快 8 岁了,但我遇到了同样的问题,根据上面 Christoph 的评论,我找到了一种方法。

下面是我想要的图表:

enter image description here

但是,仅通过三元和 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

结果:

enter image description here