Добавить текст с несколькими переносами строк и курсивом к графику в R

Я хочу добавить несколько строк текста к сюжету, в котором некоторые слова выделены курсивом. Вот как должен выглядеть текст:

Курсив Некоторые
слова с
новые линии.

Более курсивный текст: пока
больше слов разделено
по новым линиям.

Курсив еще раз: и многое другое
текст с
новые линии.

Следующий код печатает одну строку текста курсивом:

plot(c(0, 2), c(0, 2))
text(1, 1, bquote(
        paste(
            italic("Italic Text:"),
            " Some words with new lines. ",
            italic("More italic text:"),
            "Yet more words divided by new lines. ",
            italic("Italics again:"),
            "And more text with new lines.",
            sep = ""
        )
    )
)

И это создает разрывы строк, но без курсива:

plot(c(0, 2), c(0, 2))
text(1, 1, "Italic Text: Some\nwords with\nnew lines.\n\nMore italic text: Yet\nmore words divided\nby new lines.\n\nItalics again: And more\ntext with\nnew lines.")

Но когда я пытаюсь разбить текст на строки и добавить курсив, символы новой строки приводят к странным результатам:

plot(c(0, 2), c(0, 2))
text(1, 1, bquote(
        paste(
            italic("Italic Text:"),
            " Some\nwords with\nnew lines.\n\n",
            italic("More italic text:"),
            "Yet\nmore words divided\nby new lines.\n\n",
            italic("Italics again:"),
            "And more\ntext with\nnew lines.",
            sep = ""
        )
    )
)

atop(), как предлагается в других ответах, работает только с двумя строками.

Какой самый простой способ добавить несколько строк текста с несколькими словами курсивом к сюжету?

  • В идеале, используя только базу R.
  • И без мучительного позиционирования каждой строки текста в отдельности.

2 ответа

Мы можем использовать substitute() комбинировать курсив и обычный текст. Чтобы выровнять текст по левому краю, мы можем использовать опцию pos=4, тогда мы можем, мы можем возиться вместе, как это.

plot(c(0, 2), c(0, 2))
text(1, 1.9, substitute(paste(italic("Italic:"), " Some")), pos=4)
text(1, 1.7, "words with\nnew lines.", pos=4)
text(1., 1.4, substitute(paste(italic("More italic text:"), " Yet")), pos=4)
text(1, 1.21, "words with\nnew lines.", pos=4)
text(1., .9, substitute(paste(italic("Italics again:"), " And more")), pos=4)
text(1, .71, "text with\nnew lines.", pos=4)

https://stackru.com/images/5b43da3290a5d3c6bfccea0b4e b02a772d014597.png

Примечание: он немного сдвигается при экспорте. Я экспортировал рисунок с разрешением 500х500.

Как насчет этого?

plot(c(0, 10), c(0, 10))
text(
  5,
  7:2,
  c(
    expression(paste(italic("Italic Text:"), " Some")),
    "\nwords with\nnew lines.",
    expression(paste(italic("More italic text:"), " Yet")),
    "\nmore words divided\nby new lines.",
    expression(paste(italic("Italics again:"), "And more")),
    "\ntext with\nnew lines."
  )
)

я думаю, что происходит именно то, что упомянуто в виньетке дляtext.

Если метки длиннее x и y, координаты перерабатываются до длины меток.

Это может быть причиной того, что вы получаете свой странный макет. Если вы измените мой7:2 код внутри text, Я также получил ваш "испорченный" макет. Только центральный абзац по-прежнему выглядит "выключенным" - и я действительно не уверен, почему... Он выглядит так же, как и другие 2:-s. Остальное выглядит как раз то, что вы ищете, я так понимаю? В любом случае, выглядит точно так же, как ваша вторая картинка, которую я использовал в качестве ориентира...

Я просто немного поработал с этим... если вы хотите выровнять по левому краю, просто добавьте pos = 4 внутри text функция.

С этого момента вы сможете получить именно то, что хотите. Надеюсь это поможет!

Я не знаю курсив... но пакет, который я написал, может помочь вам:

devtools::install_github("igorkf/breaker")
library(breaker)

nbreak("Some text that you want and the italic stuff", n = 3)
#[1] "Some text that\nyou want and\nthe italic stuff"

#You can also use this with purrr:
purrr::map_chr(list("the first text that you want",
                    "the second text that you want",
                    "the third text that you want"),
                  ~nbreak(.x, n = 2))
#[1] "the first\ntext that\nyou want"  "the second\ntext that\nyou want" "the third\ntext that\nyou want"

Вы также можете сломать только один раз, используя loop = F

Другие вопросы по тегам