# Question about plotting panel data?

**URL:** <https://discourse.julialang.org/t/question-about-plotting-panel-data/82250>\
**Category:** General Usage\
**Created:** [June 4, 2022, 9:26pm UTC](https://discourse.julialang.org/t/question-about-plotting-panel-data/82250 "2022-06-04T21:26:51Z")\
**Posts on this page:** 17\
**Page:** 1

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [June 4, 2022, 9:26pm UTC](https://discourse.julialang.org/t/question-about-plotting-panel-data/82250/1 "2022-06-04T21:26:52Z")

</div>

Dear all,

In Stata, we can easily use `xtline` to plot the graph of panel data.

```julia
webuse grunfeld,clear
xtline invest

```

 ![截屏2022-06-05 05.24.12](https://global.discourse-cdn.com/julialang/original/3X/a/1/a18852b77aad29b76a5607de5f51663502c57515.jpeg)

In Julia, How can I plot this graph?

```julia
julia> using RDatasets

julia> using DataFrames

julia> df = dataset("plm", "Grunfeld");

```

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [June 4, 2022, 11:33pm UTC](https://discourse.julialang.org/t/question-about-plotting-panel-data/82250/2 "2022-06-04T23:33:01Z")

</div>

```julia
julia> using DataFrames

julia> using DataFramesMeta

julia> using RDatasets

julia> df = dataset("plm", "Grunfeld");

julia> gd = groupby(df, :Firm);

julia> p = plot(layout = 10)

julia> for i in 1:gd.ngroups
           data = @where(df, :Firm .== i)
           @df data plot!(p[i], :Year, :Inv)
       end

julia> display(p)

```

 ![截屏2022-06-05 07.30.39](https://global.discourse-cdn.com/julialang/original/3X/3/9/390a585edf21caccc84dfde71602c6fe72e245ac.jpeg)

This is maybe not the best way to plot this graph.

---

<div class="post-metadata">

**Author:** ![zxzkja](https://avatars.discourse-cdn.com/v4/letter/z/71c47a/32.png) [@zxzkja](https://discourse.julialang.org/u/zxzkja)\
**Post date:** [June 5, 2022, 4:34am UTC](https://discourse.julialang.org/t/question-about-plotting-panel-data/82250/3 "2022-06-05T04:34:31Z")

</div>

AlgebraOfGraphics is pretty good for this.

```julia
using RDatasets
using DataFrames
using AlgebraOfGraphics, CairoMakie
df = dataset("plm", "Grunfeld");

plt = data(df) * mapping(:Year, :Inv, layout=:Firm => nonnumeric) * visual(Lines)
draw(plt)

```

 ![plot_1](https://global.discourse-cdn.com/julialang/original/3X/1/f/1ff9a0ff6ac1452654ed9c604c18c19b5b9bb967.png)

`:Firm => nonnumeric` is required because the Firm column is an integer; otherwise, it would just be `:Firm`.

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [June 5, 2022, 3:06pm UTC](https://discourse.julialang.org/t/question-about-plotting-panel-data/82250/4 "2022-06-05T15:06:23Z")

</div>

Thanks so much. It is a better way to visualize panel data.

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [June 5, 2022, 5:56pm UTC](https://discourse.julialang.org/t/question-about-plotting-panel-data/82250/5 "2022-06-05T17:56:21Z")

</div>

It seems not work.

```julia
julia> using RDatasets

julia> using DataFrames

julia> using AlgebraOfGraphics, CairoMakie
[Info: Precompiling AlgebraOfGraphics [cbdf2221-f076-402e-a563-3d30da359d67]

julia> df = dataset("plm", "Grunfeld");

julia> plt = data(df) * mapping(:Year, :Inv, layout=:Firm => nonnumeric) * visual(Lines)
ERROR: UndefVarError: nonnumeric not defined
Stacktrace:
 [1] top-level scope
   @ REPL[26]:1

```

---

<div class="post-metadata">

**Author:** ![zxzkja](https://avatars.discourse-cdn.com/v4/letter/z/71c47a/32.png) [@zxzkja](https://discourse.julialang.org/u/zxzkja)\
**Post date:** [June 5, 2022, 6:15pm UTC](https://discourse.julialang.org/t/question-about-plotting-panel-data/82250/6 "2022-06-05T18:15:01Z")

</div>

Hmm, you may have an out-of-date version of AlgebraOfGraphics and/or Julia. It looks like `nonnumeric` was introduced in v0.4 of AlgebraOfGraphics.  
You can check the package version like

```julia
julia> import Pkg; Pkg.status()
      Status `C:\Users\evan\.julia\environments\v1.7\Project.toml`
  [cbdf2221] AlgebraOfGraphics v0.6.7
  [6e4b80f9] BenchmarkTools v1.3.1   
  [13f3f980] CairoMakie v0.8.3       
  [324d7699] CategoricalArrays v0.10.6
  [861a8166] Combinatorics v1.0.2
  [a93c6f00] DataFrames v1.3.4
  [864edb3b] DataStructures v0.18.13
  [abce61dc] Decimals v0.4.1
  [f6369f11] ForwardDiff v0.10.30
  [6fe1bfb0] OffsetArrays v1.12.1
  [27ebfcd6] Primes v0.5.2
  [ce6b1742] RDatasets v0.7.7
  [a759f4b9] TimerOutputs v0.5.19

```

You could try updating with `julia> import Pkg; Pkg.update()` but this updates all packages, which may break other things.

`nonnumeric` used to be called `categorical` according to the [release notes](https://github.com/JuliaPlots/AlgebraOfGraphics.jl/blob/bc1e7849819466e06ff4d98e3d248ac7c405c3f7/NEWS.md), so you could also try

```julia
plt = data(df) * mapping(:Year, :Inv, layout=:Firm => categorical) * visual(Lines)

```

If that still doesn’t work, you can manually convert the Firm column to a categorical array.

```julia
using CategoricalArrays
df[!,:Firm] = categorical(df[:,:Firm]);
plt = data(df) * mapping(:Year, :Inv, layout=:Firm) * visual(Lines);
draw(plt)

```

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [June 5, 2022, 6:18pm UTC](https://discourse.julialang.org/t/question-about-plotting-panel-data/82250/7 "2022-06-05T18:18:27Z")

</div>

```julia
(zhangdeliang) pkg> st
      Status `~/Project.toml`
  [cbdf2221] AlgebraOfGraphics v0.6.7
  [13f3f980] CairoMakie v0.8.3
  [e9467ef8] GLMakie v0.6.3
  [7073ff75] IJulia v1.23.3
  [49802e3a] ProgressBars v1.4.1
  [ce6b1742] RDatasets v0.7.7
  [3cdcf5f2] RecipesBase v1.2.1
  [d1185830] SymbolicUtils v0.19.7
  [fce5fe82] Turing v0.21.3

```

---

<div class="post-metadata">

**Author:** ![zxzkja](https://avatars.discourse-cdn.com/v4/letter/z/71c47a/32.png) [@zxzkja](https://discourse.julialang.org/u/zxzkja)\
**Post date:** [June 5, 2022, 6:24pm UTC](https://discourse.julialang.org/t/question-about-plotting-panel-data/82250/8 "2022-06-05T18:24:14Z")

</div>

Hmm, does this raise the same error?

```julia
julia> AlgebraOfGraphics.nonnumeric(3)
AlgebraOfGraphics.NonNumeric{Int64}(3)

```

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [June 5, 2022, 6:27pm UTC](https://discourse.julialang.org/t/question-about-plotting-panel-data/82250/9 "2022-06-05T18:27:17Z")

</div>

> [@zxzkja](#):
>
> ```julia
> using RDatasets
> using DataFrames
> using AlgebraOfGraphics, CairoMakie
> df = dataset("plm", "Grunfeld");
> 
> plt = data(df) * mapping(:Year, :Inv, layout=:Firm => nonnumeric) * visual(Lines)
> draw(plt)
> 
> ```

```julia
julia> using RDatasets

julia> using DataFrames

julia> using AlgebraOfGraphics, CairoMakie

julia> df = dataset("plm", "Grunfeld");

julia> plt = data(df) * mapping(:Year, :Inv, layout=:Firm => nonnumeric) * visual(Lines)
Layer(AlgebraOfGraphics.Visual(Lines, {}), 200×5 DataFrameColumns
 Row │ Firm Year Inv Value Capital 
     │ Int64 Int64 Float64 Float64 Float64 
─────┼─────────────────────────────────────────
   1 │ 1 1935 317.6 3078.5 2.8
   2 │ 1 1936 391.8 4661.7 52.6
   3 │ 1 1937 410.6 5387.1 156.9
   4 │ 1 1938 257.7 2792.2 209.2
   5 │ 1 1939 330.8 4313.2 203.4
   6 │ 1 1940 461.2 4643.9 207.2
   7 │ 1 1941 512.0 4551.2 255.2
   8 │ 1 1942 448.0 3244.1 303.7
  ⋮ │ ⋮ ⋮ ⋮ ⋮ ⋮
 194 │ 10 1948 5.66 68.0 5.38
 195 │ 10 1949 4.21 71.24 7.39
 196 │ 10 1950 3.42 69.05 8.74
 197 │ 10 1951 4.67 83.04 9.07
 198 │ 10 1952 6.0 74.42 9.93
 199 │ 10 1953 6.53 63.51 11.68
 200 │ 10 1954 5.12 58.12 14.33
                               185 rows omitted, Any[:Year, :Inv], {:layout = :Firm => AlgebraOfGraphics.nonnumeric})

julia> draw(plt)
Scene (800px, 600px):
  0 Plots
  22 Child Scenes:
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    └ Scene (800px, 600px)

```

---

<div class="post-metadata">

**Author:** ![zxzkja](https://avatars.discourse-cdn.com/v4/letter/z/71c47a/32.png) [@zxzkja](https://discourse.julialang.org/u/zxzkja)\
**Post date:** [June 5, 2022, 6:36pm UTC](https://discourse.julialang.org/t/question-about-plotting-panel-data/82250/10 "2022-06-05T18:36:18Z")

</div>

So there’s no more error, but it’s not drawing the plot now?  
Sorry I am not very adept at the plotting ecosystem… maybe someone with more experience could chime in.

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [June 5, 2022, 6:59pm UTC](https://discourse.julialang.org/t/question-about-plotting-panel-data/82250/11 "2022-06-05T18:59:07Z")

</div>

Yes, there is no error now. But no graph.  
Thanks.

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [June 5, 2022, 7:12pm UTC](https://discourse.julialang.org/t/question-about-plotting-panel-data/82250/13 "2022-06-05T19:12:15Z")

</div>

> [@Raymond](#):
>
> ```julia
> julia> draw(plt)
> Scene (800px, 600px):
> 0 Plots
> 22 Child Scenes:
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> ├ Scene (800px, 600px)
> └ Scene (800px, 600px)
> 
> ```

```julia
julia> draw(plt)
Scene (800px, 600px):
  0 Plots
  22 Child Scenes:
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    ├ Scene (800px, 600px)
    └ Scene (800px, 600px)

```

---

<div class="post-metadata">

**Author:** ![Jakob](https://avatars.discourse-cdn.com/v4/letter/j/71c47a/32.png) [@Jakob](https://discourse.julialang.org/u/Jakob)\
**Post date:** [June 5, 2022, 7:15pm UTC](https://discourse.julialang.org/t/question-about-plotting-panel-data/82250/14 "2022-06-05T19:15:08Z")

</div>

Sorry, I missed the draw call. Are you executing this directly from the REPL? It should show in Pluto or VSCode. Otherwise you might want to have a look at [ElectronDisplay.jl](https://github.com/queryverse/ElectronDisplay.jl) for plotting directly from the REPL.

---

<div class="post-metadata">

**Author:** ![Raymond](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raymond/32/36557_2.png) [@Raymond](https://discourse.julialang.org/u/Raymond)\
**Post date:** [June 5, 2022, 7:16pm UTC](https://discourse.julialang.org/t/question-about-plotting-panel-data/82250/15 "2022-06-05T19:16:28Z")

</div>

Yes, I run it from REPL. I will try ElectronDisplay.jl. Thanks.

---

<div class="post-metadata">

**Author:** ![Jakob](https://avatars.discourse-cdn.com/v4/letter/j/71c47a/32.png) [@Jakob](https://discourse.julialang.org/u/Jakob)\
**Post date:** [June 5, 2022, 7:19pm UTC](https://discourse.julialang.org/t/question-about-plotting-panel-data/82250/16 "2022-06-05T19:19:52Z")

</div>

You can also just do `fig = draw(plt)` and then `save(“myplot.svg”, fig)` to save the figure to disk.

---

<div class="post-metadata">

**Author:** ![asinghvi17](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/asinghvi17/32/8272_2.png) [@asinghvi17](https://discourse.julialang.org/u/asinghvi17)\
**Post date:** [June 6, 2022, 5:58am UTC](https://discourse.julialang.org/t/question-about-plotting-panel-data/82250/17 "2022-06-06T05:58:21Z")

</div>

Yeah, you’ll have to have some sort of display open. You can also use GLMakie for a desktop plot or WGLMakie for in-browser plots.

If you need to use CairoMakie, you can always save the plot and inspect it using an image viewer, i.e., `save("filename.pdf", fig)`.

---

<div class="post-metadata">

**Author:** ![rgouveiamendes](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rgouveiamendes/32/218636_2.png) [@rgouveiamendes](https://discourse.julialang.org/u/rgouveiamendes)\
**Post date:** [June 6, 2022, 12:27pm UTC](https://discourse.julialang.org/t/question-about-plotting-panel-data/82250/18 "2022-06-06T12:27:24Z")

</div>

I raised a similar question [here](https://discourse.julialang.org/t/is-it-optimal-this-way-of-doing-a-panel-of-plots-with-plotlyjs-jl/82051) thought it was somehow ignored. 😅  
It refers to PlotlyJS. I managed to produce a good output, but not without pain.  
I now simplified a bit the code with a `for` loop to produce each graphic in the panel.
