螺旋包裹的文本

时间:2016-01-16 18:39:27

标签: r plot

我在LaTeX people wrapping text into a spiral看到了如下所示。我想在R中复制这个。

enter image description here

我虽然 plotrix ' 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长度文本,因此上面的txttxt2都会形成包装螺旋但不是相同的大小(txt2是{的长度的两倍{ {1}})。

欢迎网格 / ggplot2 和基础grapgics的方法。

1 个答案:

答案 0 :(得分:4)

不完美,但

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)