【问题标题】:gnuplot automatic stack bar graphgnuplot 自动堆栈条形图
【发布时间】:2021-03-12 14:29:48
【问题描述】:

这是我的数据集:

type size name
label_0 1 nameOfData_0
label_0 2 nameOfData_1
label_0 3 nameOfData_2
label_1 2 nameOfData_3
label_2 1 nameOfData_4
label_0 2 nameOfData_5
label_1 3 nameOfData_6
label_3 2 nameOfData_7
label_3 1 nameOfData_8

我希望情节看起来像:

我希望每个标签都是一个堆栈,并且每个 nameOfData_X 根据其大小适合正确的堆栈。如果可能,还为堆栈的每个元素添加图例。

我知道我可以重新格式化数据以通过 gnuplot 轻松处理它,但我不想这样做。

关于如何通过 gnuplot 显示此图表的任何想法?

感谢您的帮助!

【问题讨论】:

    标签: gnuplot


    【解决方案1】:

    也许有一种方法可以使用 gnuplot 内置的堆叠直方图样式来实现这一点,请查看help histograms。 以下解决方案不太明显,但似乎给出了预期的结果并使用了绘图样式with boxxyerror(检查help boxxyerror)。

    1. 您需要第 1 列的唯一元素列表。此处将按第一次出现的顺序排列。
    2. 在循环绘图期间,您可以根据“过滤器”函数myAdd() 添加您的贡献。
    3. 当加法为零时更改颜色 (dy=0)。
    4. 您以类似的方式添加带有偏移量的标签

    这段代码或许可以简化,但可以作为起点。

    代码:

    ### "manual" stacked histogram
    reset session
    
    
    $Data <<EOD
    type size name
    label_0 1 nameOfData_0
    label_0 2 nameOfData_1
    label_0 3 nameOfData_2
    label_1 2 nameOfData_3
    label_2 1 nameOfData_4
    label_0 2 nameOfData_5
    label_1 3 nameOfData_6
    label_3 2 nameOfData_7
    label_3 1 nameOfData_8
    EOD
    
    # get a unique list from datablock column 1
    set table $Dummy
        Headers = 1
        addToList(list,col) = list.( strstrt(list,'"'.strcol(col).'"') > 0 ? '' : \
                              ' "'.strcol(col).'"')
        plot Uniques='' $Data u (Uniques=addToList(Uniques,1),'') skip Headers w table
    unset table
    N = words(Uniques)
    Unique(i) = word(Uniques,i)
    
    set xrange [1:N]
    set xtics out noenhanced
    set grid x,y
    set offsets 0.5,0.5,0.5,0
    unset key
    
    set style fill transparent solid 0.7 border
    myBoxWidth = 0.8
    myAdd(colD,colF,i) = strcol(colF) eq Unique(i) ? column(colD) : 0
    myLabel(col1,col2) = dy==0 ? '' : sprintf("%s\n%g",strcol(col1),column(col2))
    
    plot for [i=1:N] y=y0=(c=1,0) $Data u (i):(dy=myAdd(2,1,i), y=y+dy,(y0+y)/2.): \
             (myBoxWidth/2.):(y0=y,dy/2.):(dy==0?c:c=c+1) skip Headers w boxxy lc variable, \
         for [i=1:N] y=y0=0 $Data u (i):(dy=myAdd(2,1,i), y=y+dy,(y0+y)/2.): \
             (y0=y,myLabel(3,2)):xtic(Unique(i)) skip Headers w labels offset 0,0.5 noenhanced
    ### end of code
    

    结果:

    【讨论】:

    • 太棒了!非常感谢,正是我想要的!
    • 很高兴我能提供帮助。感谢 StackOverflow = 接受和/或投票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    相关资源
    最近更新 更多