【问题标题】:Italic greek letters in R plot?R图中的斜体希腊字母?
【发布时间】:2014-11-02 04:27:28
【问题描述】:

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() 不适用于希腊字母,但是,他们确实说带有 \uxxxxx 或 \Uxxxxxxxx 的 UTF-8 可用于创建斜体希腊符号,但我一直无法让它发挥作用。有人对如何使用 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

我需要斜体符号和非斜体“:”。在顶部(#1)中,斜体符号看起来很奇怪。在第二个中,斜体符号看起来正确,但“:”是斜体。是的,期刊编辑发现了这一点。

操作系统:Windows 7 x64

【问题讨论】:

  • 那么您是说基于tikzDevice 的解决方案 是这个问题的可接受答案...?
  • 这听起来像是默认的“希腊”字体是旧的符号。从理论上讲,使用正确编码的 Unicode 字体的建议应该可行;首先,当然是确保字体包含希腊符号。
  • 就像?plotmath 所说,数学表达式中不能有斜体希腊字母。但是,如果您使用 UTF 字符,则可以像使用任何其他纯文本一样将它们设为斜体:text(5,5, "\u03B2", font=3)。或者更完整的例子:text(5,5, expression(beta~ ":" ~ "\u03B2" ~ italic(beta) ~ ":" ~ italic("\u03B2")))
  • @BenBolker,已编辑帖子,如果您有示例,我愿意接受,但我可能会提出后续问题...
  • @MrFlick,好的,现在我正在比较它们,我认为期刊不会接受非数学表达式 beta ......看起来我需要让 Tex 工作......不知何故...

标签: r


【解决方案1】:

我在这个问题上苦苦挣扎。最终制作了一个数据结构以供将来使用,并在“正确的方式”上进行了一些搜索以制作 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()

【讨论】:

  • 嘿。我刚刚从网页上复制了一个屏幕截图,通过read.fwf 运行它并尽我所能清理它。
  • 我通知了该网站的所有者“lambda”的拼写错误。
  • 可能不一般。我在 windows 上尝试过,它以不同的“斜体”方式绘制字母。我提供了一些代码来说明原始帖子中的对比。
  • 显然我需要为这个人物找到一台 Mac。
  • 可能有更便宜的策略。您的设备默认字体中有哪些字体? ...你试过expression(italic("\u03B2")~":"~italic("\u03B1"))
【解决方案2】:

如果在您的输出管道中使用 (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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 2015-08-12
    • 2016-09-01
    • 1970-01-01
    • 2019-05-09
    • 2012-01-01
    • 2020-06-14
    • 1970-01-01
    相关资源
    最近更新 更多