Спиральный Обернутый Текст

Я видела в латексные люди, обертывающие текст в спираль, как показано ниже. Я хотел бы повторить это в р.

enter image description here

Я хоть plotrix ' s arctext сделал бы это, но, учитывая достаточный текст, он, кажется, делает круг, как видно на графике (слева) ниже. Я могу сделать аспиральную линию, как видно на графике (справа), но не могу объединить текст и спиральный.

enter image description here

код

txt <- paste(rep("bendy like spaghetti", 10), collapse=" ")
txt2 <- paste(rep("bendy like spaghetti", 20), collapse=" ")

par(mfrow=c(1, 2), mar=rep(.3, 4)+c(0, 0, 1, 0))

library(plotrix)
plot.new()
plot.window(xlim = c(1, 5), ylim = c(2, 4), asp = 1)
arctext(txt, center = c(3, 3), radius = 1.7, 
  start = 4 * pi / 3, cex = .75, clockwise = FALSE)
title(main = "Arc Text (plotrix)")

theta <- seq(0, 30 * 2 * pi, by = 2 * pi/72)
x <- cos(theta)
y <- sin(theta)
R <- theta/max(theta)
plot.new()
plot.window(xlim = c(-1, 1), ylim = c(-1, 1), asp = 1)
lines(x * R, y * R)
title(main = "A Spiral")

В идеале решение будет работать с текстом длины n, поэтому txt и txt2 выше оба сделают спираль обертывания, но не одинакового размера (txt2 в два раза больше длины txt).

подходит для решетки/ggplot2 и низкопробные grapgics приветствованы.

1 ответов


но

txt <- paste(rep("bendy like spaghetti", 10), collapse=" ")
txt2 <- paste(rep("bendy like spaghetti", 20), collapse=" ")
tt <- strsplit(txt, '')[[1]]

xx <- 5
par(mfrow = c(1,2), mar = c(0,0,0,0))
plot(-xx:xx, -xx:xx, type = 'n', axes = FALSE, ann = FALSE)

## option 1
r <- rev(seq(0, xx, length.out = length(tt)))
x <- sqrt(r) * cos(2 * pi * r)
y <- sqrt(r) * sin(2 * pi * r)
text(x, y, tt)

## option 2
plot(-xx:xx, -xx:xx, type = 'n', axes = FALSE, ann = FALSE)
srt <- atan2(y, x) * 180 / pi
for (ii in seq_along(tt))
  text(x[ii], y[ii], tt[ii], srt = srt[ii] - 90)

enter image description here

очевидно, что расстояние между буквами уменьшается, чем ближе вы добираетесь до центра, так что это может быть улучшено.

также я не вижу, как вы можете обойти вызов text для каждого нового значения srt используя этот подход, начиная с srt не является формальным аргументом, означающим, что вы не могли Vectorize(text.default, vectorize.args = 'srt'), но это не очень медленно для примера данные.

дополнительно, вы смогли как раз сделать фрейм данных и подключите его к ggplot.

dd <- data.frame(x, y, srt = srt - 90, tt)
library('ggplot2')
ggplot(dd, aes(x, y)) + geom_text(label = dd$tt, size = 5)
ggplot(dd, aes(x, y)) + geom_text(label = dd$tt, size = 5, angle = dd$srt)