Well, i use graphviz, which has Java bindings (Grappa).
Although the dot language (graphviz's syntax) is simple, i prefer to use graphviz as a library through the excellent and production-stable python bindings, pygraphviz, and networkx.
Here's the code for a simple 'funnel diagram' using those tools; it's not the most elaborate diagram, but it is complete--it initializes the graph object, creates all of the necessary components, styles them, renders the graph, and writes it to file.
import networkx as NX
import pygraphviz as PV
G = PV.AGraph(strict=False, directed=True) # initialize graph object
# create graph components:
node_list = ["Step1", "Step2", "Step3", "Step4"]
edge_list = [("Step1, Step2"), ("Step2", "Step3"), ("Step3", "Step4")]
G.add_nodes_from(node_list)
G.add_edge("Step1", "Step2")
G.add_edge("Step2", "Step3")
G.add_edge("Step3", "Step4")
# style them:
nak = "fontname fontsize fontcolor shape style fill color size".split()
nav = "Arial 11 white invtrapezium filled cornflowerblue cornflowerblue 1.4".split()
nas = dict(zip(nak, nav))
for k, v in nas.iteritems() :
G.node_attr[k] = v
eak = "fontname fontsize fontcolor dir arrowhead arrowsize arrowtail".split()
eav = "Arial 10 red4 forward normal 0.8 inv".split()
eas = dict(zip(eak, eav))
for k, v in eas.iteritems() :
G.edge_attr[k] = v
n1 = G.get_node("Step1")
n1.attr['fontsize'] = '11'
n1.attr['fontcolor'] = 'red4'
n1.attr['label'] = '1411'
n1.attr['shape'] = 'rectangle'
n1.attr['width'] = '1.4'
n1.attr['height'] = '0.05'
n1.attr['color'] = 'firebrick4'
n4 = G.get_node("Step4")
n4.attr['shape'] = 'rectangle'
# it's simple to scale graph features to indicate 'flow' conditions, e.g., scale
# each container size based on how many items each holds in a given time snapshot:
# (instead of setting node attribute ('width') to a static quantity, you would
# just bind 'n1.attr['width']' to a variable such as 'total_from_container_1'
n1 = G.get_node("Step2")
n1.attr['width'] = '2.4'
# likewise, you can do the same with edgewidth (i.e., make the arrow thicker
# to indicate higher 'flow rate')
e1 = G.get_edge("Step1", "Step2")
e1.attr['label'] = ' 1411'
e1.attr['penwidth'] = 2.6
# and you can easily add labels to the nodes and edges to indicate e.g., quantities:
e1 = G.get_edge("Step2", "Step3")
e1.attr['label'] = ' 392'
G.write("conv_fnl.dot") # save the dot file
G.draw("conv_fnl.png") # save the rendered diagram
alt text http://a.imageshack.us/img148/390/convfunnel.png
Q: Can I still make a funnel plot with effect size on the horizontal axon and total sample size n (n=n1+n2) on the vertical axis?
A: Yes
Q: How should such a funnel plot be interpreted?
A: It is still a funnel plot. However, funnel plots should be interpreted with caution. For example, if you have only 5-10 effect sizes, a funnel plot is useless. Furthermore, although funnel plots are a helpful visualization technique, their interpretation can be misleading. The presence of an asymmetry does not proof the existence of publication bias. Egger et al. (1997: 632f.) mention a number of reasons that can result in funnel plot asymmetries, e.g. true heterogeneity, data irregularities like methodologically poorly designed small studies or fraud. So, funnel plots can be helpful in identifying possible publication bias, however, they should always be combined with a statistical test.
Q: Is such a plot acceptable when the standard error is not known?
A: Yes
Q: Is it the same as the classical funnel plot with SE or presicion=1/SE on the vertical axon?
A: No, the shape of the 'funnel' can be different.
Q: Is its interpretation different?
A: Yes, see above
Q: How should I set the lines to make the equilateral triangle?
A: What do you mean by "lines to make the equilateral triangle"? Do you mean the 95%-CI lines? You will need the standard errors...
You also might be interested in:
Peters, Jaime L., Alex J. Sutton, David R. Jones, Keith R. Abrams, and Lesly Rushton. 2006. Comparison of two methods to detect publication bias in meta-analysis. Journal of the American Medical Association 295, no. 6: 676--80. (see "An Alternative to Egger’s
Regression Test")
They propose a statistical test which focuses on sample size instead of standard errors.
By the way, do you know the book "Publication Bias in Meta-Analysis: Prevention, Assessment and Adjustments"? It will answer a lot of your questions.
Best Answer
Generally a variance for a mean of $n$ iid $X_i$s is ${\rm var}(X_i)/n$. Now since the $X_i$s are Bernoulli with success probability $p$, ${\rm var}(X_i)$ has a special form. It is $p(1-p)$. So each of the $23$ means have variance of the special form $p(1-p)/n$ and the standard error is the square root of that.