如何在 Julia 中重塑和绘制 DataFrames?

How to reshape and plot DataFrames in Julia?

我正在寻找一种方法来将 DataFrame 从宽变长,然后绘制结果(这应该是一个简单的操作,但我是 Julia 的新手,无论如何都不是专家程序员)。

具体来说,我有一个具有以下结构的数据框:

julia> df = DataFrame(Country = ["Italy","France","Germany"], Date1 = [1,4,6], Date2 = [2,5,9], Date3 = [4,3,12])
3×4 DataFrame
│ Row │ Country │ Date1 │ Date2 │ Date3 │
│     │ String  │ Int64 │ Int64 │ Int64 │
├─────┼─────────┼───────┼───────┼───────┤
│ 1   │ Italy   │ 1     │ 2     │ 4     │
│ 2   │ France  │ 4     │ 5     │ 3     │
│ 3   │ Germany │ 6     │ 9     │ 12    │

我已经成功使用stack()函数对数据进行了如下整形:

julia> df_long = stack(df,2:4)
9×3 DataFrame
│ Row │ variable │ value │ Country │
│     │ Symbol   │ Int64 │ String  │
├─────┼──────────┼───────┼─────────┤
│ 1   │ Date1    │ 1     │ Italy   │
│ 2   │ Date1    │ 4     │ France  │
│ 3   │ Date1    │ 6     │ Germany │
│ 4   │ Date2    │ 2     │ Italy   │
│ 5   │ Date2    │ 5     │ France  │
│ 6   │ Date2    │ 9     │ Germany │
│ 7   │ Date3    │ 4     │ Italy   │
│ 8   │ Date3    │ 3     │ France  │
│ 9   │ Date3    │ 12    │ Germany │

现在我想创建一个图,其中 variable 列在 x 轴上,value 列在 y 轴上。但是,variable 列的类型为 Symbol(而不是我希望的 String),因此我无法绘制它。我用来创建情节的代码是这样的:

julia> Plots.plot(df_long.variable,df_long.value)
ERROR: Cannot convert Symbol to series data for plotting
Stacktrace:
 [1] prepareSeriesData(::Symbol) at /Users/kayvon/.julia/packages/Plots/12uaJ/src/series.jl:14
 [2] convertToAnyVector(::Symbol, ::Dict{Symbol,Any}) at /Users/kayvon/.julia/packages/Plots/12uaJ/src/series.jl:27
 [3] (::Plots.var"#152#155"{Dict{Symbol,Any}})(::Symbol) at ./none:0
 [4] iterate(::Base.Generator{Array{Symbol,1},Plots.var"#152#155"{Dict{Symbol,Any}}}) at ./generator.jl:47
 [5] convertToAnyVector(::Array{Symbol,1}, ::Dict{Symbol,Any}) at /Users/kayvon/.julia/packages/Plots/12uaJ/src/series.jl:42
 [6] macro expansion at /Users/kayvon/.julia/packages/Plots/12uaJ/src/series.jl:130 [inlined]
 [7] apply_recipe(::Dict{Symbol,Any}, ::Type{Plots.SliceIt}, ::Array{Symbol,1}, ::Array{Int64,1}, ::Nothing) at /Users/kayvon/.julia/packages/RecipesBase/G4s6f/src/RecipesBase.jl:279
 [8] _process_userrecipes(::Plots.Plot{Plots.GRBackend}, ::Dict{Symbol,Any}, ::Tuple{Array{Symbol,1},Array{Int64,1}}) at /Users/kayvon/.julia/packages/Plots/12uaJ/src/pipeline.jl:85
 [9] _plot!(::Plots.Plot{Plots.GRBackend}, ::Dict{Symbol,Any}, ::Tuple{Array{Symbol,1},Array{Int64,1}}) at /Users/kayvon/.julia/packages/Plots/12uaJ/src/plot.jl:178
 [10] #plot#138(::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}, ::typeof(plot), ::Array{Symbol,1}, ::Vararg{Any,N} where N) at /Users/kayvon/.julia/packages/Plots/12uaJ/src/plot.jl:57
 [11] plot(::Array{Symbol,1}, ::Array{Int64,1}) at /Users/kayvon/.julia/packages/Plots/12uaJ/src/plot.jl:51
 [12] top-level scope at none:0

有没有一种方法可以使用 stack() 生成类型为 Stringvariable 列?还是我以错误的方式解决这个问题/有更简单的方法?

谢谢,感谢您提供的任何帮助!

plot(String.(df_long.variable),df_long.value)

注意点 .,这是 Julia 的点运算符,它将 Symbol 的整个向量转换为 String 的向量。

然而,对于此数据,您可能更喜欢散点图。

scatter(String.(df_long.variable),df_long.value)