Форматировать всплывающую подсказку для длинных текстовых меток - PullRequest
1 голос
/ 12 апреля 2019

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

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")

enter image description here

1 Ответ

2 голосов
/ 12 апреля 2019

Я почти уверен, что где-то существует более элегантное решение. Я могу просто предложить вам поставить разрыв как каждый 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")

enter image description here

UPDATE

Вот более элегантное решение из комментариев @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")

enter image description here

...