An improved version below (now the connections are drawn in the correct order),

library(grid)

arcTextGrob <- function(x=unit(0.5, "npc"), y=unit(0.5, "npc"),
                        labels=library()$results[,1],
                        links=sample(seq_along(labels), 20, rep=T),
                        default.units="npc",
                        gp=gpar(), ...)
  {

    ##     circle
    full.height <- sum(stringHeight(labels))
    radius <- 1.2 /(2*pi) * full.height
    g1 <- circleGrob(0.5, 0.5, r=radius, default.units="npc", gp=gpar(col=NA))

    ##     text labels
    n <- length(labels)
    ang <- seq(0, n-1) * 2 * pi/n

    radius.npc <- convertUnit(radius, "npc", val=T)
    coords <- data.frame(x=0.5+radius.npc*cos(ang), y=0.5+radius.npc*sin(ang))
    g2 <- textGrob(labels, x=coords$x , y=coords$y , rot=ang*180/pi,
default.units="npc", hjust=0)

    ##     connecting pairs

    xm <- matrix(coords$x[links], ncol=2, byrow=T)
    ym <- matrix(coords$y[links], ncol=2, byrow=T)

    ## find out which pairs are not in trigo order
    ## and swap them
    swap <- as.logical(sign((xm[, 1]-0.5)*(ym[, 2]-0.5) - (xm[,
2]-0.5)*(ym[, 1]-0.5)) + 1)
    xm[swap, ] <- rev(xm[swap])
    ym[swap, ] <- rev(ym[swap])

    g3 <- do.call(gList, mapply(curveGrob, x1=xm[, 1], y1=ym[, 1],
x2=xm[, 2], y2=ym[, 2],
                                ncp=8, curvature=0.4, square=F, SIMPLIFY=FALSE))

    gTree(children=gList(g1, g2, g3),
          outer.radius=convertUnit(radius, "npc") +
          convertUnit(max(stringWidth(labels)), "npc"))
  }


grid.arcText <- function(...)
  grid.draw(arcTextGrob(...))

set.seed(1234)
grid.newpage()
grid.arcText()


On 7 April 2010 23:13, baptiste auguie <baptiste.aug...@googlemail.com> wrote:
> The following grob might be a starting point. I couldn't find a clean
> way of orienting the linking arcs though...
>
> Best,
>
> baptiste
>
> library(grid)
>
> paragraph <- "Lorem ipsum dolor sit amet, consectetur adipiscing elit.
> Praesent adipiscing lobortis placerat. Nunc vel arcu mauris. Aliquam
> erat volutpat. Integer et pharetra orci. Sed rutrum facilisis dolor et
> condimentum. Class aptent taciti sociosqu ad litora torquent per
> conubia nostra, per inceptos himenaeos. Nunc leo nibh, pellentesque et
> convallis quis, mattis ut mi. Nunc dignissim auctor elit pulvinar
> malesuada. Cras dapibus hendrerit ligula quis suscipit. Proin porta
> tempor feugiat. Ut quis nisi lacus, et egestas tortor. Fusce porttitor
> tincidunt fringilla. Vivamus rhoncus ultrices elit, at fermentum nisl
> scelerisque et. Duis placerat est at justo vestibulum sodales.
> Curabitur quis eros tellus. "
>
> words <- strsplit(paragraph, " ")[[1]]
> labels <- apply(matrix(words, ncol=3, byrow=T), 1, paste, collapse=" ")
>
> arcTextGrob <- function(x=unit(0.5, "npc"), y=unit(0.5, "npc"),
>                        labels=letters[1:10],
>                        links=sample(seq_along(labels), 10),
>                        min.radius=unit(2, "cm"),
>                        default.units="npc",
>                        gp=gpar(), ...)
>  {
>
>    ##     circle of perimeter = 1.5 * the text height
>    full.height <- sum(stringHeight(labels))
>    radius <- 1.5 /(2*pi) * full.height
>
>    g1 <- circleGrob(0.5, 0.5, r=radius, default.units="npc")
>
>    ##     text labels
>    n <- length(labels)
>    ang <- seq(0, n-1) * 2 * pi/n
>
>    radius.mm <- convertUnit(radius, "npc", val=T)
>    coords <- data.frame(x=0.5+radius.mm*cos(ang), y=0.5+radius.mm*sin(ang))
>    g2 <- textGrob(labels, x=coords$x , y=coords$y , rot=ang*180/pi,
> default.units="npc", hjust=0)
>
>    ## links,
>    ## NOTE: they are not well ordered...
>
>    xm <- matrix(coords$x[links], ncol=2, byrow=T)
>    ym <- matrix(coords$y[links], ncol=2, byrow=T)
>
>    g3 <- do.call(gList, mapply(curveGrob, x1=xm[, 1], y1=ym[, 1],
> x2=xm[, 2], y2=ym[, 2],
>                                ncp=8, curvature=0.3, square=F, 
> SIMPLIFY=FALSE))
>
>    gTree(children=gList(g1, g2, g3))
>  }
>
>
> grid.arcText <- function(...)
>  grid.draw(arcTextGrob(...))
>
> dev.new()
> grid.arcText(labels=labels)
>
>
>
>
> On 7 April 2010 16:44, Gabor Grothendieck <ggrothendi...@gmail.com> wrote:
>> There is draw.arc in the plotrix package.
>>
>> On Wed, Apr 7, 2010 at 10:20 AM, baptiste auguie
>> <baptiste.aug...@googlemail.com> wrote:
>>> Hi,
>>>
>>> Barry suggested a way to place the text labels; I would like to point
>>> out the grid.curve() function that might help in connecting the labels
>>> with nice-looking curves. I don't know of a base graphics equivalent
>>> (xspline() might come close) so it might be best to opt for Grid.
>>>
>>> HTH,
>>>
>>> baptiste
>>>
>>>
>>> On 7 April 2010 15:46, Barry Rowlingson <b.rowling...@lancaster.ac.uk> 
>>> wrote:
>>>> On Wed, Apr 7, 2010 at 2:28 PM, Brock Tibert <btibe...@yahoo.com> wrote:
>>>>> Hi All,
>>>>>
>>>>> I am new to R, but it has been a lot of fun learning as I go and have 
>>>>> been blow away by what it can do.  Came across this example and wanted to 
>>>>> see if ggplot2 or some other visualization package could make this sort 
>>>>> of graphic.
>>>>>
>>>>> http://www.visualcomplexity.com/vc/project.cfm?id=717&utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+visualcomplexity+(visualcomplexity.com)&utm_content=Google+Reader
>>>>>
>>>>> Thanks in advance!
>>>>
>>>>  Not quite out-of-the box, but you can draw text with the text()
>>>> function setting the angle with the 'srt' parameter, and you can draw
>>>> lines using 'lines'. You can compute angles using 'pi'. You'll need a
>>>> bit of trig to work out the angle that the lines start and end at.
>>>> That's about all you need to know.
>>>>
>>>>  Some of the subtleties of the typesetting of that specific piece may
>>>> be tricky, but it's easy to write a function that takes a vector of
>>>> strings and an adjacency matrix and plots something like it.
>>>>
>>>>  Give R-help another hour and I reckon something will turn up. Not
>>>> from me, I'm watching the IPL cricket.
>>>>
>>>> Barry
>>>>
>>>> ______________________________________________
>>>> R-help@r-project.org mailing list
>>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>>> PLEASE do read the posting guide 
>>>> http://www.R-project.org/posting-guide.html
>>>> and provide commented, minimal, self-contained, reproducible code.
>>>>
>>>
>>> ______________________________________________
>>> R-help@r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>>>
>>
>



-- 
____________________

Baptiste Auguié

Departamento de Química Física,
Universidade de Vigo,
Campus Universitario, 36310, Vigo, Spain

tel: +34 9868 18617
http://webs.uvigo.es/coloides

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to