How to use Greek symbols in ggplot2?
Asked Answered
E

4

158

My categories need to be named with Greek letters. I am using ggplot2, and it works beautifully with the data. Unfortunately I cannot figure out how to put those greek symbols on the x axis (at the tick marks) and also make them appear in the legend. Is there any way to do it?

UPDATE: I had a look at the link, however, there is no good method described to accomplish what I want to do.

Emilieemiline answered 14/3, 2011 at 1:2 Comment(3)
See the discussion of the expression function here: https://mcmap.net/q/103868/-getting-latex-into-r-plotsFour
Is there any hint on obtaining the viewports from a ggplot2. If that can be done, I believe that changing x-tic marks will be straight forward.Emilieemiline
You can use latex2exp package: cran.r-project.org/web/packages/latex2exp/vignettes/…Ozoniferous
H
184

Here is a link to an excellent wiki that explains how to put greek symbols in ggplot2. In summary, here is what you do to obtain greek symbols

  1. Text Labels: Use parse = T inside geom_text or annotate.
  2. Axis Labels: Use expression(alpha) to get greek alpha.
  3. Facet Labels: Use labeller = label_parsed inside facet.
  4. Legend Labels: Use bquote(alpha == .(value)) in legend label.

You can see detailed usage of these options in the link

EDIT. The objective of using greek symbols along the tick marks can be achieved as follows

require(ggplot2);
data(tips);
p0 = qplot(sex, data = tips, geom = 'bar');
p1 = p0 + scale_x_discrete(labels = c('Female' = expression(alpha),
                                      'Male'   = expression(beta)));
print(p1);

For complete documentation on the various symbols that are available when doing this and how to use them, see ?plotmath.

Hutt answered 14/3, 2011 at 2:44 Comment(6)
I want those Greek Symbols to mark the tics. I am not sure I follow this answer. I will try this and write back. Thank you for the direction.Emilieemiline
This doesnt work for my purpose at least. Thank you for the pointer though.Emilieemiline
@Sam, check out the example code in my edit. It gives you greek symbols along your x-axis tick marks. Is this what you were looking for?Hutt
I would like to add an asterisk ('*') after a Greek letter. Anyone know how to do this?Valois
I recently learned that another option is to use substitute, this also works in places where expression does not work, and even allows other formatting like italics, bold etc.Emilieemiline
This is now out of date for legend labels. See ?scales::label_parse()Bollinger
D
103

Simplest solution: Use Unicode Characters

No expression or other packages needed.
Not sure if this is a newer feature for ggplot, but it works. It also makes it easy to mix Greek and regular text (like adding '*' to the ticks)

Just use unicode characters within the text string. seems to work well for all options I can think of. Edit: previously it did not work in facet labels. This has apparently been fixed at some point.

library(ggplot2)
ggplot(mtcars, 
       aes(mpg, disp, color=factor(gear))) + 
  geom_point() + 
  labs(title="Title (\u03b1 \u03a9)", # works fine
       x= "\u03b1 \u03a9 x-axis title",    # works fine
       y= "\u03b1 \u03a9 y-axis title",    # works fine
       color="\u03b1 \u03a9 Groups:") +  # works fine
  scale_x_continuous(breaks = seq(10, 35, 5), 
                     labels = paste0(seq(10, 35, 5), "\u03a9*")) + # works fine; to label the ticks
  ggrepel::geom_text_repel(aes(label = paste(rownames(mtcars), "\u03a9*")), size =3) + # works fine 
  facet_grid(~paste0(gear, " Gears \u03a9"))

Created on 2019-08-28 by the reprex package (v0.3.0)

Decontaminate answered 13/9, 2018 at 22:46 Comment(7)
Nice answer. For more on unicode characters, see: #27691229Re
very flexible!!Stevenson
This is the best way because you don't faff about with the object types formed by expression or bquote - you end up with a character object that you can use in any other way you use character objects.Fortuneteller
This is not only the easiest Method, but also the best, since it works in most cases and doesn't rely on other functions.Hindenburg
This generates a lot of warnings, about a hundred lines of: Warning message in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : “conversion failure on '>3σ' in 'mbcsToSbcs': dot substituted for <cf>Laliberte
Sorry @Patafikss, I cannot reproduce any error messages. I would guess it may be a system issue. you may try it wit omitting the ggrepel line which introduces another package.Decontaminate
I solved the issue. I needed to use device = cairo_pdf in the ggsave(). Using Linux here, it's apparently a problem of the default device.Laliberte
S
57

Use expression(delta) where 'delta' for lowercase δ and 'Delta' to get capital Δ.

Here's full list of Greek characters:

Α α alpha
Β β beta
Γ γ gamma
Δ δ delta
Ε ε epsilon
Ζ ζ zeta
Η η eta
Θ θ theta
Ι ι iota
Κ κ kappa
Λ λ lambda
Μ μ mu
Ν ν nu
Ξ ξ xi
Ο ο omicron
Π π pi
Ρ ρ rho
Σ σ sigma
Τ τ tau
Υ υ upsilon
Φ φ phi
Χ χ chi
Ψ ψ psi
Ω ω omega

EDIT: Copied from comments, when using in conjunction with other words use like: expression(Delta*"price")

Sosthena answered 31/3, 2016 at 12:4 Comment(5)
How can I get a label like Δprice? expression(Deltaprice) doesn't work, neither does expression(Delta price)Entebbe
thanks. But how's that exactly? xlab(expression(Delta)price) gives an errorEntebbe
expression(Delta*price)Neiman
Is there a way to get a Greek-form (as opposed to Latin-form) Upsilon? See en.wikipedia.org/wiki/Upsilon Correspondence with Latin Y (I'd like something like the third character in en.wikipedia.org/wiki/Upsilon#/media/…)Impassive
expression(Delta*"price") works. Don't love the syntax.Grouper
S
25

You do not need the latex2exp package to do what you wanted to do. The following code would do the trick.

ggplot(smr, aes(Fuel.Rate, Eng.Speed.Ave., color=Eng.Speed.Max.)) + 
  geom_point() + 
  labs(title=expression("Fuel Efficiency"~(alpha*Omega)), 
color=expression(alpha*Omega), x=expression(Delta~price))

enter image description here

Also, some comments (unanswered as of this point) asked about putting an asterisk (*) after a Greek letter. expression(alpha~"*") works, so I suggest giving it a try.

More comments asked about getting Δ Price and I find the most straightforward way to achieve that is expression(Delta~price)). If you need to add something before the Greek letter, you can also do this: expression(Indicative~Delta~price) which gets you:

enter image description here

Selwin answered 4/1, 2018 at 12:53 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.