使用 Julia StatsPlots 绘制数据帧

sac*_*666 5 plot dataframe julia

这有效:

StatsPlots.@df SYN_MM_BM_df plot(
    :t, 
    [:SYN_MM_BM_5, :SYN_MM_BM_10, :SYN_MM_BM_15, :SYN_MM_BM_30]
)
Run Code Online (Sandbox Code Playgroud)

但这不会:

StatsPlots.@df SYN_MM_BM_df plot(
    :t,
    [Symbol(name) for name in names(SYN_MM_BM_df[2:5])]
)
Error: Cannot convert Symbol to series data for plotting
Run Code Online (Sandbox Code Playgroud)

虽然:

[Symbol(name) for name in names(SYN_MM_BM_df)[2:5]] ==
    [:SYN_MM_BM_5, :SYN_MM_BM_10, :SYN_MM_BM_15, :SYN_MM_BM_30
Run Code Online (Sandbox Code Playgroud)

是真的。

谁能解释为什么?我真的不想单独输入所有符号......

Nil*_*dat 4

原因是它@df是一个宏,而不是一个函数,这意味着它会在任何代码实际运行之前将您编写的代码转换为不同的代码。也就是说,它在表达式[Symbol(name) for name in names(df)[2:5]]实际被求值之前对其进行操作(从而变成[:SYN_MM_BM_5 ...].

\n

为了说明差异,您可以使用(此处与from@macroexpand结合使用,以使输出更具可读性:prettifyMacroTools

\n
julia> using DataFrames, StatsPlots, MacroTools\n\njulia> df = DataFrame(a = 1:10, b = 10 .* rand(10), c = 10 .* rand(10));\n\n# Calling macro with symbols written out\njulia> prettify(@macroexpand(@df df plot(:a, [:b, :c], colour = [:red :blue])))\n:(((crane->begin\n          ((rat, zebra, coyote, butterfly, starling), curlew) = (StatsPlots).extract_columns_and_names(crane, :a, :b, :c, :red, :blue)\n          (StatsPlots).add_label(["a", "[b, c]"], plot, rat, [zebra, coyote], colour = [butterfly starling])\n      end))(df))\n\n# Calling macro with comprehension\njulia> prettify(@macroexpand(@df df plot(:a, [x for x \xe2\x88\x88 names(df)[2:3]], colour = [:red :blue])))\n:(((crane->begin\n          ((rat, zebra, coyote), butterfly) = (StatsPlots).extract_columns_and_names(crane, :a, :red, :blue)\n          (StatsPlots).add_label(["a", "[x for x = (names(df))[23]]"], plot, rat, [x for x = (names(df))[2:3]], colour = [zebra coyote])\n      end))(df))\n
Run Code Online (Sandbox Code Playgroud)\n

正如您所看到的,宏不会接受推导式,因此您最终会调用StatsPlots.extract_columns_and_names(df, :a, :red, :blue)而不是StatsPlots.extract_columns_and_names(df, :a, :b, :c, :red, :blue).

\n

我看到 Bogumil 在我打字时已经提供了解决方案,看起来我的StatsPlots预编译速度太慢了:)

\n