# How to group/color lines per ID in Makie?

**URL:** <https://discourse.julialang.org/t/how-to-group-color-lines-per-id-in-makie/85622>\
**Category:** Visualization\
**Tags:** makie\
**Created:** [August 11, 2022, 2:22pm UTC](https://discourse.julialang.org/t/how-to-group-color-lines-per-id-in-makie/85622 "2022-08-11T14:22:41Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![aelmokadem](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/aelmokadem/32/37931_2.png) [@aelmokadem](https://discourse.julialang.org/u/aelmokadem)\
**Post date:** [August 11, 2022, 2:22pm UTC](https://discourse.julialang.org/t/how-to-group-color-lines-per-id-in-makie/85622/1 "2022-08-11T14:22:41Z")

</div>

Hi all. I am using CairoMakie.jl to plot a figure for longitudinal theophylline concentration data in 12 subjects simultaneously. The code I am using is

```julia
Theoph = dataset("datasets", "Theoph")
f = Figure()
Axis(f[1,1])
CairoMakie.lines!(Theoph.Time, Theoph.Conc)
CairoMakie.scatter!(Theoph.Time, Theoph.Conc)
f

```

The result looks like this.

 ![Screen Shot 2022-08-11 at 4.16.31 PM](https://global.discourse-cdn.com/julialang/original/3X/7/b/7b6d82051b9d7f43977cfc7c8e931c5d5786e7e1.png)

I need to group or color the lines per subject to avoid connecting all lines together! Any ideas?!

---

<div class="post-metadata">

**Author:** ![Nathan\_Boyer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nathan_boyer/32/14825_2.png) [@Nathan\_Boyer](https://discourse.julialang.org/u/Nathan_Boyer)\
**Post date:** [August 11, 2022, 3:09pm UTC](https://discourse.julialang.org/t/how-to-group-color-lines-per-id-in-makie/85622/2 "2022-08-11T15:09:36Z")

</div>

I can be more specific if you tell me more about the format of `Theoph`, but I would recommend adding the [AlgebraOfGraphics](https://juliaplots.org/AlgebraOfGraphics.jl/dev/generated/penguins/) package to make plotting datasets easier. Something like:

```julia
using AlgebraOfGraphics, CairoMakie
draw(data(Theoph) * mapping(:Time, :Conc, color=:Subject) * visual(ScatterLines))

```

---

<div class="post-metadata">

**Author:** ![jules](https://avatars.discourse-cdn.com/v4/letter/j/41988e/32.png) [@jules](https://discourse.julialang.org/u/jules)\
**Post date:** [August 11, 2022, 8:31pm UTC](https://discourse.julialang.org/t/how-to-group-color-lines-per-id-in-makie/85622/3 "2022-08-11T20:31:41Z")

</div>

Second the advice to use AlgebraOfGraphics. It saves you exactly from the annoyance of writing out the grouping logic for these kinds of plots over and over again.

---

<div class="post-metadata">

**Author:** ![aelmokadem](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/aelmokadem/32/37931_2.png) [@aelmokadem](https://discourse.julialang.org/u/aelmokadem)\
**Post date:** [August 11, 2022, 11:08pm UTC](https://discourse.julialang.org/t/how-to-group-color-lines-per-id-in-makie/85622/4 "2022-08-11T23:08:57Z")

</div>

> [@Nathan\_Boyer](#):
>
> `AlgebraOfGraphics`

Thanks a lot for the suggestion. I will try it out. Does this mean that CairoMakie.jl itself does not have a means to handle this?

---

<div class="post-metadata">

**Author:** ![aelmokadem](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/aelmokadem/32/37931_2.png) [@aelmokadem](https://discourse.julialang.org/u/aelmokadem)\
**Post date:** [August 11, 2022, 11:13pm UTC](https://discourse.julialang.org/t/how-to-group-color-lines-per-id-in-makie/85622/5 "2022-08-11T23:13:52Z")

</div>

worked beutifully 🙂

 ![Screen Shot 2022-08-12 at 1.13.07 AM](https://global.discourse-cdn.com/julialang/original/3X/2/a/2a48427614d4da277656a19d290ff1a99f610847.png)

---

<div class="post-metadata">

**Author:** ![jules](https://avatars.discourse-cdn.com/v4/letter/j/41988e/32.png) [@jules](https://discourse.julialang.org/u/jules)\
**Post date:** [August 12, 2022, 6:08am UTC](https://discourse.julialang.org/t/how-to-group-color-lines-per-id-in-makie/85622/6 "2022-08-12T06:08:42Z")

</div>

Makie is more low level, grouping a dataframe and automatically creating a legend is currently outside of its scope. But you can create more flexible solutions than with a framework like AlgebraOfGraphics. And you can simply combine both, AlgebraOfGraphics creates normal Makie plots that you can modify further.

---

<div class="post-metadata">

**Author:** ![mkborregaard](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mkborregaard/32/556_2.png) [@mkborregaard](https://discourse.julialang.org/u/mkborregaard)\
**Post date:** [August 12, 2022, 9:34am UTC](https://discourse.julialang.org/t/how-to-group-color-lines-per-id-in-makie/85622/7 "2022-08-12T09:34:21Z")

</div>

Looks like it would be nice for AOG to have sorting on categorical axis labels

---

<div class="post-metadata">

**Author:** ![aelmokadem](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/aelmokadem/32/37931_2.png) [@aelmokadem](https://discourse.julialang.org/u/aelmokadem)\
**Post date:** [August 12, 2022, 12:13pm UTC](https://discourse.julialang.org/t/how-to-group-color-lines-per-id-in-makie/85622/8 "2022-08-12T12:13:24Z")

</div>

Yeah the dataset Subject column levels were messed up. When I reassign levels I get the correct order.

 ![Screen Shot 2022-08-12 at 2.11.18 PM](https://global.discourse-cdn.com/julialang/original/3X/2/b/2b5df32c4f25801f6c316da2ed4dd29d11dc8f82.png)

---

<div class="post-metadata">

**Author:** ![icweaver](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/icweaver/32/45764_2.png) [@icweaver](https://discourse.julialang.org/u/icweaver)\
**Post date:** [August 12, 2022, 6:06pm UTC](https://discourse.julialang.org/t/how-to-group-color-lines-per-id-in-makie/85622/9 "2022-08-12T18:06:31Z")

</div>

Yea, for the sorting bit I think there is [`sorter`](http://juliaplots.org/AlgebraOfGraphics.jl/dev/API/functions/#AlgebraOfGraphics.sorter):

```julia
labels = df.Subject|> unique
mapping(:Time, :Conc; color=:Subject => sorter(labels))

```

so you can specify whatever order you want
