【问题标题】:Redrawing Excel figures on gnuplot在 gnuplot 上重绘 Excel 图形
【发布时间】:2021-10-20 07:27:48
【问题描述】:

我正在使用 excel 并绘制了如下所示的两个直方图,有人告诉我在 windows 上使用 gnuplot 重新绘制它们,这对我来说是非常新的。
我要重绘的原图是这样的。

                     Area 1             Area 2 
               Case 1    Case 2   Case 1  Case 2 
Parameter 1     36         66      31      72
Parameter 2     57         91      44      85
Parameter 3     62         90      50      85

我的文件是一个文本文件,我将上面的表格写成如下,因为我不确定如何将不同的列组合在一起。

Area    Area1 Area1 Area2 Area2
Case  Case1 Case2   Case1   Case2
Parameter_1 36  66  31  72
Parameter_2 57  91  44  85
Parameter_3 62  90  50  85

我使用了以下命令,得到了一个以错误方式分组的直方图。

clear
reset
unset key
set style data histogram
set style fill solid border
set style histogram clustered
plot for [COL=2:5] 'date_mins.tsv' using COL:xticlabels(1) title columnheader

请指导我如何将列组合在一起以及如何在条形顶部添加数字。 {图表应与 Excel 生成的图表相同。}

【问题讨论】:

  • 到目前为止你尝试过什么?您是否搜索过现有的解决方案?至于我,在 SO 上搜索 gnuplot 和 histogram 会产生超过 800 个线程。
  • 同意埃尔德拉德。预计最少的研究工作和代码(不一定有效)。顺便问一下,您的输入文件、文本、CSV 或其他是什么?您的输入文件与上面显示的完全一样吗?什么是列分隔符、空格或制表符?在 TAB 的情况下,第二个示例的前两行中有多少列,只有 2 和 4?输入文件可以适应稍微不同的格式吗?
  • @theozh 谢谢你的建议,我有一个最小的工作示例,但它不正确。我现在已经编辑了我的问题。分隔符是空格分隔符,它是一个文本文件,也可以适应不同的格式。只是输出应该是一样的。谢谢你。请指导

标签: gnuplot histogram


【解决方案1】:

说实话,我经常对 gnuplot 中的直方图感到困惑,显然我不是唯一一个。在 gnuplot 控制台中,检查 help histograms。 虽然gnuplot homepage 上有一些直方图示例,但当然不是所有可能的变化都可以涵盖。 显然,这种绘图风格有点难以理解。 这也许可以解释为什么在带有 gnuplot 的直方图上有超过 800 个关于 SO 的问题。

我不确定是否或如何有效地获得所需的直方图,也许有一种简单的方法。 我会用with boxes 的绘图风格“手动”完成它。 检查下面的示例作为起点。包括一些奇怪的解决方法,例如将标题放入早期绘图中的数组以供以后使用。

代码:

### special histogram
reset session

$Data <<EOD
Area           Area1  Area1   Area2  Area2
Case           Case1  Case2   Case1  Case2
"Parameter 1"  36     66      31     72
"Parameter 2"  57     91      44     85
"Parameter 3"  62     90      50     85
EOD

set style fill solid noborder
set boxwidth 0.8
set key noautotitle out center bottom horizontal reverse Left samplen 1 width 2

A=2   # Areas
C=2   # Cases
P=3   # Parameters
g=1   # gap

PosX(a,c,p)   = ((a-1)*C*(P+g)) + (c-1)*(P+g) + p
PosY(a,c)     = column((a-1)*C+c+1)
PosXArea(a)   = (PosX(a,C,P)+PosX(a-1,C,P))*0.5
PosXCase(a,c) = (PosX(a,c,P)+PosX(a,c-1,P))*0.5
myColor(p)    = int(word("0x5b9bd5 0xed7d31 0xa5a5a5",int(p)))
myValue(a,c)  = strcol((a-1)*C+c+1)

set grid y
set xlabel "\n\n\n"     # get empty space below the plot
set format x ""         # no xtic labels 
set yrange[0:]
array Titles[P]         # array for titles

plot for [a=1:A] for [c=1:C] $Data u (PosX(a,c,$0)):(PosY(a,c)):(myColor($0+1)) skip 2 w boxes lc rgb var , \
     for [a=1:A] for [c=1:C]    '' u (PosX(a,c,$0)):(PosY(a,c)):(Titles[int($0+1)]=strcol(1), myValue(a,c)) skip 2 w labels offset 0,0.7, \
     for [a=1:A] for [c=1:C]    '' u (PosXCase(a,c)):(0):(myValue(a,c)) every ::1::1 w labels offset 0,-1, \
     for [a=1:A]                '' u (PosXArea(a)):(0):('\n\n'.myValue(a,1)) every ::0::0 w labels offset 0,-1, \
     for [p=1:P] keyentry w boxes lc rgb myColor(p) ti Titles[p]
### end of code

结果:

【讨论】:

  • 只是提一下。上面的示例(原样)(仅)在区域下的案例数量相同的情况下有效。如果区域有不同的案例,则需要调整代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 2013-12-22
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多