Отформатируйте всплывающую подсказку в plotly для длинных текстовых меток

Рассмотрим простой пример ниже. Есть ли способ отформатировать всплывающую подсказку таким образом, чтобы длинные текстовые метки были видны в поле, а не в этом абсурдном прямоугольнике, который обрезает значения?

library(ggplot2); library(plotly)

df <- data.frame(x = 1:10, y = 1:10, z = rep("the longggggggggggggggggggggggggggggestttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt labelllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll you can imagineeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", 10))

p <- ggplot(df, aes(x,y,label=z)) + geom_point()
ggplotly(p, tooltip = "label")

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


person Rich Pauloo    schedule 12.04.2019    source источник


Ответы (1)


Я почти уверен, что где-то существует более элегантное решение. Я могу просто предложить вам поставить разрыв, как каждый символ n. Есть хороший обходной путь от https://stackoverflow.com/a/2352006/9300556:

gsub('(.{1,90})(\\s|$)', '\\1\n', s)

Он разбивает строку «s» на строки с максимум 90 символами (исключая символ разрыва строки «\ n», но включая межсловные пробелы), если не существует самого слова, превышающего 90 символов, тогда само слово будет занимать целое линия.

Итак, нам просто нужно добавить gsub() в ggplot эстетику:

p <- ggplot(df, aes(x,y,
            text = gsub('(.{1,20})(\\s|$)', '\\1\n', z))) +
  geom_point()

ggplotly(p, tooltip = "text")

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

ОБНОВЛЕНИЕ

Вот более элегантное решение из комментариев @Rich Pauloo. В этом случае ваши строки также будут в основном заполнены слева (но фактически автоматически выровнены). Однако заполнение зависит от разрешения графика и расположения метки.

library(stringr)

p <- ggplot(df,
            aes(x, y,
                text = stringr::str_wrap(
                  string = z,
                  width = 20,
                  indent = 1, # let's add extra space from the margins
                  exdent = 1  # let's add extra space from the margins
                ))) +
  geom_point()

ggplotly(p, tooltip = "text")

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

person atsyplenkov    schedule 12.04.2019
comment
Отличный ответ, спасибо за подписку в Твиттере! Похоже, мы работаем над похожими проблемами. Ваш ответ фактически привел меня к более сжатому ответу, который имеет дополнительное преимущество в виде выравнивания текста по левому краю. Пожалуйста, подумайте о добавлении его к своему собственному ответу, и я приму его! В эстетике ggplot используйте text = stringr::str_wrap(z, width = 20). Из документации, эта функция использует алгоритм переноса абзацев Knuth-Plass. - person Rich Pauloo; 12.04.2019
comment
@RichPauloo Отлично! Я обновил свой ответ. Надеюсь увидеть это в ваших работах;) - person atsyplenkov; 12.04.2019