如何用gnuplot绘制含3个分类变量的散点图并重现Julia图表?
优化Gnuplot散点图实现:Param1映射颜色、Param2映射标记并统一图例
需求说明
基于给定CSV数据绘制散点图,要求:
- 将
Param1的不同值映射为不同颜色 - 将
Param2的不同值映射为不同标记形状 - 生成统一的图例,清晰对应每个(Param1, Param2)组合
原始CSV数据
Sensitivity,Recall,ID,Param1,Param2 0.89,0.551,run1,A1,alpha1 0.93,0.78,run1,A2,alpha2 0.54,0.76,run1,A2,alpha3 0.95,0.99,run2,A1,alpha1 0.354,0.445,run3,A1,alpha1 0.89,0.72,run4,A2,alpha1
原尝试代码
set datafile separator comma set terminal pngcairo set output "test2.png" set multiplot layout 1,2 set xlabel "A1" plot for [i=2:4] 'test2.csv' index "A1" u 1:i title columnhead(i) ps 3 set xlabel "A2" plot for [i=2:4] 'test2.csv' index "A2" u 1:i title columnhead(i) ps 3 unset multiplot
优化方案
无需拆分数据或使用多图,直接在单图中通过条件筛选和样式映射实现,同时保证图例统一。核心是利用Gnuplot的字符串匹配筛选数据,提前定义颜色和标记的映射规则:
set datafile separator comma set terminal pngcairo size 800,600 enhanced font 'Arial,10' set output "scatter_plot.png" # 定义Param1到颜色的映射:A1=红色,A2=蓝色 set palette defined (0 '#ff0000', 1 '#0000ff') # 定义Param2到标记形状的映射:alpha1=圆圈,alpha2=方块,alpha3=三角 markers = [7, 8, 9] param2_vals = ["alpha1", "alpha2", "alpha3"] param1_vals = ["A1", "A2"] # 设置坐标轴和图例样式 set xlabel "Sensitivity" set ylabel "Recall" set key outside right top box # 图例放在外部避免遮挡数据 set style data points # 遍历所有参数组合,绘制对应数据点 plot for [p1 in param1_vals] \ for [p2_idx=1:|param2_vals|] \ 'test2.csv' u 1:2 \ where strcol(4) eq p1 and strcol(5) eq param2_vals[p2_idx] \ lc palette frac (p1 eq "A1" ? 0 : 1) \ pt markers[p2_idx] \ ps 1.5 \ title sprintf("%s - %s", p1, param2_vals[p2_idx])
方案优势
- 无需预处理数据:不用手动拆分CSV或添加新列,直接通过
where语句筛选目标数据 - 样式统一可控:提前定义颜色和标记映射,确保每个参数组合的样式固定且可修改
- 图例清晰一致:自动生成每个(Param1, Param2)组合的标签,避免多图图例不一致问题
- 单图直观对比:所有数据点集中展示,便于对比不同参数组合下的Sensitivity和Recall分布
内容的提问来源于stack exchange,提问作者alex_reader
相关产品推荐
相关产品推荐

