R绘图中的斜体希腊字母?

5
在 R 图中,是否可能斜体显示希腊字母?理想情况下以下代码将会显示斜体的希腊字母:
plot(1:10, 1:10, type="n")
text(8,4, expression(italic(gamma)~":"~italic(sigma))) #doesn't work...
text(2,2,expression(italic("this")~":"~italic("that")))

plotmath文档非常清楚地说明italic()无法用于希腊字母,然而,他们确实说可以使用UTF-8和\uxxxxx或\Uxxxxxxxx来创建斜体希腊符号,但我无法使其生效。有人有关于如何使用utf或其他方法的建议吗?

可能会有一些Tex解决方案,但我没有成功地在我的系统上运行基本的Tex示例。我愿意尝试,但我可能会提出一些后续问题。

下面的代码几乎画出了我想要的东西,但还不完全。

windows(family='serif') #name for Times in default windows gr device lib
plot(1:10, 1:10, type="n")
text(5,9, expression(italic(β)~":"~italic(α))) #1
text(5,7, paste("\u03B2",":","\u03B1",sep=" "), font=3) #2
text(5,5, expression(italic(beta)~":"~italic(alpha))) #3
text(5,3, expression(italic("\u03B2")~":"~italic("\u03B1"))) #4
text(5,1.5, expression(italic("\u03B2")~plain(":")~italic("\u03B1"))) #5

enter image description here

我需要倾斜的符号和不倾斜的“:”号。在第一个例子中(#1),倾斜的符号看起来很奇怪。在第二个例子中,倾斜的符号看起来正确,但是“:”号也是倾斜的。是的,期刊编辑已经注意到了这一点。

操作系统:Windows 7 x64


那么你是在说基于tikzDevice的解决方案不是这个问题的可接受答案吗...? - Ben Bolker
1
这听起来像是默认的“希腊”字体是旧符号字体。理论上,建议使用正确编码的Unicode字体应该有效;当然,首先要确保字体包含希腊符号。 - Jongware
3
?plotmath 中所说,您无法在数学表达式中使用斜体希腊字母。但是,如果您使用 UTF 字符,您可以像对待其他纯文本一样使它们变为斜体:text(5,5, "\u03B2", font=3)。或者一个更完整的例子:text(5,5, expression(beta~ ":" ~ "\u03B2" ~ italic(beta) ~ ":" ~ italic("\u03B2"))) - MrFlick
@BenBolker,编辑了帖子,如果您有一个例子,我会接受它,但我可能会提出后续问题... - TBP
Cairo包可能值得一试;expression(italic(β))在我的机器上可以工作。不过,它有将所有内容都以斜体书写的倾向。 - baptiste
显示剩余3条评论
2个回答

5

我在这个问题上遇到了困难。最终创建了一个数据结构以备将来使用,并进行了一些搜索,以找到制作Unicode字符的“正确方法”(之前尝试过使用paste0("\u", n)等方式,但都失败了,也没有想到聪明的解决办法)。

greeks <- 
structure(list(grsym = c("α", "β", "γ", "δ", "ε", "ζ", 
"η", "θ", "ι", "κ", "λ", "μ", "ν", "ξ", "ο", "π", "ρ", 
"ς", "σ", "τ", "υ", "φ", "χ", "ψ", "ω", "Α", "Β", "Γ", 
"Δ", "Ε", "Ζ", "Η", "Θ", "Ι", "Κ", "Λ", "Μ", "Ν", "Ξ", 
"Ο", "Π", "Ρ", "Σ", "Τ", "Υ", "Φ", "Χ", "Ψ", "Ω"), 
    decUTF = c(945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 
    955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 
    967, 968, 969, 913, 914, 915, 916, 917, 918, 919, 920, 921, 
    922, 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 
    935, 936, 937), hexUTF = structure(c(945L, 946L, 947L, 948L, 
    949L, 950L, 951L, 952L, 953L, 954L, 955L, 956L, 957L, 958L, 
    959L, 960L, 961L, 962L, 963L, 964L, 965L, 966L, 967L, 968L, 
    969L, 913L, 914L, 915L, 916L, 917L, 918L, 919L, 920L, 921L, 
    922L, 923L, 924L, 925L, 926L, 927L, 928L, 929L, 931L, 932L, 
    933L, 934L, 935L, 936L, 937L), class = "hexmode"), htmlSym = c("&alpha;", 
    "&beta;", "&gamma;", "&delta;", "&epsilon;", "&zeta;", "&eta;", 
    "&theta;", "&iota;", "&kappa;", "&lambda;", "&mu;", "&nu;", 
    "&xi;", "&omicron;", "&pi;", "&rho;", "&sigmaf;", "&sigma;", 
    "&tau;", "&upsilon;", "&phi;", "&chi;", "&psi;", "&omega;", 
    "&Alpha;", "&Beta;", "&Gamma;", "&Delta;", "&Epsilon;", "&Zeta;", 
    "&Eta;", "&Theta;", "&Iota;", "&Kappa;", "&Lambda;", "&Mu;", 
    "&Nu;", "&Xi;", "&Omicron;", "&Pi;", "&Rho;", "&Sigma;", 
    "&Tau;", "&Upsilon;", "&Phi;", "&Chi;", "&Psi;", "&Omega;"
    ), Description = c("GREEK SMALL LETTER ALPHA", "GREEK SMALL LETTER BETA", 
    "GREEK SMALL LETTER GAMMA", "GREEK SMALL LETTER DELTA", "GREEK SMALL LETTER EPSILON", 
    "GREEK SMALL LETTER ZETA", "GREEK SMALL LETTER ETA", "GREEK SMALL LETTER THETA", 
    "GREEK SMALL LETTER IOTA", "GREEK SMALL LETTER KAPPA", "GREEK SMALL LETTER LAMBDA", 
    "GREEK SMALL LETTER MU", "GREEK SMALL LETTER NU", "GREEK SMALL LETTER XI", 
    "GREEK SMALL LETTER OMICRON", "GREEK SMALL LETTER PI", "GREEK SMALL LETTER RHO", 
    "GREEK SMALL LETTER FINAL SIGMA", "GREEK SMALL LETTER SIGMA", 
    "GREEK SMALL LETTER TAU", "GREEK SMALL LETTER UPSILON", "GREEK SMALL LETTER PHI", 
    "GREEK SMALL LETTER CHI", "GREEK SMALL LETTER PSI", "GREEK SMALL LETTER OMEGA", 
    "GREEK CAPITAL LETTER ALPHA", "GREEK CAPITAL LETTER BETA", 
    "GREEK CAPITAL LETTER GAMMA", "GREEK CAPITAL LETTER DELTA", 
    "GREEK CAPITAL LETTER EPSILON", "GREEK CAPITAL LETTER ZETA", 
    "GREEK CAPITAL LETTER ETA", "GREEK CAPITAL LETTER THETA", 
    "GREEK CAPITAL LETTER IOTA", "GREEK CAPITAL LETTER KAPPA", 
    "GREEK CAPITAL LETTER LAMBDA", "GREEK CAPITAL LETTER MU", 
    "GREEK CAPITAL LETTER NU", "GREEK CAPITAL LETTER XI", "GREEK CAPITAL LETTER OMICRON", 
    "GREEK CAPITAL LETTER PI", "GREEK CAPITAL LETTER RHO", "GREEK CAPITAL LETTER SIGMA", 
    "GREEK CAPITAL LETTER TAU", "GREEK CAPITAL LETTER UPSILON", 
    "GREEK CAPITAL LETTER PHI", "GREEK CAPITAL LETTER CHI", "GREEK CAPITAL LETTER PSI", 
    "GREEK CAPITAL LETTER OMEGA")), .Names = c("grsym", "decUTF", 
"hexUTF", "htmlSym", "Description"), row.names = c(NA, -49L), class = "data.frame")

这就是数据。函数intToUtf8就是答案,我在bquote策略中实现了它:

start_e <- expression()   # Define the class of the expression vector.
plot(5,5)
text(2+(1:5),4, sapply( greeks[1:5,3],
                        function(x) c(start_e, bquote(italic(.(intToUtf8(x)))) ) ) )

我使用的是Mac电脑,所以这可能不是通用解决方案。以下是我在我的设备上看到的内容:

png(width=480, height=200); plot(1:10, 1:10, type="n")
text(5,6, expression(italic(β)~":"~italic(α))) 
text(5,3, expression(italic("\u03B2")~plain(":")~italic("\u03B1")) );dev.off()

enter image description here


呵呵。我刚刚从网页上复制了一个屏幕截图,然后通过read.fwf运行它并尽我有限的能力清理了它。 - IRTFM
我已经通知了那个网站的所有者有关“lambda”拼写错误的问题。 - IRTFM
可能不太通用。我在Windows上尝试了一下,它将字母以不同的"斜体"方式绘制出来。我在原帖提供了一些代码来说明对比。 - TBP
显然我需要找一台Mac来完成这个图。 - TBP
1
可能有更便宜的策略。你的设备默认字体是什么?... 你试过 expression(italic("\u03B2")~":"~italic("\u03B1")) 吗? - IRTFM
TT字体,Times New Roman,Courier New,Arial。Courier New似乎是默认字体。我应该使用Times NR字体,请参见编辑后的帖子。 - TBP

0

如果在您的输出流程中方便使用(La)TeX渲染,我强烈建议使用tikzDevice包,在您的图形中获得任意(La)TeX排版。

优点

  • 字体等可以轻松地在文本和图形之间保持一致
  • 可以访问所有 LaTeX排版机器

缺点

  • 如果您尚未安装TeX系统,则可能会非常麻烦
  • 如果您不知道TeX并想要进行复杂的方程式,则必须学习新系统
library(tikzDevice)
tikz("plot.tex",standAlone=TRUE)
plot(1:4, 1:4, type="n")
text(1,3, "$\\gamma:\\sigma$") #doesn't work...
text(2,2,"\\textit{this}:\\textit{that}")
dev.off()

将TeX转换为PDF再转换为PNG

system("pdflatex plot.tex")
system("convert plot.pdf plot.png")

enter image description here


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