如何用Gnuplot实现类似Seaborn Hue的列分组聚类条形图?
Gnuplot实现Seaborn风格的聚类分组条形图(支持未知数量类别)
要实现类似Seaborn中hue参数的分组聚类条形图,核心是动态识别数据中的所有DS_TYPE类别,并自动分配条形位置与颜色。以下是完整解决方案:
核心思路
- 用Gnuplot的
stats命令提取所有唯一的DS_TYPE值,自动获取类别数量N - 计算每个分组条形的宽度与偏移量,确保同一
arg1下的条形聚类排列 - 循环绘制每个类别的条形,自动生成区分颜色
完整代码示例
假设你的CSV数据文件为data.csv(带表头),格式如下:
DS_TYPE,arg1,arg4
TypeA,1,5.2
TypeB,1,4.8
TypeA,2,6.1
TypeB,2,5.5
TypeC,2,5.8
TypeA,3,7.0
TypeB,3,6.3
TypeC,3,6.7
# 1. 提取唯一的DS_TYPE类别 stats 'data.csv' using (strcol(1)) skip 1 nooutput unique_types = word(STATS_strings, 1) do for [i=2:STATS_num_strings] { unique_types = unique_types . ',' . word(STATS_strings, i) } N = words(unique_types) bar_width = 0.8 / N # 每个条形的宽度,总宽度占0.8个x轴单位 # 2. 设置图表样式 set style data histogram set style histogram clustered gap 1 set style fill solid border -1 set boxwidth bar_width set xtics rotate by -45 right # 旋转x轴标签避免重叠 set xlabel 'arg1' set ylabel 'arg4' set title '按DS_TYPE分组的聚类条形图' # 3. 循环绘制每个类别 plot for [type in unique_types] \ 'data.csv' skip 1 using ($2 - (N/2.0 - (strstrt(unique_types, type)-1)/N)*bar_width):4:xtic(2) \ title type with boxes \ lc rgb hsv(360*(strstrt(unique_types, type)-1)/(N-1), 0.7, 0.8)
关键细节说明
- 动态类别识别:通过
stats命令的STATS_strings和STATS_num_strings变量自动获取所有唯一DS_TYPE,无需手动指定类别数量 - 条形偏移计算:
$2 - (N/2.0 - (strstrt(unique_types, type)-1)/N)*bar_width确保同一arg1下的所有条形居中排列 - 自动配色:利用HSV颜色空间,按类别数量均匀分配色调,保证类别间颜色区分明显
- 多数据点处理:如果同一
arg1+DS_TYPE组合有多个数据点,可先通过stats计算均值再绘制:# 先统计每个分组的arg4均值,输出到临时文件 set table 'temp_grouped.dat' stats 'data.csv' skip 1 using (strcol(1)):2:4 nooutput unset table # 用统计后的均值数据绘制,需调整plot命令的列索引 plot for [type in unique_types] \ 'temp_grouped.dat' using ($2 - (N/2.0 - (strstrt(unique_types, type)-1)/N)*bar_width):5:xtic(2) \ title type with boxes \ lc rgb hsv(360*(strstrt(unique_types, type)-1)/(N-1), 0.7, 0.8)
内容的提问来源于stack exchange,提问作者Rubujubi
相关产品推荐
相关产品推荐

