[BioC] fontsize in Rgraphviz
Mark W Kimpel
mwkimpel at gmail.com
Fri Feb 1 07:14:25 CET 2008
Already found a bug. Please change inv.house.func to inverted.house.func
in the demo code. Sorry!
Mark W. Kimpel MD ** Neuroinformatics ** Dept. of Psychiatry
Indiana University School of Medicine
15032 Hunter Court, Westfield, IN 46074
(317) 490-5129 Work, & Mobile & VoiceMail
(317) 204-4202 Home (no voice mail please)
mwkimpel<at>gmail<dot>com
******************************************************************
Florian Hahne wrote:
> Hi Mark,
> to get you all the way, take a look at this:
>
> require(Rgraphviz)
> # Generate random graph
> set.seed(123)
> nodeNames <- letters[1:10]
> M <- 1:4
> g1 <- randomGraph(nodeNames, M, .2)
>
> nAttrs <- list()
>
> #node width
> nAttrs$width <- rep(3, length(nodeNames))
> names(nAttrs$width)<-nodeNames
>
> #node height
> nAttrs$height <- rep(3, length(nodeNames))
> names(nAttrs$height)<-nodeNames
>
> #font size
> fontsize <- rep(c(1, 2), (length(nodeNames)/2))
> names(fontsize)<-nodeNames
>
> #layout and render
> x <- layoutGraph(g1, nodeAttr=nAttrs)
> nodeRenderInfo(x) <- list(cex=fontsize)
> renderGraph(x, graph.pars=list(nodes=list(fill="black",
> textCol="white")))
>
> I didn't set the node shape at all, because the default for dot is to
> use "ellipse", and since you fix your node widths and node heights to
> the same size, this boils down to a circle. I also set the fill and text
> color as attributes in the graph.pars argument to renderGraph, but
> Deepayan's suggestion works, too. The only difference is, that the
> latter permanently assigns the colors to the graph object x, while the
> former takes effect only for the current rendering operation.
>
> nodeRenderInfo(x) <- list(cex=fontsize, fill="black", textCol="white")
> renderGraph(x)
>
> fillcolor is ignored in your example because in the new rendering API
> this parameter is called fill (we tried to stay closer to R's base
> graphic parameter names, and thinking of that now, maybe we should
> rename textCol to font.col or something similar). I just uploaded a much
> more detailed vignette and some bug fixes, and these changes should be
> available soon in Rgraphviz version 1.17.12. If you know how to access
> the svn repository you can get this update immediately. In the Vignette
> there are also tables of the available parameters for nodes, edges and
> the whole graph and I will update the documentation accordingly ASAP.
>
> Everything that affects the graph layout can still be passed on to
> Graphviz as nodeAttrs, edgeAttrs or attrs arguments. For instance, the
> following would change the node shapes:
>
> nAttrs$shape <- c("circle", "rect", rep(c("ellipse", "box"), 4))
> names(nAttrs$shape )<- nodeNames
> x <- layoutGraph(g1, nodeAttr=nAttrs)
> renderGraph(x)
> Again, since widths and heights of the nodes are constant, there's no
> difference between ellipse and circle (box and rect are synonyms,
> anyways). You can see the difference here:
>
> nAttrs$width <- rep(6, length(nodeNames))
> names(nAttrs$width)<-nodeNames
> x <- layoutGraph(g1, nodeAttr=nAttrs)
> renderGraph(x)
>
> Another Graphviz parameter that I find quite useful is fixedsize. If
> this is set to TRUE (the default) all nodes will be forced to have the
> same size unless manually changed. For FALSE, the node sizes will be
> computed from the labels, so longer labels will create larger nodes. As
> far as I remeber, this has to be given to the attrs argument, something
> like this:
>
> attrs <- list(node=list(fixedsize=FALSE))
> x <- layoutGraph(g1, nodeAttr=nAttrs, attrs=attrs)
>
> I'm affaid I can't really point you to the C code for the Graphviz
> interaction (we tried to stay clear of that, it's so easy to break
> things there...), but agopen is the workhorse in Rgraphviz to talk to
> the Graphviz library. Starting there and working your way though the
> code should quickly get you to the interesting C calls. Once you've
> figured out a way to access the different shapes in Graphviz and how to
> get the coordinates back into R, it is straightforward to render them.
> Everything that is stored in the Ragraph object (the return value of
> agopen) can be accessed by our rendering API.
>
> Cheers,
> Florian
>
>
>
>
>
> Mark W Kimpel schrieb:
>> Deepayan,
>>
>> We are making progress. I just updated Rgraphviz-devel. Simply
>> adjusting the way adjusting my parameters to "layoutGraph" as you
>> suggested fixed the font size problem! I did not have to add it at the
>> nodeRenderInfo stage. Attached is a postscript file documenting the
>> results, which would look prettier if I had bothered to adjust the
>> size of the output.
>>
>> Unfortunately, now nAttrs$fillcolor is being ignored, even if it is
>> added as an argument to noRenderInfo.
>>
>> Also, I would very much like to use many of the other shapes available
>> via graphviz. If I was willing to do some of the coding (I know some
>> C), would you point me in the right direction so that I might provide
>> a patch with more shapes?
>>
>> Thanks,
>> Mark
>>
>>
>> Mark W. Kimpel MD ** Neuroinformatics ** Dept. of Psychiatry
>> Indiana University School of Medicine
>>
>> 15032 Hunter Court, Westfield, IN 46074
>>
>> (317) 490-5129 Work, & Mobile & VoiceMail
>> (317) 204-4202 Home (no voice mail please)
>>
>> mwkimpel<at>gmail<dot>com
>>
>> ******************************************************************
>>
>>
>> Deepayan Sarkar wrote:
>>> On 1/30/08, Mark W Kimpel <mwkimpel at gmail.com> wrote:
>>>> Sorry for the complex prior example, I shouldn't write emails late at
>>>> night. Below is a self-contained, reproducible example.
>>>>
>>>> I've made some progress and can get the following script to flow
>>>> without
>>>> error messages. The fontsize, however, is not varying as I believe it
>>>> should and when I substitute "ellipse" for circle the width and height
>>>> parameters do not appropriately effect the shape.
>>>
>>> There are certain attributes which need to be supplied at the layout
>>> step, especially shape, width, and height, as without these the edges
>>> (which need to start from node boundaries) will not be placed
>>> properly. So, you need to supply nAttrs to layoutGraph as
>>>
>>> x <- layoutGraph(g1, nodeAttrs = nAttrs)
>>>
>>> Of course, it's not clear from the documentation that you can do this!
>>>
>>>> I also do not understand where I can specify "neato" vs. "dot" for the
>>>> rendering layout.
>>>
>>> Same goes for this; you can do
>>>
>>> x <- layoutGraph(g1, nodeAttrs = nAttrs, layoutType = "neato")
>>>
>>> The trick is to notice that the default layout function in
>>> 'layoutGraph' is 'layoutGraphviz', which is unexported, but you can
>>> get it's argument list by
>>>
>>>> args(Rgraphviz:::layoutGraphviz)
>>> function (x, layoutType = "dot", name = "graph", recipEdges =
>>> "combined",
>>> nodeAttrs = list(), edgeAttrs = list(), ...)
>>>
>>>
>>> Unfortunately, the fontsize doesn't seem to be retained in the result
>>> of layoutGraph, and I'm not sure yet if that's a bug in our wrapper or
>>> a limitation of the graphviz interface. We will look into it.
>>>
>>>> Also, where to specify a title.
>>>
>>> Generally speaking, our new model is that once the layout is done, you
>>> should be able to modify other attributes before rendering. These
>>> attributes are divided into three types: those for nodes, those for
>>> edges, and those for the whole graph, and these can be accessed and
>>> modified using nodeRenderInfo(), edgeRenderInfo(), and
>>> graphRenderInfo(), respectively.
>>>
>>> So, to come back to your problem, once you have the layout done, you
>>> can modify the fontsize and title as follows:
>>>
>>> nodeRenderInfo(x) <- list(fontsize = nAttrs$fontsize * 5)
>>> graphRenderInfo(x) <- list(main = "Main title")
>>>
>>> and then finally render it with
>>>
>>> renderGraph(x)
>>>
>>> Obviously there are many warts still to be worked out.
>>>
>>> -Deepayan
>>>
>>>> Thanks, mark
>>>>
>>>>
>>>> ####################
>>>> require(Rgraphviz)
>>>> # Generate random graph
>>>> set.seed(123)
>>>> nodeNames <- letters[1:10]
>>>> M <- 1:4
>>>> g1 <- randomGraph(nodeNames, M, .2)
>>>>
>>>> nAttrs <- list()
>>>>
>>>> #node shapes
>>>> nAttrs$shape <- rep("circle", length(nodeNames))
>>>> names(nAttrs$shape )<- nodeNames
>>>>
>>>> #node width
>>>> nAttrs$width <- rep(3, length(nodeNames))
>>>> names(nAttrs$width)<-nodeNames
>>>>
>>>> #node height
>>>> nAttrs$height <- rep(3, length(nodeNames))
>>>> names(nAttrs$height)<-nodeNames
>>>>
>>>> #node colors
>>>> nAttrs$fillcolor <-rep("black", length(nodeNames))
>>>> names(nAttrs$fillcolor) <- nodeNames
>>>>
>>>> #font color
>>>> nAttrs$fontcolor <- rep("white", length(nodeNames))
>>>> names(nAttrs$fontcolor)<-nodeNames
>>>>
>>>> #font size
>>>> nAttrs$fontsize <- rep(c(1, 2), (length(nodeNames)/2))
>>>> names(nAttrs$fontsize)<-nodeNames
>>>>
>>>> postscript(file="my.test.graph.ps", paper="special",width=4, height=5)
>>>> #set up graphics device
>>>> x <- layoutGraph(g1)
>>>> nodeRenderInfo(x) = nAttrs
>>>> renderGraph(x)
>>>> dev.off()## close the graphics device
>>>>
>>>>
>>>>
>>>> Mark W. Kimpel MD ** Neuroinformatics ** Dept. of Psychiatry
>>>> Indiana University School of Medicine
>>>>
>>>> 15032 Hunter Court, Westfield, IN 46074
>>>>
>>>> (317) 490-5129 Work, & Mobile & VoiceMail
>>>> (317) 204-4202 Home (no voice mail please)
>>>>
>>>> mwkimpel<at>gmail<dot>com
>>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Bioconductor mailing list
>> Bioconductor at stat.math.ethz.ch
>> https://stat.ethz.ch/mailman/listinfo/bioconductor
>> Search the archives:
>> http://news.gmane.org/gmane.science.biology.informatics.conductor
>
>
More information about the Bioconductor
mailing list