【问题标题】:Gnuplot repeats colors in rowstack histogramsGnuplot 在行堆栈直方图中重复颜色
【发布时间】:2013-08-09 13:04:56
【问题描述】:

我目前正在使用带有行堆叠直方图的 gnuplot 绘制一些数据。 问题是,在选择了 9 种不同的颜色后颜色开始重复。人们可以在官方 gnuplot 示例中看到这种情况(参见 http://gnuplot.sourceforge.net/demo/histograms.html - 示例 4 和 5)

有没有办法告诉 gnuplot 使用更多不同的颜色?

【问题讨论】:

    标签: colors gnuplot


    【解决方案1】:

    没有完全自动化的方法可以做到这一点,但您可以使用set style line ... 定义任意数量的线条样式,然后使用它们。在这里,我只是用一个简单的迭代来定义几种颜色:

    do for [i=1:20] {
        set style line i linecolor rgb hsv2rgb(0.05*(i-1), 1, 1)
    }
    set style data histograms
    set style histogram rowstacked
    set style fill solid border -1
    set boxwidth 0.75
    plot for [i=1:20] 'mydata.dat' u 2 ls i t 'ls '.i
    

    数据文件只包含值

    1 0.1
    2 0.2
    3 0.3
    

    请注意,hsv2rgb 函数仅从 5.0 开始定义。对于早期版本,您可以使用以下用户定义的函数来获得相同的功能:

    rgb2int(r,g,b) = int(255*r)*2**16 + int(255*g)*2**8 + int(255*b)
    hsv2rgb(h,s,v) = (s == 0 ? rgb2int(v,v,v) : (HSV_h = h*6.0, HSV_i = int(floor(HSV_h)), HSV_f = HSV_h - HSV_i, HSV_p = v*(1.0 - s), HSV_q = v*(1.0-s*HSV_f), HSV_t = v*(1.0-s*(1.0-HSV_f)), (HSV_i%6 == 0 ? rgb2int(v,HSV_t,HSV_p) : (HSV_i%6 == 1 ? rgb2int(HSV_q,v,HSV_p) : (HSV_i%6 == 2 ? rgb2int(HSV_p,v,HSV_t) : (HSV_i%6 == 3 ? rgb2int(HSV_p,HSV_q,v) : (HSV_i%6 == 4 ? rgb2int(HSV_t,HSV_p,v) : rgb2int(v,HSV_p,HSV_q))))))))
    

    为方便起见,您可以将此代码放入配置文件或第三个脚本hsv2rgb.gp,并在使用该函数之前将其包含在load 'hsv2rgb.gp' 中。

    4.6.3 的输出是:

    【讨论】:

    • hsv2rgb 抛出未定义函数错误,我无法应用解决此问题的补丁。您能否展示一个没有 hsv2rgb 的代码版本?我正在使用 Gnuplot 版本 4.6 补丁级别 3。
    • @Jey Ups,没有注意到 hsv2rgb 仅在 5.0 中可用。请参阅我对具有(希望)相同功能的用户定义函数的更新。
    • 谢谢。我尝试了普通直方图样式“设置样式数据直方图”的解决方案,但我没有得到我所期望的。我了解 OP 的问题是关于 rowstacked 的。此解决方案是否仅适用于行堆叠直方图?我的数据文件中也只有两列。
    • 原则上,着色应该适用于任何类型的图表。我的示例有点特殊:我没有使用包含 20 列的数据文件,而是使用只有两列的数据文件,但将第二列重用了 20 次。我在上述解决方案中包含了我得到的输出。如果在您的情况下它不起作用,您可能会提出一个新问题并提供代码和数据。
    • 问题来了。 stackoverflow.com/questions/29633894/…。我也对使用直方图的解决方案持开放态度。我最初尝试了你的解决方案,当我失败时,我切换到'boxes',但仍然没有达到效果。
    【解决方案2】:

    有些东西比 Christoph 的回答更自动化。您可以使用调色板:

    set palette rgb 7,5,15
    unset colorbox
    plot 'immigration.dat' using 2:xtic(1) title columnheader(2), \
         for [i=3:22] '' using i lt palette frac i/22. title columnheader(i)
    

    诀窍是,根据循环计数器i 定义frac。确保除以 float(在本例中为 22. 以匹配示例)以获得调色板的正确分数。
    或者,例如4:

    plot 'immigration.dat' using (100.*$2/$24):xtic(1) t column(2), \       
         for [i=3:23] '' using (100.*column(i)/column(24)) lt palette frac i/23.\
         title column(i)  
    

    现在,您只需决定合适的调色板。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 2012-06-04
      相关资源
      最近更新 更多