带有希腊字母、符号和换行的 ggplot 图例标签

53

我正在尝试

  1. 实现自动或强制换行
  2. 将文本两端对齐(左对齐或左右对齐)
  3. 在 gglot 图例标签中包含希腊字母和百分号

我尝试了几种方法,但好像无法将所有技巧结合起来。

我可以通过在标签中插入 \n 来实现换行,但是这似乎不能在图例标签中使用希腊字母。或者我可以通过组合 mtext()bquote() 在基础图中插入一段文本来实现换行和希腊字母(编辑),但正如 Gregor 在评论中所指出的那样,这在 ggplot 中不起作用。下面我将 listpaste0() 组合起来将文本传递给图例标签:问题是我找不到插入希腊字母(例如 gamma)的方法。

感谢建议。

这是我的一个尝试的 MWE 示例 (编辑:改进后 MWE):

label1.line1 <- "Not much to say about this one"
label2.line1 <- "blabla blabla, blabla blabla, blee blee blee (bling, bling, bling),"
label2.line2 <- paste0("(", "1900-2014: g = 1.50%, gamma = 2.75%, and r = 2.30%",")")
label3.line1 <- "blabla blabla, blabla blabla, blee blee blee (bling, bling, bling),"
label3.line2 <- paste0("(", "1900-2014: g = 2.50%, gamma = 1.75%, and r = 2.30%",")")
labels_fixed <- list(
    label1.line1, 
    paste0(label2.line1, "\n", label2.line2),
    paste0(label3.line1, "\n", label3.line2)
)
library(ggplot2)
library(scales)
library(grid)  # provides unit() function used to tweak spacing inside legend

ggplot(data = mtcars, aes(x = mpg, y = wt, group = factor(cyl), colour = factor(cyl), shape = factor(cyl))) + 
geom_line() + geom_point(size = 3) + theme_bw() + 
scale_shape_manual(name = "Details", values = c(17, 21, 15), 
    labels = labels_fixed) + 
scale_colour_manual(name = "Details", values = c("darkred", "darkgreen", "darkblue"), 
    labels = labels_fixed) + 
theme(legend.key = element_blank(), 
      legend.position = c(.65, .8), 
      legend.background = element_rect(colour = "black"), 
      legend.key.size = unit(2, "lines"), 
      legend.text = element_text(size = 15)) 

一个小问题是,当图例文本变成多行时,图例行间距需要进行调整:我可以调整legend.key.sizelegend.text来获得比默认更好的效果,因为默认效果太拥挤了。

我还尝试了另一个方法,涉及cat(strwrap("长标签在这里"), sep = "\n"),但我无法让它起作用。我也尝试过atop,但每行文本太小了,而为了达到所需的层叠效果所需的嵌套过于繁琐。

有没有办法使用希腊字母?

输入图像描述

以下是一些有用的建议,但我无法让它们起作用,例如在1和2中提到的mtext()bquote()组合:

  1. 在绘图标签中使用表达式和换行符
  2. expression()中的换行符?
  3. 将水平图例跨多行包装
  4. 使用expression(paste(将数学符号插入ggplot图例
  5. 使用表达式绘制ggplot2双行标签
  6. 如何使用latex注释() ggplot
  7. ggplot中的希腊字母注释

1
基础图形函数(如mtext)与网格图形(如ggplot)不兼容。 - Gregor Thomas
5
要获取希腊字母和“\n”,您可能需要使用Unicode字符(也许是与cairo设备一起),或者选择tikzDevice。 - baptiste
谢谢Baptiste!我已经使用你的提示回答了自己的问题。如果有建议,请随时添加,我当然会接受你的答案。 - PatrickT
family="mono"(在主题中的element_text内部)与Unicode不兼容。 - PatrickT
这个可以工作:title = element_text(family = "DejaVu Sans Mono") - PatrickT
Baptiste的建议使用“tikzDevice”在Ben Bolker的回答中得到了很好的阐述,链接如下:https://dev59.com/nmcs5IYBdhLWcg3w3Hun#34372474 - PatrickT
1个回答

65

Baptiste的建议非常准确:Unicode很有用。 用\u03B3替换上面的每个gamma实例,它将显示为希腊语。太神奇了!

可以使用cairo设备进行打印(参考链接):

library(Cairo)
cairo_pdf(file = "ggplot-greek.pdf", width = 8, height = 5)
## ggplot object created here
dev.off()

同样适用:ggsave("greek.pdf", device = cairo_pdf)

这是我发现有用的一些Unicode符号:

"\U016B" = ū
"\U016A" = Ū
"\U00FB" = û
"\U00DB" = Û
"\U0233" = ȳ
"\U0232" = Ȳ
"\U0177" = ŷ
"\U0176" = Ŷ
"\U0113" = ē
"\U0112" = Ē
"\u00EA" = ê
"\U00CA" = Ê
"\U003BC\U2080" = μ₀
"\U003BC\U2081" = μ₁
"R\U00B2" = R²
"\u221E" = ∞
"\u2248" = ≈
"\U2260" = ≠ 
"\u03C3/\u221An" = σ/√n

遗憾的是,并非所有特殊字符都有Unicode等价物。例如,有一个Unicode字符用于表示 y-hat ,但没有 x-hat 的Unicode字符。可以将字母x与Unicode条形符号组合在一起,如"x\u0305" = x̅"p\u0302" = p̂,但似乎打印效果不太好。

我也曾经在将希腊Unicode作为坐标轴标签进行打印时遇到了困难,因此在这些情况下,我使用 annotate()函数并加上选项coord_cartesian(clip = "off")来确保在轴下方打印的标签不会被裁剪("on"是默认的裁剪行为)。

有时您可以直接使用字符,例如:

myplot + labs(title  = "±")

当Unicode无法正常工作时,您可以尝试使用expression(),例如

title = expression(paste("z = (", bar(x), "-\u03BC)/(\u03C3/\u221An)", sep = ""))  
library(ggplot2)
ggplot() + labs(title = title) + theme_bw() 

标题

为了方便起见,我在此复制一些常用的希腊字母Unicode编码。还有更多的Unicode编码可以在这里找到:http://en.wikipedia.org/wiki/List_of_Unicode_characters

\u0391  Α   Greek Capital Letter Alpha
\u0392  Β   Greek Capital Letter Beta
\u0393  Γ   Greek Capital Letter Gamma
\u0394  Δ   Greek Capital Letter Delta
\u0395  Ε   Greek Capital Letter Epsilon
\u0396  Ζ   Greek Capital Letter Zeta
\u0397  Η   Greek Capital Letter Eta
\u0398  Θ   Greek Capital Letter Theta
\u0399  Ι   Greek Capital Letter Iota
\u039A  Κ   Greek Capital Letter Kappa
\u039B  Λ   Greek Capital Letter Lambda
\u039C  Μ   Greek Capital Letter Mu
\u039D  Ν   Greek Capital Letter Nu
\u039E  Ξ   Greek Capital Letter Xi
\u039F  Ο   Greek Capital Letter Omicron
\u03A0  Π   Greek Capital Letter Pi
\u03A1  Ρ   Greek Capital Letter Rho
\u03A3  Σ   Greek Capital Letter Sigma
\u03A4  Τ   Greek Capital Letter Tau
\u03A5  Υ   Greek Capital Letter Upsilon
\u03A6  Φ   Greek Capital Letter Phi
\u03A7  Χ   Greek Capital Letter Chi
\u03A8  Ψ   Greek Capital Letter Psi
\u03A9  Ω   Greek Capital Letter Omega
\u03B1  α   Greek Small Letter alpha
\u03B2  β   Greek Small Letter beta
\u03B3  γ   Greek Small Letter gamma
\u03B4  δ   Greek Small Letter delta
\u03B5  ε   Greek Small Letter epsilon
\u03B6  ζ   Greek Small Letter zeta
\u03B7  η   Greek Small Letter eta
\u03B8  θ   Greek Small Letter theta
\u03B9  ι   Greek Small Letter iota
\u03BA  κ   Greek Small Letter kappa
\u03BB  λ   Greek Small Letter lambda
\u03BC  μ   Greek Small Letter mu
\u03BD  ν   Greek Small Letter nu
\u03BE  ξ   Greek Small Letter xi
\u03BF  ο   Greek Small Letter omicron
\u03C0  π   Greek Small Letter pi
\u03C1  ρ   Greek Small Letter rho
\u03C2  ς   Greek Small Letter final sigma
\u03C3  σ   Greek Small Letter sigma
\u03C4  τ   Greek Small Letter tau
\u03C5  υ   Greek Small Letter upsilon
\u03C6  φ   Greek Small Letter phi
\u03C7  χ   Greek Small Letter chi
\u03C8  ψ   Greek Small Letter psi
\u03C9  ω   Greek Small Letter omega

关于使用Unicode的字体信息:https://en.wikipedia.org/wiki/List_of_typefaces#Unicode_fonts

一些货币符号:

# http://www.fileformat.info/info/unicode/category/Sc/list.htm
Character   Name    Browser     Image
\u0024  DOLLAR SIGN     $
\u00A2  CENT SIGN   ¢
\u00A3  POUND SIGN  £
\u00A4  CURRENCY SIGN   ¤
\u00A5  YEN SIGN    ¥
\u058F  ARMENIAN DRAM SIGN
\u060B  AFGHANI SIGN    ؋
\u09F2  BENGALI RUPEE MARK  ৲
\u09F3  BENGALI RUPEE SIGN  ৳
\u09FB  BENGALI GANDA MARK
\u0AF1  GUJARATI RUPEE SIGN     ૱
\u0BF9  TAMIL RUPEE SIGN    ௹
\u0E3F  THAI CURRENCY SYMBOL BAHT   ฿
\u17DB  KHMER CURRENCY SYMBOL RIEL  ៛
\u20A0  EURO-CURRENCY SIGN  ₠
\u20A1  COLON SIGN  ₡
\u20A2  CRUZEIRO SIGN   ₢
\u20A3  FRENCH FRANC SIGN   ₣
\u20A4  LIRA SIGN   ₤
\u20A5  MILL SIGN   ₥
\u20A6  NAIRA SIGN  ₦
\u20A7  PESETA SIGN     ₧
\u20A8  RUPEE SIGN  ₨
\u20A9  WON SIGN    ₩
\u20AA  NEW SHEQEL SIGN     ₪
\u20AB  DONG SIGN   ₫
\u20AC  EURO SIGN   €
\u20AD  KIP SIGN    ₭
\u20AE  TUGRIK SIGN     ₮
\u20AF  DRACHMA SIGN    ₯
\u20B0  GERMAN PENNY SIGN   ₰
\u20B1  PESO SIGN   ₱
\u20B2  GUARANI SIGN    ₲
\u20B3  AUSTRAL SIGN    ₳
\u20B4  HRYVNIA SIGN    ₴
\u20B5  CEDI SIGN   ₵
\u20B6  LIVRE TOURNOIS SIGN     ₶
\u20B7  SPESMILO SIGN   ₷
\u20B8  TENGE SIGN  ₸
\u20B9  INDIAN RUPEE SIGN   ₹
\u20BA  TURKISH LIRA SIGN   ₺
\u20BB  NORDIC MARK SIGN    ₻
\u20BC  MANAT SIGN  ₼
\u20BD  RUBLE SIGN  ₽
\uA838  NORTH INDIC RUPEE MARK
\uFDFC  RIAL SIGN   ﷼
\uFE69  SMALL DOLLAR SIGN   ﹩
\uFF04  FULLWIDTH DOLLAR SIGN   $
\uFFE0  FULLWIDTH CENT SIGN     ¢
\uFFE1  FULLWIDTH POUND SIGN    £
\uFFE5  FULLWIDTH YEN SIGN  ¥
\uFFE6  FULLWIDTH WON SIGN  

2
太棒了!对于其他符号(我自己正在寻找丹麦克朗),可以在这里找到列表(http://www.xe.com/symbols.php)。只是不要忘记`\u`等。 - RobertMyles
@RobertMc,感谢您,很抱歉我的列表中没有包括丹麦克朗。请随意添加! :-) - PatrickT
4
\u2248 = ≈ 表示大约等于的意思。请参阅此处包含的130页Unicode符号列表:http://ctan.math.utah.edu/ctan/tex-archive/macros/latex/contrib/unicode-math/unimath-symbols.pdf - PatrickT
列表还包括:ℕ = "\u2115", ℤ = "\u2124", ℚ = "\u211a", ℝ = "\u211d", ℂ = "\u2102", ≤ = "\u2264", ≥ = "\u2265", ∈ = "\u2208", ∉ = "\u2209", ∅ = "\u2205", ∞ = "\u221e" - PatrickT
1
对于ggplot中的y轴标签,以下代码适用:ylab(paste("平均韧皮部环距离(","\U003bc","m)")),以提供微米单位。 - TimothyEbert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接