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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:12:35