如何用gnuplot绘制商品数量-售价数据的统计直方图?
解决CSV数据按价格区间累加商品数量的直方图绘制问题
方案一:直接用Gnuplot处理(无需预处理)
Gnuplot本身支持基于权重的分组求和,不需要提前修改CSV文件。核心是用bin函数划分价格区间,再将商品数量作为权重,通过smooth freq实现累加统计。
示例代码:
# 输出设置 set terminal pngcairo enhanced font 'Arial,10' set output 'price_quantity_hist.png' # 直方图样式配置 set style data histogram set style fill solid 0.75 border -1 set xtics rotate by 45 right set ylabel '总商品数量' set xlabel '价格区间(美元)' # 定义价格区间宽度(这里设为0.5美元,可按需调整) bin_width = 0.5 # 计算售价对应的区间左边界 bin(x) = bin_width * floor(x / bin_width) # 绘制直方图:按价格区间分组,累加对应商品数量 plot 'your_data.csv' using (bin($2)):($1) smooth freq with boxes title '各价格区间商品总量'
关键说明:
bin($2):将第二列的售价映射到对应的区间左边界(比如4.2美元会被分到4-4.5区间)($1):指定第一列的商品数量作为统计权重smooth freq:自动对同一区间内的所有权重值求和,替代默认的频次统计
如果CSV包含表头,只需在plot命令中添加skip 1跳过第一行:
plot 'your_data.csv' skip 1 using (bin($2)):($1) smooth freq with boxes title '各价格区间商品总量'
方案二:预处理CSV文件(适合复杂统计场景)
如果需要更灵活的分组逻辑(比如自定义区间边界),可以先用awk预处理CSV,提前完成价格去重、数量累加和区间分组,再用Gnuplot绘图。
预处理命令(bash环境):
# 1. 累加相同售价的商品数量;2. 划分价格区间;3. 按区间排序 awk -F ',' 'NR>1 {sum[$2] += $1} END {for(p in sum) print sum[p], p}' your_data.csv \ | awk -v bin=0.5 '{print bin*int($2/bin), $1}' \ | sort -n > processed_data.csv
预处理后绘图的Gnuplot代码:
set terminal pngcairo enhanced font 'Arial,10' set output 'price_quantity_hist.png' set style data histogram set style fill solid 0.75 border -1 set xtics rotate by 45 right set ylabel '总商品数量' set xlabel '价格区间(美元)' plot 'processed_data.csv' using 2:xtic(1) with boxes title '各价格区间商品总量'
关键说明:
- 第一个
awk:跳过表头(NR>1),累加相同售价的商品数量 - 第二个
awk:将售价映射到指定宽度的区间 sort -n:按区间左边界排序,保证直方图的顺序正确
内容的提问来源于stack exchange,提问作者Trewq
相关产品推荐
相关产品推荐

