1. ホーム
  2. r

[解決済み] ggplot軸ラベルの下付き文字

2023-07-15 23:26:51

質問

軸ラベルに添え字をつける方法を考えています。

dat <- data.frame(x = rnorm(100), y = rnorm(100))
ggplot(dat, aes(x=x,y=y)) +
    geom_point() +
    labs(y=expression(Blah[1]))

dat <- data.frame(x = rnorm(100), y = rnorm(100))
ggplot(dat, aes(x=x,y=y)) +
    geom_point() +
    labs(y=expression(Blah[1d]))

最初の例は単なる数字なのでうまくいきますが、角括弧の中に文字があるとすぐに失敗します。Blah[subscript(1d)] は本質的に必要なものですが、subscript に文字を持たせる方法がわかりません。次のようなバリエーションを試してみました。 paste() .

次の例では、奇妙な動作が見られます。

labs(y=expression(Blah[12])) # this works
labs(y=expression(Blah[d])) # this works
labs(y=expression(Blah[d1])) # this works
labs(y=expression(Blah[1d])) # this fails

感想は?

どのように解決するのですか?

最後のものが失敗する理由は、引数が expression の引数が R パーサーに渡され、それらが正しい R 構文であるかどうかのテストに失敗するとエラーが返されるからです。文字列またはトークン 1d は有効な R トークン(またはシンボル) ではありません。これを有効なRトークンに分割して、空白以外の演算子で"connect"するか、バックチックするか、通常の引用符を使用するかのいずれかが可能でしょう。私は、どちらかが paste :

 ggplot(dat, aes(x=x,y=y)) +
     geom_point() +
     labs(y=expression(Blah[1*d]))
 ggplot(dat, aes(x=x,y=y)) +
     geom_point() +
     labs(y=expression(Blah["1d"]))

Rのトークン(またはquot;names"やquot;symbols")は数字から始まることは想定されていません。そのため、この制限を回避するために、引用符で囲むか、あるいは 1d をスペース以外のセパレータで区切った場合 * 演算子を使用します。これは、純粋な数値リテラルを合法的な R 記号またはトークンで結合または合体します。

添え字なしのパーセント記号を取得するには、単に。

 ggplot(dat, aes(x=x,y=y)) +
    geom_point() +
    labs(y=expression(Blah[1*d]*"%"))

pct-signの周りにparensを置くこと。

expression(Blah[1*d]*"(%)")

% 文字は、ユーザー定義の infix 演算子の開始を意味するため、R のパースにおいて特別な意味を持ちます。そのため、これをリテラルとして使用するには、引用符で囲む必要があります。同じ理由で、"for" と "in" は R の予約語グループに入っているので、引用される必要があります。 forin は、私が最も頻繁につまずくものです)。タイプです。

 ?Reserved

そして、もう一つのトリックは、quot;trick" 内の数字を引用符で囲むことです。 italic() の中の数字を引用符で囲むことです。引用符で囲まれていない数字は、この関数の中では斜体にはなりません。

警告 paste はplotmathの関数 を除いて とは異なるセマンティクスを持っています。 base::paste function . 特に、これは 'sep' 引数を持ちません。ですから、印字された引数の間にスペースを入れることは決してできず、 スペースを入れない項目を入れようとすると、他のすべての引数の後に 一つのインスタンスが表示され、ラベルは sep=" " .

paste0 はplotmath関数ではないので、解釈されず、括弧の中に未処理の引数と共に "未処理"として表示されます。