使用gnuplot绘制堆叠直方图,低于均值部分无法标红求助
问题:gnuplot堆叠直方图红色填充不生效的解决方法
我想用gnuplot绘制直方图,实现将每天学习时间中低于平均值的部分标为红色,高于的部分保持默认灰色。但生成的图表全部为灰色,代码如下:
set term postscript eps set output "result.eps" set style data histogram set style histogram rowstacked set style fill solid 0.5 set boxwidth 1 relative set xrange [0:31] set xtics 1 set yrange [0:15] set ytics 1 set title 'Studying time in May' datafile = '../data/hour_formatting/May_formatted.txt' data_under = '../data/under_ave/May_under.txt' plot datafile using 2:xtic(1) with boxes title 'Studying time', data_under using 2:xtic(1) with boxes notitle fillcolor 'red''
问题原因分析
- 堆叠顺序错误:使用
rowstacked模式时,先绘制的完整学习时间柱子会完全覆盖后续绘制的红色柱子,导致红色部分无法显示。 - 数据逻辑不匹配:
rowstacked要求两个系列数值叠加为总高度,但当前完整时间+低于平均值时间的组合会让柱子高度异常,不符合需求。 - 语法错误:plot命令末尾多了一个多余的单引号,属于语法问题。
解决方法
正确的思路是将柱子拆分为「低于平均值的红色部分」和「高于平均值的灰色部分」,调整绘制顺序让红色部分在底层,灰色部分叠在上方:
修改后的代码(直接引用双文件)
set term postscript eps set output "result.eps" set style data histogram set style histogram rowstacked set style fill solid 0.5 set boxwidth 1 relative set xrange [0:31] set xtics 1 set yrange [0:15] set ytics 1 set title 'Studying time in May' datafile = '../data/hour_formatting/May_formatted.txt' data_under = '../data/under_ave/May_under.txt' # 先绘制低于平均值的红色部分,再绘制高于的灰色部分 plot data_under using 2:xtic(1) with boxes notitle fillcolor 'red', \ datafile using ($2 - column(data_under,2)):xtic(1) with boxes title 'Studying time'
说明
column(data_under,2):读取data_under的第2列数值,与datafile的第2列计算差值,得到高于平均值的学习时间。- 绘制顺序优先红色部分,确保红色底层可见,灰色部分仅覆盖高于平均值的区域,符合需求。
- 修正了末尾多余的单引号语法错误。
兼容旧版本gnuplot的方案
如果你的gnuplot版本不支持跨文件引用列,可以先将两个文件合并为一个(每行包含日期、完整时间、低于平均值时间,示例命名为May_combined.txt),再绘制:
set term postscript eps set output "result.eps" set style data histogram set style histogram rowstacked set style fill solid 0.5 set boxwidth 1 relative set xrange [0:31] set xtics 1 set yrange [0:15] set ytics 1 set title 'Studying time in May' data_combined = '../data/May_combined.txt' plot data_combined using 3:xtic(1) with boxes notitle fillcolor 'red', \ data_combined using ($2 - $3):xtic(1) with boxes title 'Studying time'
内容的提问来源于stack exchange,提问作者김정석
相关产品推荐
相关产品推荐

