67

ステートメントを使用して、2行に軸ラベルを記述したいと思いexpression()ます。ただし、これは許可さplotmathexpressionません(たとえば、下付きのテキストが右端に表示されます)。2005年頃に同様の問題についてこの議論を見つけましたが、それらが提供する回避策は、ggplot2の私のアプリケーションに変換されません。最近の質問は、複数行の式ステートメントの異なる順列に対処しましたが、ここでも、提供されている回避策は適用されません。

例:

p <- ggplot(mtcars,aes(x=wt,y=mpg))+
  geom_point()+
  xlab(expression(paste("A long string of text goes here just for the purpose \n of illustrating my point Weight "[reported])))
try(ggsave(plot=p,filename=<some file>,height=4,width=6))

前の単語の横に配置したいときに、下付き文字「reported」が右側にキックアウトされた画像を生成します。 ggplot2式付きの2行ラベル

4

4 に答える 4

70

これはバグだと思います。(または、リンクした会話で述べられているように、「複数行の式はサポートされていない」という事実の結果)。

GavinSimpsonがほのめかした回避策は次のとおりです。

#For convenience redefine p as the unlabeled plot
p <- ggplot(mtcars,aes(x=wt,y=mpg))+geom_point()

#Use atop to fake a line break
p + xlab(expression(atop("A long string of text for the purpose", paste("of illustrating my point" [reported]))))

ここに画像の説明を入力してください

下付き文字で真の改行を使用することができます。以下の短い例では、例と同じ形式で、下付き文字が残りのテキストに隣接して正しく配置されていますが、2行のテキストが正しく中央に配置されていません。

p + xlab(expression(paste("line1 \n line2 a" [b])))

ここに画像の説明を入力してください

どちらの場合も、テキストの上の行がテキストの下の行よりも長い場合、下付き文字が間違って配置されていると思います。比較

p + xlab(expression(paste("abc \n abcd" [reported])))

ここに画像の説明を入力してください

p + xlab(expression(paste("abc \n ab" [reported])))

ここに画像の説明を入力してください

下付き文字は常に、上の行の右端のすぐ右側に配置されます。

p + xlab(expression(paste("abcdefghijklmnop \n ab" [reported])))

ここに画像の説明を入力してください

于 2012-11-05T02:31:19.080 に答える
14

1)ソリューションcowplot::draw_label()

draw_label()パッケージの注釈関数を使用することもできます(このcowplot説明で提案されています)。必要な数のテキスト行を呼び出すことができます。と組み合わせて使用​​すると、キャンバス/シートの任意の場所に、0から1の範囲の座標(キャンバス全体に対して)で注釈を付けることができます。cowplot::draw_label()cowplot::draw_label()cowplot::ggdraw()

注釈の位置を微調整し、カスタム軸のタイトル用に十分なスペースを確保する必要があります。

cowplotパッケージは現在、デフォルトのggplotテーマを変更しているため、必要に応じて、ここでtheme_set()説明するようにパッケージをロードした後に使用することに注意してください。

cowplot::draw_label()関数が内部で使用することにも注意してくださいggplot2::annotation_custom()。これについては、以下の後半で詳しく説明します。

library(ggplot2)
library(cowplot)
#> 
#> Attaching package: 'cowplot'
#> The following object is masked from 'package:ggplot2':
#> 
#>     ggsave

# If needed, revert to default theme (cowplot modifies the theme); 
# theme_set(theme_grey())

p <- ggplot(mtcars, aes(x = wt, y = mpg)) + geom_point()
# Make enough space for the custom two lines axis title
p <- p + 
  xlab("") + # empty label
  # Tweak the margins (push the label down by forcing a wider top margin)
  theme(axis.title.x = element_text(size = 10, # also adjust text size if needed
                                    margin = margin(t = 10, r = 0, b = 0, l = 0,
                                                    unit = "mm")))

# The two lines we wish on the plot
line_1 <- "A long string of text for the purpose"
line_2 <- expression(paste("of illustrating my point" [reported]))
# Or avoid paste() (is not actually needed)
# line_2 <- expression("of illustrating my point" [reported])

# Call cowplot::draw_label two times to plot two lines of text
ggdraw(p) + 
  draw_label(line_1, x = 0.55, y = 0.075) + # use relative coordinates for positioning
  draw_label(line_2, x = 0.55, y = 0.025)

cowplot::draw_label()は、クリッピングをオフに設定することと組み合わせて使用​​することもできますcoord_cartesian(clip = "off")。これにより、キャンバス上の任意の場所にプロットできます。今回は相対座標を使用しなくなりましたが、プロット/データからの座標(絶対座標)を使用します。

# Other two expressions
line_1b <- expression(bolditalic('First line'))
line_2b <- expression(integral(f(x)*dx, a, b))

p + coord_cartesian(clip = "off") + # allows plotting anywhere on the canvas
  draw_label(line_1b, x = 3.5, y = 8.2) + # use absolute coordinates for positioning
  draw_label(line_2b, x = 3.5, y = 6)

reprexパッケージ(v0.2.1)によって2019-01-14に作成されました


2)ソリューションggplot2::annotation_custom()

前述のようにcowplot::draw_label()、はのラッパーですggplot2::annotation_custom()。したがって、の代わりに、クリッピングをオフに設定することとcowplot::draw_label()直接ggplot2::annotation_custom()組み合わせて使用​​できます。これは、このプルリクエストcoord_cartesian(clip = "off")をマージすることで利用可能になりました。

ただし、このアプローチはより冗長であり、より多くの座標引数があり、を使用する必要がありますgrid::textGrob()

# Some other two lines we wish on the plot as OX axis title
line_1c <- expression("Various fonts:" ~ bolditalic("bolditalic") ~ bold("bold") ~ italic("italic"))
line_2c <- expression("this" ~~ sqrt(x, y) ~~ "or this" ~~ sum(x[i], i==1, n) ~~ "math expression")
# the ~~ ads a bit more space than ~ between the expression's components

p + coord_cartesian(clip = "off") +
  annotation_custom(grid::textGrob(line_1c), xmin = 3.5, xmax = 3.5, ymin = 7.3, ymax = 7.3) +
  annotation_custom(grid::textGrob(line_2c), xmin = 3.5, xmax = 3.5, ymin = 5.5, ymax = 5.5)

reprexパッケージ(v0.2.1)によって2019-01-14に作成されました

于 2019-01-14T15:03:43.120 に答える
13

このトリックを使用できます、

library(gridExtra)
library(grid)

element_custom <- function() {
  structure(list(), class = c("element_custom", "element_text"))
}

element_grob.element_custom <- function(element, label="", ...)  {

  mytheme <- ttheme_minimal(core = list(fg_params = list(parse=TRUE, 
                                                         hjust=0, x=0.1)))
  disect <- strsplit(label, "\\n")[[1]]
  tableGrob(as.matrix(disect), theme=mytheme)
}

# default method is unreliable
heightDetails.gtable <- function(x) sum(x$heights)

ggplot(iris, aes(Sepal.Length, Sepal.Width)) +
  geom_line() + 
  labs(x= "First~line \n italic('and a second') \n integral(f(x)*dx, a, b)")+
  (theme_grey() %+replace% theme(axis.title.x = element_custom()))

ここに画像の説明を入力してください

于 2015-08-29T00:37:02.857 に答える
9

このパッケージggtextは、HTMLタグでラベルとテキストをフォーマット/カスタマイズできるようにすることで、異なるオプションを提供します。

library(ggtext)
ggplot(mtcars, aes(wt, mpg)) +
  geom_point() +
  xlab("A long string of text goes here just for the purpose<br>of illustrating my point Weight<sub>reported</sub>") +
  theme(axis.title.x = element_markdown())

ここに画像の説明を入力してください

于 2020-03-06T02:35:30.430 に答える