我在LaTeX people wrapping text into a spiral看到了如下所示。我想在R中复制这个。
我虽然 plotrix ' arctext
会这样做,但是如果给出了足够的文字,它似乎会形成一个圆圈,如下图(左)所示。我可以制作阴影线,如图(右)所示,但不能合并文字和螺旋。
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
是{的长度的两倍{ {1}})。
欢迎网格 / ggplot2 和基础grapgics的方法。
答案 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)
显然,字母之间的距离会越靠近中心,因此可以提高。
此外,我不知道如何使用此方法为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)