You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:25:27