Добавьте текст с несколькими разрывами строк и курсивом на график в 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.
  • И без мучительного позиционирования каждой строки текста отдельно.

person Community    schedule 17.02.2019    source источник


Ответы (3)


Мы можем использовать 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)

введите здесь описание изображения

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

person jay.sf    schedule 17.02.2019
comment
Спасибо, но я хочу избежать такой ерунды. Я хочу разместить блок текста из нескольких строк, как это легко сделать с помощью text(x, y, "Text\nwith\nline\nbreaks."). - person ; 18.02.2019

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

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.

введите здесь описание изображения

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

person tchevrier    schedule 10.10.2019

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

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

person igorkf    schedule 27.02.2019