Actualización 10/27: He detallado los pasos para lograr una escala consistente en una respuesta. Básicamente para cada objeto Graphics necesita corregir todos los rellenos/márgenes a 0 y especificar manualmente plotRange y imageSize que 1) plotRange incluye todos los gráficos 2) imageSize = scale * plotRangeTamaño consistente para GraphPlots
Todavía estoy seguro de cómo hacerlo 1) en generalidad completa, una solución que funciona para los gráficos que consiste de los puntos y las líneas gruesas (AbsoluteThickness) se da
estoy usando "Inset" en VertexRenderingFunction y "VertexCoordinates" para garantizar apariencia consistente entre subgraphs de un gráfico. Esos subgrafos se dibujan como vértices de otro gráfico, usando "Inserción". Hay dos problemas, uno es que los cuadros resultantes no se recortan alrededor del gráfico (es decir, el gráfico con un vértice todavía se coloca en un cuadro grande), y otro es que hay una variación extraña entre los tamaños (se puede ver que un cuadro es vertical) . ¿Alguien puede encontrar una solución a estos problemas?
Esto se relaciona con un anterior question de cómo mantener los tamaños de los vértices con el mismo aspecto, y aunque la sugerencia de Michael Pilat de usar Inset funciona para mantener la representación de los vértices en la misma escala, la escala general puede ser diferente. Por ejemplo en la rama izquierda, la gráfica que consiste en vértices 2,3 se estira en relación con el subgrafo "2,3" en el gráfico superior, a pesar de que estoy usando posicionamiento absoluto vértice tanto para
http://yaroslavvb.com/upload/bad-graph.png
(*utilities*)intersect[a_, b_] := Select[a, MemberQ[b, #] &];
induced[s_] := Select[edges, #~intersect~s == # &];
Needs["GraphUtilities`"];
subgraphs[
verts_] := (gr =
Rule @@@ Select[edges, (Intersection[#, verts] == #) &];
Sort /@ WeakComponents[gr~Join~(# -> # & /@ verts)]);
(*graph*)
gname = {"Grid", {3, 3}};
edges = GraphData[gname, "EdgeIndices"];
nodes = Union[Flatten[edges]];
AppendTo[edges, #] & /@ ({#, #} & /@ nodes);
vcoords = Thread[nodes -> GraphData[gname, "VertexCoordinates"]];
(*decompose*)
edgesOuter = {};
pr[_, _, {}] := None;
pr[root_, elim_,
remain_] := (If[root != {}, AppendTo[edgesOuter, root -> remain]];
pr[remain, intersect[Rest[elim], #], #] & /@
subgraphs[Complement[remain, {First[elim]}]];);
pr[{}, {4, 5, 6, 1, 8, 2, 3, 7, 9}, nodes];
(*visualize*)
vrfInner =
Inset[Graphics[{White, EdgeForm[Black], Disk[{0, 0}, .05], Black,
Text[#2, {0, 0}]}, ImageSize -> 15], #] &;
vrfOuter =
Inset[GraphPlot[Rule @@@ induced[#2],
VertexRenderingFunction -> vrfInner,
VertexCoordinateRules -> vcoords, SelfLoopStyle -> None,
Frame -> True, ImageSize -> 100], #] &;
TreePlot[edgesOuter, Automatic, nodes,
EdgeRenderingFunction -> ({Red, Arrow[#1, 0.2]} &),
VertexRenderingFunction -> vrfOuter, ImageSize -> 500]
Aquí hay otro ejemplo, el mismo problema que antes, pero la diferencia en las escalas relativas es más visible. El objetivo es que las partes de la segunda imagen coincidan exactamente con las partes de la primera imagen.
http://yaroslavvb.com/upload/bad-plot2.png
(* Visualize tree decomposition of a 3x3 grid *)
inducedGraph[set_] := Select[edges, # \[Subset] set &];
Subset[a_, b_] := (a \[Intersection] b == a);
graphName = {"Grid", {3, 3}};
edges = GraphData[graphName, "EdgeIndices"];
vars = Range[GraphData[graphName, "VertexCount"]];
vcoords = Thread[vars -> GraphData[graphName, "VertexCoordinates"]];
plotHighlight[verts_, color_] := Module[{vpos, coords},
vpos =
Position[Range[GraphData[graphName, "VertexCount"]],
Alternatives @@ verts];
coords = Extract[GraphData[graphName, "VertexCoordinates"], vpos];
If[coords != {}, AppendTo[coords, First[coords] + .002]];
Graphics[{color, CapForm["Round"], JoinForm["Round"],
Thickness[.2], Opacity[.3], Line[coords]}]];
jedges = {{{1, 2, 4}, {2, 4, 5, 6}}, {{2, 3, 6}, {2, 4, 5, 6}}, {{4,
5, 6}, {2, 4, 5, 6}}, {{4, 5, 6}, {4, 5, 6, 8}}, {{4, 7, 8}, {4,
5, 6, 8}}, {{6, 8, 9}, {4, 5, 6, 8}}};
jnodes = Union[Flatten[jedges, 1]];
SeedRandom[1]; colors =
RandomChoice[ColorData["WebSafe", "ColorList"], Length[jnodes]];
bags = MapIndexed[plotHighlight[#, bc[#] = colors[[First[#2]]]] &,
jnodes];
Show[bags~
Join~{GraphPlot[Rule @@@ edges, VertexCoordinateRules -> vcoords,
VertexLabeling -> True]}, ImageSize -> Small]
bagCentroid[bag_] := Mean[bag /. vcoords];
findExtremeBag[vec_] := (
vertList = First /@ vcoords;
coordList = Last /@ vcoords;
extremePos =
First[Ordering[jnodes, 1,
bagCentroid[#1].vec > bagCentroid[#2].vec &]];
jnodes[[extremePos]]
);
extremeDirs = {{1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
extremeBags = findExtremeBag /@ extremeDirs;
extremePoses = bagCentroid /@ extremeBags;
vrfOuter =
Inset[Show[plotHighlight[#2, bc[#2]],
GraphPlot[Rule @@@ inducedGraph[#2],
VertexCoordinateRules -> vcoords, SelfLoopStyle -> None,
VertexLabeling -> True], ImageSize -> 100], #] &;
GraphPlot[Rule @@@ jedges, VertexRenderingFunction -> vrfOuter,
EdgeRenderingFunction -> ({Red, Arrowheads[0], Arrow[#1, 0]} &),
ImageSize -> 500,
VertexCoordinateRules -> Thread[Thread[extremeBags -> extremePoses]]]
¿Alguna otra sugerencia para la visualización estéticamente agradable de las operaciones con gráficos son bienvenidos.
nunca logró un dimensionamiento de imagen consistente, no sólo con los gráficos, sino también cuando la superposición de imágenes y tramas. Espero que alguien sostenga la varita mágica y nos la preste ... –
Le están dando algunos gráficos muy bonitos. Cuando hayas terminado este proyecto en el que estás trabajando, ¿vas a lanzar un paquete para el resto de la plebe? – Simon
Por curiosidad, ¿por qué escribiste tu propia versión de 'Intersección'? – Simon