# What's the difference between Makie, GLMakie, and CairoMakie?

**URL:** <https://discourse.julialang.org/t/whats-the-difference-between-makie-glmakie-and-cairomakie/79905>\
**Category:** New to Julia\
**Created:** [April 23, 2022, 4:59pm UTC](https://discourse.julialang.org/t/whats-the-difference-between-makie-glmakie-and-cairomakie/79905 "2022-04-23T16:59:48Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![chadagreene](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chadagreene/32/34924_2.png) [@chadagreene](https://discourse.julialang.org/u/chadagreene)\
**Post date:** [April 23, 2022, 4:59pm UTC](https://discourse.julialang.org/t/whats-the-difference-between-makie-glmakie-and-cairomakie/79905/1 "2022-04-23T16:59:48Z")

</div>

I’m a Julia novice, and I’m confused by how and when to access Makie functions.

**First point of confusion:** There’s a package called [Makie.jl](https://github.com/JuliaPlots/Makie.jl), so my beginner’s assumption would be that I should initialize the package with the command

```julia
using Makie

```

However, the README on GitHub says to start using the package, we should begin with the command

```julia
using GLMakie

```

Question: _Is there some logic to help me understand when a package is called by a different name than its repo?_

**Second point of confusion:** The Makie GitHub README says to start with `using GLMakie`, and it includes an example containing the `heatmap` function. However, the [documentation for the `heatmap` function](https://makie.juliaplots.org/stable/examples/plotting_functions/heatmap/index.html) begins with

```julia
using CairoMakie

```

Question: _What is_ `CairoMakie`, _when do I call it, and what supersedes what?_

---

<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:** [April 23, 2022, 5:30pm UTC](https://discourse.julialang.org/t/whats-the-difference-between-makie-glmakie-and-cairomakie/79905/2 "2022-04-23T17:30:53Z")

</div>

> Question: _Is there some logic to help me understand when a package is called by a different name than its repo?_

My understanding is that the different backends used to be separate repos. For convenience, they were all moved into the monorepo: Makie.jl

> Question: _What is_ `CairoMakie` , _when do I call it, and what supersedes what?_

I don’t think there is any superseding going on here, just [different backends for different use cases](https://makie.juliaplots.org/stable/documentation/backends/index.html). Since GLMakie pops out its own window, it wasn’t used for the doc examples you were seeing in the browser

---

<div class="post-metadata">

**Author:** ![yashi](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yashi/32/19448_2.png) [@yashi](https://discourse.julialang.org/u/yashi)\
**Post date:** [April 23, 2022, 5:33pm UTC](https://discourse.julialang.org/t/whats-the-difference-between-makie-glmakie-and-cairomakie/79905/3 "2022-04-23T17:33:08Z")

</div>

As I understand it, CairoMakie, GLMakie, RPRMakie, and WGLMakie are modules specific to a backend.

- CairoMakie – [Cario Graphics](https://www.cairographics.org/)
- GLMakie – OpenGL
- RPRMakie – AMDs [RadeonProRender](https://radeon-pro.github.io/RadeonProRenderDocs/en/index.html)
- WGLMakie – [WebGL](https://www.khronos.org/webgl/)

So, if you want to use OpenGL, you `using GLMakie`. If you want to render 2D by Cairo Graphics, `using CairoMakie`.

It seems like these backends lived in different repos but merged around 2021. [https://github.com/JuliaPlots/Makie.jl/pull/1020](https://github.com/JuliaPlots/Makie.jl/pull/1020)

Hope this answers your questions.

---

<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:** [April 24, 2022, 5:56am UTC](https://discourse.julialang.org/t/whats-the-difference-between-makie-glmakie-and-cairomakie/79905/4 "2022-04-24T05:56:10Z")

</div>

Makie.jl is both the name of the monorepo and of the package at the top level. The three backend packages are in subfolders in the Makie.jl repo but they don’t belong to the Makie.jl package. They depend on Makie.jl the package though, which defines all the infrastructure (together with MakieCore.jl, which is also in the monorepo).

---

<div class="post-metadata">

**Author:** ![kevbonham](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kevbonham/32/216165_2.png) [@kevbonham](https://discourse.julialang.org/u/kevbonham)\
**Post date:** [April 24, 2022, 12:26pm UTC](https://discourse.julialang.org/t/whats-the-difference-between-makie-glmakie-and-cairomakie/79905/5 "2022-04-24T12:26:50Z")

</div>

> [@chadagreene](#):
>
> I’m a Julia novice, and I’m confused by how and when to access Makie functions.

I just want to mention that this package organization **is** quite unusual in `julia`; you’re not just being dense, and it’s not just because you’re a beginner. It’s confusing.

I would recommend that if you’re busy doing 2D plots, or you need vector output (SVG or PDF), you should just be doing `using CairoMakie`. If you want 3D or interactive plots, `using GLMakie`. That’s it, everything else should work the same way (with the exception of some things like remote execution, which probably aren’t immediately relevant to you)

---

<div class="post-metadata">

**Author:** ![chadagreene](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chadagreene/32/34924_2.png) [@chadagreene](https://discourse.julialang.org/u/chadagreene)\
**Post date:** [April 24, 2022, 3:58pm UTC](https://discourse.julialang.org/t/whats-the-difference-between-makie-glmakie-and-cairomakie/79905/6 "2022-04-24T15:58:09Z")

</div>

Thanks to all who weighed in on this. I understand the evolution of the Makie package a bit better now, and I see how and why it has developed into this slightly confusing structure. But it’s certainly workable, especially with @kevbonham’s clear if-then guidance.

---

<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:** [April 24, 2022, 4:09pm UTC](https://discourse.julialang.org/t/whats-the-difference-between-makie-glmakie-and-cairomakie/79905/7 "2022-04-24T16:09:31Z")

</div>

The monorepo structure should really be of no concern for end users, it is just for easier development because each Makie PR usually needs changes in CairoMakie etc to go along.
