首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GNUplot:如何在数据中使用颜色代码绘制行堆叠条形图?

GNUplot:如何在数据中使用颜色代码绘制行堆叠条形图?
EN

Stack Overflow用户
提问于 2016-12-06 02:02:24
回答 2查看 998关注 0票数 2

我有以下样本数据:

代码语言:javascript
复制
col1 2 0 1 1
col2 1 1 0 0
col3 1 1 1 0
col4 1 1 2 1
col5 1 1 1 1
col6 2 0 1 1
col7 1 1 2 2
col8 1 1 2 1

第四列和第五列是第二列和第三列的颜色代码。例如,我想要“1”表示绿色,2表示白色,0表示橙色。

下面是我试图绘制它的方法:

代码语言:javascript
复制
set key off
unset border
unset xtics
unset ytics
set style data histograms
set style histogram rowstacked
set boxwidth 1 relative
set style fill solid 1.0 border -1
set yrange [0:2]
set lmargin 0
set rmargin 0
set tmargin 0
set bmargin 0.1
set terminal pngcairo truecolor size 100,65
set output "/export/test.png"
set palette model RGB defined ( 0 'orange', 1 'green', 2 'white')
plot 'test.data' u 2 linecolor rgb "orange",  '' u 3 linecolor rgb "green"

以下是我在无法根据实际数据实现颜色的情况下得到的结果:

样本图像

那么,如何使用数据文件中指定的实际颜色呢?

如果有人想知道,如果这背后的理性鼓励了你的努力;-):我试图画一个惠普刀片c7000底盘,使用颜色编码显示空的底盘槽,插槽与刀片的开关。第2栏和第3栏中的实际值表示叶片是全高(值2)还是半高叶片(值1)。在没有刀片的地方,它的值仍然是1,默认为半高.

更新

有了这个,我就能得到我的need...Anybody有一个更短的版本?

代码语言:javascript
复制
plot 'test.data' u ($5==0?$2:sqrt(-1)) linecolor rgb "orange",\
    '' u ($5==1?$2:sqrt(-1)) linecolor rgb "green",\
    '' u ($5==2?$2:sqrt(-1)) linecolor rgb "white",\
    '' u ($4==0?$3:sqrt(-1)) linecolor rgb "orange",\
    '' u ($4==1?$3:sqrt(-1)) linecolor rgb "green",\
    '' u ($4==2?$3:sqrt(-1)) linecolor rgb "white"

新样本图像

进一步完善

如何将编号添加到块中,如以下图像所示:

最新问题:

我注意到,有时彩色托盘的颜色是错误的,除非在托盘中定义的所有颜色都在数据中。例如,使用以下数据:

代码语言:javascript
复制
1  2 0 1 1
2  1 1 0 0
3  2 0 1 1
4  2 0 1 1
5  1 1 1 1
6  1 1 1 0
7  1 1 1 1
8  1 1 1 1

你可以从第4-5号中看到,我只有‘绿色’(1)和‘有机’(0)。因为我没有空槽,所以我没有“白色”颜色。我得到了这张照片:

这个图像显然是不正确的,因为白色表示我有一个空槽。我期待着这张照片:

那么,颜色‘白色’和‘绿色’是如何被翻转的呢?我注意到,如果我将其中任何一个颜色代码更改为白色,那么彩色托盘将正确工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-07 08:00:28

我会使用boxxyerrorbars绘图风格。不管名字是什么,这是你应该使用的,当你想要绘制“不同”的盒子。

代码语言:javascript
复制
set key off
unset border
unset xtics
unset ytics
unset colorbox
set style fill solid 1.0 border -1

set palette model RGB defined ( 0 'orange', 1 'green', 2 'white')
set cbrange [0:2]
set style data boxxyerrorbars
plot 'test.data' u 0:(0.5*$2):(0.5):(0.5*$2):4 lc palette,\
    '' u 0:($2 + 0.5*$3):(0.5):(0.5*$3):5 lc palette

boxxyerrorbars绘图样式本身包含四列( xydxdy ),lc palette使用第五列中的值来根据当前调色板确定颜色。为了在调色板绝对值中设置值,我还将cbrange设置为与调色板覆盖的范围相同的范围。

using 0:(0.5*$2):(0.5):(0.5*$2):4一词的意思是:

  • 使用零列(行号)作为x-value (方框中心)
  • 第二列中的值乘以0.5作为y-value (方框中心)
  • 数字0.5dx (框宽的一半)
  • 第二列中的值乘以0.5作为dy-value (框高的一半)

对于第二个绘图部分,y-value是第二列中的值加上第三列中值的一半。

还可以轻松地编写此解决方案,以允许增加堆叠框的数量:

代码语言:javascript
复制
set palette model RGB defined ( 0 'orange', 1 'green', 2 'white')
set cbrange [0:2]
set style data boxxyerrorbars

last_column = 3
plot for [i=2:last_column] 'test.data' \
    u 0:(0.5*column(i) + sum[c=2:(i-1)] column(c)):(0.5):(0.5*column(i)):(column(last_column + i - 1)) lc palette
票数 2
EN

Stack Overflow用户

发布于 2016-12-06 22:46:41

颜色用于识别不同堆栈中相应的部分。因此,在属于同一直方图的所有堆栈中,它们必须遵循相同的顺序。

但是Gnuplot有一个newhistogram命令,之后颜色可以被“重置”。还有一个multiplot命令,它可以用来在循环中添加新的直方图。

下面是替换原始plot命令的脚本部分:

代码语言:javascript
复制
set style line 1 lt 1 lc rgb "white"
set style line 2 lt 1 lc rgb "green"
set style line 3 lt 1 lc rgb "orange"

stats 'test.data' u 2
n = STATS_records

set multiplot

do for [i=0:n-1] {
   plot "test.data" u (0) ,\
        newhistogram "" at i, "" every ::i::i u (style = $5 + 1, 0), \
                              "" every ::i::i u 2 ls style,          \
                              "" every ::i::i u (style = $4 + 1, 0), \
                              "" every ::i::i u 3 ls style
}

unset multiplot

这就是它的工作原理:

  • set style ...:定义将要使用的样式(颜色)。
  • stats ...:查找行数。我们将为每一行绘制一个独立的直方图。
  • set multiplot:我们会一次又一次地在同一地区进行策划。
  • "test.data" u (0):什么都不画,只保留所有直方图的空间。
  • new histogram "" at i:在x轴上初始化一个没有偏移量i的名称的新直方图。我们将在这个偏移量上绘制一个堆栈。
  • "" every ::i::i:绘图行i
  • u (style = $5 + 1, 0):什么都不画,但是从文件中读取当前行的颜色。
  • u 2 ls style:用以前读取的样式绘制当前行的第2列。

我不知道这个版本是否比你的短:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40986627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档