使用Algebra of Graphics绘制多个无关数据集
用Algebra of Graphics绘制多数据集折线图(自定义线型、标签与图例)
需求说明
- 在单张图表中绘制多个独立数据集
- 部分线条设为虚线,其余设为点线
- 颜色随机分配
- 每个数据集支持自定义标签
- 生成美观的统一图例
问题分析
你之前通过逐个添加图层的方式实现,这种方式不仅不符合Algebra of Graphics「数据映射优先」的设计理念,还会导致图例难以统一管理。正确的做法是先将所有数据集合并为一个带分组标签的DataFrame,再通过映射规则关联标签与视觉属性(颜色、线型)。
修正后的代码
using AlgebraOfGraphics, DataFrames, ColorSchemes, CairoMakie function filterPlot(filterPos; xlab = "", ylab="Blocking Intensity", labels=nothing, linestyles=nothing) # 处理输入:如果没有自定义标签,自动生成默认标签 if labels === nothing labels = ["Dataset $i" for i in 1:length(filterPos)] end # 处理线型:如果没有指定,默认前半部分虚线,后半部分点线 if linestyles === nothing n = length(filterPos) linestyles = vcat(fill(:dash, div(n,2)), fill(:dot, n - div(n,2))) end # 将所有数据集合并为一个带标签的DataFrame df_list = [] for (idx, vals) in enumerate(filterPos) push!(df_list, DataFrame( label = labels[idx], xx = 1:length(vals), yy = vals, linestyle = linestyles[idx] )) end combined_df = vcat(df_list...) # 构建绘图规范:映射标签到颜色,映射线型字段到线条样式 plt = data(combined_df) * mapping( :xx => (t->t) => xlab, :yy => (t->t) => ylab, color = :label, linestyle = :linestyle ) * visual(Lines, linewidth=2) # 自定义颜色方案(随机取色) color_palette = ColorSchemes.twelvebitrainbow[randperm(length(labels))] plt = plt * scale_color_discrete(palette=color_palette) # 绘制图表,自动生成统一图例 drawing = draw(plt; axis=(xlabel=xlab, ylabel=ylab)) return drawing end # 示例调用 test_data = [rand(10) for _ in 1:5] filterPlot(test_data, labels=["A", "B", "C", "D", "E"], linestyles=[:dash, :dash, :dot, :dot, :dash])
代码说明
- 数据合并:将每个数据集打包成带
label(自定义标签)、linestyle(指定线型)的DataFrame,再合并为一个整体,这是Algebra of Graphics的核心用法 - 视觉映射:通过
mapping将label关联到颜色,linestyle关联到线条样式,自动生成包含颜色和线型的统一图例 - 自定义配置:支持传入自定义标签和线型,若未传入则自动生成默认规则(前半虚线、后半点线)
- 颜色随机化:通过打乱配色方案的索引实现随机取色,保证颜色多样性
内容的提问来源于stack exchange,提问作者Mstislav Keldysh
相关产品推荐
相关产品推荐

