|
|
import pytest |
|
|
|
|
|
import networkx as nx |
|
|
|
|
|
|
|
|
def test_tikz_attributes(): |
|
|
G = nx.path_graph(4, create_using=nx.DiGraph) |
|
|
pos = {n: (n, n) for n in G} |
|
|
|
|
|
G.add_edge(0, 0) |
|
|
G.edges[(0, 0)]["label"] = "Loop" |
|
|
G.edges[(0, 0)]["label_options"] = "midway" |
|
|
|
|
|
G.nodes[0]["style"] = "blue" |
|
|
G.nodes[1]["style"] = "line width=3,draw" |
|
|
G.nodes[2]["style"] = "circle,draw,blue!50" |
|
|
G.nodes[3]["label"] = "Stop" |
|
|
G.edges[(0, 1)]["label"] = "1st Step" |
|
|
G.edges[(0, 1)]["label_options"] = "near end" |
|
|
G.edges[(2, 3)]["label"] = "3rd Step" |
|
|
G.edges[(2, 3)]["label_options"] = "near start" |
|
|
G.edges[(2, 3)]["style"] = "bend left,green" |
|
|
G.edges[(1, 2)]["label"] = "2nd" |
|
|
G.edges[(1, 2)]["label_options"] = "pos=0.5" |
|
|
G.edges[(1, 2)]["style"] = ">->,bend right,line width=3,green!90" |
|
|
|
|
|
output_tex = nx.to_latex( |
|
|
G, |
|
|
pos=pos, |
|
|
as_document=False, |
|
|
tikz_options="[scale=3]", |
|
|
node_options="style", |
|
|
edge_options="style", |
|
|
node_label="label", |
|
|
edge_label="label", |
|
|
edge_label_options="label_options", |
|
|
) |
|
|
expected_tex = r"""\begin{figure} |
|
|
\begin{tikzpicture}[scale=3] |
|
|
\draw |
|
|
(0, 0) node[blue] (0){0} |
|
|
(1, 1) node[line width=3,draw] (1){1} |
|
|
(2, 2) node[circle,draw,blue!50] (2){2} |
|
|
(3, 3) node (3){Stop}; |
|
|
\begin{scope}[->] |
|
|
\draw (0) to node[near end] {1st Step} (1); |
|
|
\draw[loop,] (0) to node[midway] {Loop} (0); |
|
|
\draw[>->,bend right,line width=3,green!90] (1) to node[pos=0.5] {2nd} (2); |
|
|
\draw[bend left,green] (2) to node[near start] {3rd Step} (3); |
|
|
\end{scope} |
|
|
\end{tikzpicture} |
|
|
\end{figure}""" |
|
|
|
|
|
assert output_tex == expected_tex |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_basic_multiple_graphs(): |
|
|
H1 = nx.path_graph(4) |
|
|
H2 = nx.complete_graph(4) |
|
|
H3 = nx.path_graph(8) |
|
|
H4 = nx.complete_graph(8) |
|
|
captions = [ |
|
|
"Path on 4 nodes", |
|
|
"Complete graph on 4 nodes", |
|
|
"Path on 8 nodes", |
|
|
"Complete graph on 8 nodes", |
|
|
] |
|
|
labels = ["fig2a", "fig2b", "fig2c", "fig2d"] |
|
|
latex_code = nx.to_latex( |
|
|
[H1, H2, H3, H4], |
|
|
n_rows=2, |
|
|
sub_captions=captions, |
|
|
sub_labels=labels, |
|
|
) |
|
|
|
|
|
assert "begin{document}" in latex_code |
|
|
assert "begin{figure}" in latex_code |
|
|
assert latex_code.count("begin{subfigure}") == 4 |
|
|
assert latex_code.count("tikzpicture") == 8 |
|
|
assert latex_code.count("[-]") == 4 |
|
|
|
|
|
|
|
|
def test_basic_tikz(): |
|
|
expected_tex = r"""\documentclass{report} |
|
|
\usepackage{tikz} |
|
|
\usepackage{subcaption} |
|
|
|
|
|
\begin{document} |
|
|
\begin{figure} |
|
|
\begin{subfigure}{0.5\textwidth} |
|
|
\begin{tikzpicture}[scale=2] |
|
|
\draw[gray!90] |
|
|
(0.749, 0.702) node[red!90] (0){0} |
|
|
(1.0, -0.014) node[red!90] (1){1} |
|
|
(-0.777, -0.705) node (2){2} |
|
|
(-0.984, 0.042) node (3){3} |
|
|
(-0.028, 0.375) node[cyan!90] (4){4} |
|
|
(-0.412, 0.888) node (5){5} |
|
|
(0.448, -0.856) node (6){6} |
|
|
(0.003, -0.431) node[cyan!90] (7){7}; |
|
|
\begin{scope}[->,gray!90] |
|
|
\draw (0) to (4); |
|
|
\draw (0) to (5); |
|
|
\draw (0) to (6); |
|
|
\draw (0) to (7); |
|
|
\draw (1) to (4); |
|
|
\draw (1) to (5); |
|
|
\draw (1) to (6); |
|
|
\draw (1) to (7); |
|
|
\draw (2) to (4); |
|
|
\draw (2) to (5); |
|
|
\draw (2) to (6); |
|
|
\draw (2) to (7); |
|
|
\draw (3) to (4); |
|
|
\draw (3) to (5); |
|
|
\draw (3) to (6); |
|
|
\draw (3) to (7); |
|
|
\end{scope} |
|
|
\end{tikzpicture} |
|
|
\caption{My tikz number 1 of 2}\label{tikz_1_2} |
|
|
\end{subfigure} |
|
|
\begin{subfigure}{0.5\textwidth} |
|
|
\begin{tikzpicture}[scale=2] |
|
|
\draw[gray!90] |
|
|
(0.749, 0.702) node[green!90] (0){0} |
|
|
(1.0, -0.014) node[green!90] (1){1} |
|
|
(-0.777, -0.705) node (2){2} |
|
|
(-0.984, 0.042) node (3){3} |
|
|
(-0.028, 0.375) node[purple!90] (4){4} |
|
|
(-0.412, 0.888) node (5){5} |
|
|
(0.448, -0.856) node (6){6} |
|
|
(0.003, -0.431) node[purple!90] (7){7}; |
|
|
\begin{scope}[->,gray!90] |
|
|
\draw (0) to (4); |
|
|
\draw (0) to (5); |
|
|
\draw (0) to (6); |
|
|
\draw (0) to (7); |
|
|
\draw (1) to (4); |
|
|
\draw (1) to (5); |
|
|
\draw (1) to (6); |
|
|
\draw (1) to (7); |
|
|
\draw (2) to (4); |
|
|
\draw (2) to (5); |
|
|
\draw (2) to (6); |
|
|
\draw (2) to (7); |
|
|
\draw (3) to (4); |
|
|
\draw (3) to (5); |
|
|
\draw (3) to (6); |
|
|
\draw (3) to (7); |
|
|
\end{scope} |
|
|
\end{tikzpicture} |
|
|
\caption{My tikz number 2 of 2}\label{tikz_2_2} |
|
|
\end{subfigure} |
|
|
\caption{A graph generated with python and latex.} |
|
|
\end{figure} |
|
|
\end{document}""" |
|
|
|
|
|
edges = [ |
|
|
(0, 4), |
|
|
(0, 5), |
|
|
(0, 6), |
|
|
(0, 7), |
|
|
(1, 4), |
|
|
(1, 5), |
|
|
(1, 6), |
|
|
(1, 7), |
|
|
(2, 4), |
|
|
(2, 5), |
|
|
(2, 6), |
|
|
(2, 7), |
|
|
(3, 4), |
|
|
(3, 5), |
|
|
(3, 6), |
|
|
(3, 7), |
|
|
] |
|
|
G = nx.DiGraph() |
|
|
G.add_nodes_from(range(8)) |
|
|
G.add_edges_from(edges) |
|
|
pos = { |
|
|
0: (0.7490296171687696, 0.702353520257394), |
|
|
1: (1.0, -0.014221357723796535), |
|
|
2: (-0.7765783344161441, -0.7054170966808919), |
|
|
3: (-0.9842690223417624, 0.04177547602465483), |
|
|
4: (-0.02768523817180917, 0.3745724439551441), |
|
|
5: (-0.41154855146767433, 0.8880106515525136), |
|
|
6: (0.44780153389148264, -0.8561492709269164), |
|
|
7: (0.0032499953371383505, -0.43092436645809945), |
|
|
} |
|
|
|
|
|
rc_node_color = {0: "red!90", 1: "red!90", 4: "cyan!90", 7: "cyan!90"} |
|
|
gp_node_color = {0: "green!90", 1: "green!90", 4: "purple!90", 7: "purple!90"} |
|
|
|
|
|
H = G.copy() |
|
|
nx.set_node_attributes(G, rc_node_color, "color") |
|
|
nx.set_node_attributes(H, gp_node_color, "color") |
|
|
|
|
|
sub_captions = ["My tikz number 1 of 2", "My tikz number 2 of 2"] |
|
|
sub_labels = ["tikz_1_2", "tikz_2_2"] |
|
|
|
|
|
output_tex = nx.to_latex( |
|
|
[G, H], |
|
|
[pos, pos], |
|
|
tikz_options="[scale=2]", |
|
|
default_node_options="gray!90", |
|
|
default_edge_options="gray!90", |
|
|
node_options="color", |
|
|
sub_captions=sub_captions, |
|
|
sub_labels=sub_labels, |
|
|
caption="A graph generated with python and latex.", |
|
|
n_rows=2, |
|
|
as_document=True, |
|
|
) |
|
|
|
|
|
assert output_tex == expected_tex |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_exception_pos_single_graph(to_latex=nx.to_latex): |
|
|
|
|
|
G = nx.path_graph(4) |
|
|
to_latex(G, pos="pos") |
|
|
|
|
|
|
|
|
pos = {0: (1, 2), 1: (0, 1), 2: (2, 1)} |
|
|
with pytest.raises(nx.NetworkXError): |
|
|
to_latex(G, pos) |
|
|
|
|
|
|
|
|
pos[3] = (1, 2, 3) |
|
|
with pytest.raises(nx.NetworkXError): |
|
|
to_latex(G, pos) |
|
|
pos[3] = 2 |
|
|
with pytest.raises(nx.NetworkXError): |
|
|
to_latex(G, pos) |
|
|
|
|
|
|
|
|
pos[3] = (3, 2) |
|
|
to_latex(G, pos) |
|
|
|
|
|
|
|
|
def test_exception_multiple_graphs(to_latex=nx.to_latex): |
|
|
G = nx.path_graph(3) |
|
|
pos_bad = {0: (1, 2), 1: (0, 1)} |
|
|
pos_OK = {0: (1, 2), 1: (0, 1), 2: (2, 1)} |
|
|
fourG = [G, G, G, G] |
|
|
fourpos = [pos_OK, pos_OK, pos_OK, pos_OK] |
|
|
|
|
|
|
|
|
to_latex(fourG, pos_OK) |
|
|
with pytest.raises(nx.NetworkXError): |
|
|
to_latex(fourG, pos_bad) |
|
|
|
|
|
|
|
|
to_latex(fourG, fourpos) |
|
|
with pytest.raises(nx.NetworkXError): |
|
|
to_latex(fourG, [pos_bad, pos_bad, pos_bad, pos_bad]) |
|
|
|
|
|
|
|
|
with pytest.raises(nx.NetworkXError): |
|
|
to_latex(fourG, [pos_OK, pos_OK, pos_bad, pos_OK]) |
|
|
|
|
|
|
|
|
with pytest.raises(nx.NetworkXError): |
|
|
to_latex(fourG, fourpos, sub_captions=["hi", "hi"]) |
|
|
|
|
|
with pytest.raises(nx.NetworkXError): |
|
|
to_latex(fourG, fourpos, sub_labels=["hi", "hi"]) |
|
|
|
|
|
|
|
|
to_latex(fourG, fourpos, sub_captions=["hi"] * 4, sub_labels=["lbl"] * 4) |
|
|
|
|
|
|
|
|
def test_exception_multigraph(): |
|
|
G = nx.path_graph(4, create_using=nx.MultiGraph) |
|
|
G.add_edge(1, 2) |
|
|
with pytest.raises(nx.NetworkXNotImplemented): |
|
|
nx.to_latex(G) |
|
|
|