本文整理汇总了Python中sage.graphs.graph.Graph.set_pos方法的典型用法代码示例。如果您正苦于以下问题:Python Graph.set_pos方法的具体用法?Python Graph.set_pos怎么用?Python Graph.set_pos使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类sage.graphs.graph.Graph
的用法示例。
在下文中一共展示了Graph.set_pos方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: make_graph
# 需要导入模块: from sage.graphs.graph import Graph [as 别名]
# 或者: from sage.graphs.graph.Graph import set_pos [as 别名]
def make_graph(M):
"""
Code extracted from Sage's elliptic curve isogeny class (reshaped
in the case maxdegree==12)
"""
from sage.schemes.elliptic_curves.ell_curve_isogeny import fill_isogeny_matrix, unfill_isogeny_matrix
from sage.graphs.graph import Graph
n = M.nrows() # = M.ncols()
G = Graph(unfill_isogeny_matrix(M), format='weighted_adjacency_matrix')
MM = fill_isogeny_matrix(M)
# The maximum degree classifies the shape of the isogeny
# graph, though the number of vertices is often enough.
# This only holds over Q, so this code will need to change
# once other isogeny classes are implemented.
if n == 1:
# one vertex
pass
elif n == 2:
# one edge, two vertices. We align horizontally and put
# the lower number on the left vertex.
G.set_pos(pos={0:[-0.5,0],1:[0.5,0]})
else:
maxdegree = max(max(MM))
if n == 3:
# o--o--o
centervert = [i for i in range(3) if max(MM.row(i)) < maxdegree][0]
other = [i for i in range(3) if i != centervert]
G.set_pos(pos={centervert:[0,0],other[0]:[-1,0],other[1]:[1,0]})
elif maxdegree == 4:
# o--o<8
centervert = [i for i in range(4) if max(MM.row(i)) < maxdegree][0]
other = [i for i in range(4) if i != centervert]
G.set_pos(pos={centervert:[0,0],other[0]:[0,1],other[1]:[-0.8660254,-0.5],other[2]:[0.8660254,-0.5]})
elif maxdegree == 27:
# o--o--o--o
centers = [i for i in range(4) if list(MM.row(i)).count(3) == 2]
left = [j for j in range(4) if MM[centers[0],j] == 3 and j not in centers][0]
right = [j for j in range(4) if MM[centers[1],j] == 3 and j not in centers][0]
G.set_pos(pos={left:[-1.5,0],centers[0]:[-0.5,0],centers[1]:[0.5,0],right:[1.5,0]})
elif n == 4:
# square
opp = [i for i in range(1,4) if not MM[0,i].is_prime()][0]
other = [i for i in range(1,4) if i != opp]
G.set_pos(pos={0:[1,1],other[0]:[-1,1],opp:[-1,-1],other[1]:[1,-1]})
elif maxdegree == 8:
# 8>o--o<8
centers = [i for i in range(6) if list(MM.row(i)).count(2) == 3]
left = [j for j in range(6) if MM[centers[0],j] == 2 and j not in centers]
right = [j for j in range(6) if MM[centers[1],j] == 2 and j not in centers]
G.set_pos(pos={centers[0]:[-0.5,0],left[0]:[-1,0.8660254],left[1]:[-1,-0.8660254],centers[1]:[0.5,0],right[0]:[1,0.8660254],right[1]:[1,-0.8660254]})
elif maxdegree == 18:
# two squares joined on an edge
centers = [i for i in range(6) if list(MM.row(i)).count(3) == 2]
top = [j for j in range(6) if MM[centers[0],j] == 3]
bl = [j for j in range(6) if MM[top[0],j] == 2][0]
br = [j for j in range(6) if MM[top[1],j] == 2][0]
G.set_pos(pos={centers[0]:[0,0.5],centers[1]:[0,-0.5],top[0]:[-1,0.5],top[1]:[1,0.5],bl:[-1,-0.5],br:[1,-0.5]})
elif maxdegree == 16:
# tree from bottom, 3 regular except for the leaves.
centers = [i for i in range(8) if list(MM.row(i)).count(2) == 3]
center = [i for i in centers if len([j for j in centers if MM[i,j] == 2]) == 2][0]
centers.remove(center)
bottom = [j for j in range(8) if MM[center,j] == 2 and j not in centers][0]
left = [j for j in range(8) if MM[centers[0],j] == 2 and j != center]
right = [j for j in range(8) if MM[centers[1],j] == 2 and j != center]
G.set_pos(pos={center:[0,0],bottom:[0,-1],centers[0]:[-0.8660254,0.5],centers[1]:[0.8660254,0.5],left[0]:[-0.8660254,1.5],right[0]:[0.8660254,1.5],left[1]:[-1.7320508,0],right[1]:[1.7320508,0]})
elif maxdegree == 12:
# tent
centers = [i for i in range(8) if list(MM.row(i)).count(2) == 3]
left = [j for j in range(8) if MM[centers[0],j] == 2]
right = []
for i in range(3):
right.append([j for j in range(8) if MM[centers[1],j] == 2 and MM[left[i],j] == 3][0])
G.set_pos(pos={centers[0]:[-0.3,0],centers[1]:[0.3,0],
left[0]:[-0.14,0.15], right[0]:[0.14,0.15],
left[1]:[-0.14,-0.15],right[1]:[0.14,-0.15],
left[2]:[-0.14,-0.3],right[2]:[0.14,-0.3]})
G.relabel(range(1,n+1))
return G
示例2: RandomBipartite
# 需要导入模块: from sage.graphs.graph import Graph [as 别名]
# 或者: from sage.graphs.graph.Graph import set_pos [as 别名]
def RandomBipartite(n1,n2, p):
r"""
Returns a bipartite graph with `n1+n2` vertices
such that any edge from `[n1]` to `[n2]` exists
with probability `p`.
INPUT:
- ``n1,n2`` : Cardinalities of the two sets
- ``p`` : Probability for an edge to exist
EXAMPLE::
sage: g=graphs.RandomBipartite(5,2,0.5)
sage: g.vertices()
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1)]
TESTS::
sage: g=graphs.RandomBipartite(5,-3,0.5)
Traceback (most recent call last):
...
ValueError: n1 and n2 should be integers strictly greater than 0
sage: g=graphs.RandomBipartite(5,3,1.5)
Traceback (most recent call last):
...
ValueError: Parameter p is a probability, and so should be a real value between 0 and 1
Trac ticket #12155::
sage: graphs.RandomBipartite(5,6,.2).complement()
complement(Random bipartite graph of size 5+6 with edge probability 0.200000000000000): Graph on 11 vertices
"""
if not (p>=0 and p<=1):
raise ValueError, "Parameter p is a probability, and so should be a real value between 0 and 1"
if not (n1>0 and n2>0):
raise ValueError, "n1 and n2 should be integers strictly greater than 0"
from numpy.random import uniform
g=Graph(name="Random bipartite graph of size "+str(n1) +"+"+str(n2)+" with edge probability "+str(p))
S1=[(0,i) for i in range(n1)]
S2=[(1,i) for i in range(n2)]
g.add_vertices(S1)
g.add_vertices(S2)
for w in range(n2):
for v in range(n1):
if uniform()<=p :
g.add_edge((0,v),(1,w))
pos = {}
for i in range(n1):
pos[(0,i)] = (0, i/(n1-1.0))
for i in range(n2):
pos[(1,i)] = (1, i/(n2-1.0))
g.set_pos(pos)
return g
示例3: graph
# 需要导入模块: from sage.graphs.graph import Graph [as 别名]
# 或者: from sage.graphs.graph.Graph import set_pos [as 别名]
def graph(self):
"""
Returns a graph whose vertices correspond to curves in this class, and whose edges correspond to prime degree isogenies.
.. note:
There are only finitely many possible isogeny graphs for
curves over Q [M78]. This function tries to lay out the graph
nicely by special casing each isogeny graph.
.. note:
The vertices are labeled 1 to n rather than 0 to n-1 to
correspond to LMFDB and Cremona labels.
EXAMPLES::
sage: isocls = EllipticCurve('15a3').isogeny_class(use_tuple=False)
sage: G = isocls.graph()
sage: sorted(G._pos.items())
[(1, [-0.8660254, 0.5]), (2, [-0.8660254, 1.5]), (3, [-1.7320508, 0]), (4, [0, 0]), (5, [0, -1]), (6, [0.8660254, 0.5]), (7, [0.8660254, 1.5]), (8, [1.7320508, 0])]
REFERENCES:
.. [M78] B. Mazur. Rational Isogenies of Prime Degree.
*Inventiones mathematicae* 44,129-162 (1978).
"""
from sage.graphs.graph import Graph
M = self.matrix(fill = False)
n = M.nrows() # = M.ncols()
G = Graph(M, format='weighted_adjacency_matrix')
N = self.matrix(fill = True)
D = dict([(v,self.curves[v]) for v in G.vertices()])
# The maximum degree classifies the shape of the isogeny
# graph, though the number of vertices is often enough.
# This only holds over Q, so this code will need to change
# once other isogeny classes are implemented.
if n == 1:
# one vertex
pass
elif n == 2:
# one edge, two vertices. We align horizontally and put
# the lower number on the left vertex.
G.set_pos(pos={0:[-0.5,0],1:[0.5,0]})
else:
maxdegree = max(max(N))
if n == 3:
# o--o--o
centervert = [i for i in range(3) if max(N.row(i)) < maxdegree][0]
other = [i for i in range(3) if i != centervert]
G.set_pos(pos={centervert:[0,0],other[0]:[-1,0],other[1]:[1,0]})
elif maxdegree == 4:
# o--o<8
centervert = [i for i in range(4) if max(N.row(i)) < maxdegree][0]
other = [i for i in range(4) if i != centervert]
G.set_pos(pos={centervert:[0,0],other[0]:[0,1],other[1]:[-0.8660254,-0.5],other[2]:[0.8660254,-0.5]})
elif maxdegree == 27:
# o--o--o--o
centers = [i for i in range(4) if list(N.row(i)).count(3) == 2]
left = [j for j in range(4) if N[centers[0],j] == 3 and j not in centers][0]
right = [j for j in range(4) if N[centers[1],j] == 3 and j not in centers][0]
G.set_pos(pos={left:[-1.5,0],centers[0]:[-0.5,0],centers[1]:[0.5,0],right:[1.5,0]})
elif n == 4:
# square
opp = [i for i in range(1,4) if not N[0,i].is_prime()][0]
other = [i for i in range(1,4) if i != opp]
G.set_pos(pos={0:[1,1],other[0]:[-1,1],opp:[-1,-1],other[1]:[1,-1]})
elif maxdegree == 8:
# 8>o--o<8
centers = [i for i in range(6) if list(N.row(i)).count(2) == 3]
left = [j for j in range(6) if N[centers[0],j] == 2 and j not in centers]
right = [j for j in range(6) if N[centers[1],j] == 2 and j not in centers]
G.set_pos(pos={centers[0]:[-0.5,0],left[0]:[-1,0.8660254],left[1]:[-1,-0.8660254],centers[1]:[0.5,0],right[0]:[1,0.8660254],right[1]:[1,-0.8660254]})
elif maxdegree == 18:
# two squares joined on an edge
centers = [i for i in range(6) if list(N.row(i)).count(3) == 2]
top = [j for j in range(6) if N[centers[0],j] == 3]
bl = [j for j in range(6) if N[top[0],j] == 2][0]
br = [j for j in range(6) if N[top[1],j] == 2][0]
G.set_pos(pos={centers[0]:[0,0.5],centers[1]:[0,-0.5],top[0]:[-1,0.5],top[1]:[1,0.5],bl:[-1,-0.5],br:[1,-0.5]})
elif maxdegree == 16:
# tree from bottom, 3 regular except for the leaves.
centers = [i for i in range(8) if list(N.row(i)).count(2) == 3]
center = [i for i in centers if len([j for j in centers if N[i,j] == 2]) == 2][0]
centers.remove(center)
bottom = [j for j in range(8) if N[center,j] == 2 and j not in centers][0]
left = [j for j in range(8) if N[centers[0],j] == 2 and j != center]
right = [j for j in range(8) if N[centers[1],j] == 2 and j != center]
G.set_pos(pos={center:[0,0],bottom:[0,-1],centers[0]:[-0.8660254,0.5],centers[1]:[0.8660254,0.5],left[0]:[-0.8660254,1.5],right[0]:[0.8660254,1.5],left[1]:[-1.7320508,0],right[1]:[1.7320508,0]})
elif maxdegree == 12:
# tent
centers = [i for i in range(8) if list(N.row(i)).count(2) == 3]
left = [j for j in range(8) if N[centers[0],j] == 2]
right = []
for i in range(3):
right.append([j for j in range(8) if N[centers[1],j] == 2 and N[left[i],j] == 3][0])
G.set_pos(pos={centers[0]:[-0.75,0],centers[1]:[0.75,0],left[0]:[-0.75,1],right[0]:[0.75,1],left[1]:[-1.25,-0.75],right[1]:[0.25,-0.75],left[2]:[-0.25,-0.25],right[2]:[1.25,-0.25]})
G.set_vertices(D)
G.relabel(range(1,n+1))
return G
示例4: CompleteMultipartiteGraph
# 需要导入模块: from sage.graphs.graph import Graph [as 别名]
# 或者: from sage.graphs.graph.Graph import set_pos [as 别名]
def CompleteMultipartiteGraph(l):
r"""
Returns a complete multipartite graph.
INPUT:
- ``l`` -- a list of integers : the respective sizes
of the components.
EXAMPLE:
A complete tripartite graph with sets of sizes
`5, 6, 8`::
sage: g = graphs.CompleteMultipartiteGraph([5, 6, 8]); g
Multipartite Graph with set sizes [5, 6, 8]: Graph on 19 vertices
It clearly has a chromatic number of 3::
sage: g.chromatic_number()
3
"""
n = sum(l) #getting the number of vertices
r = len(l) #getting the number of partitions
positions = {}
if r > 2: #position code gives bad results on bipartite or isolated graphs
'''
Produce a layout of the vertices so that vertices in the same
vertex set are adjecent and clearly separated from vertices in other
vertex sets.
This is done by calculating the vertices of an r-gon then
calculating the slope between adjacent vertices. We then 'walk'
around the r-gon placing graph vertices in regular intervals between
adjacent vertices of the r-gon.
Makes a nicely organized graph like in this picture:
https://commons.wikimedia.org/wiki/File:Turan_13-4.svg
'''
points = [[cos(2*pi*i/r),sin(2*pi*i/r)] for i in range(r)]
slopes = [[(points[(i+1)%r][0]-points[i%r][0]),
(points[(i+1)%r][1]-points[i%r][1])] for i in range(r)]
counter = 0
for i in range(len(l)):
vertex_set_size = l[i]+1
for j in range(1,vertex_set_size):
x = points[i][0]+slopes[i][0]*j/(vertex_set_size)
y = points[i][1]+slopes[i][1]*j/(vertex_set_size)
positions[counter] = (x,y)
counter += 1
g = Graph()
for i in l:
g = g + CompleteGraph(i)
g = g.complement()
g.set_pos(positions)
g.name("Multipartite Graph with set sizes "+str(l))
return g
示例5: CycleGraph
# 需要导入模块: from sage.graphs.graph import Graph [as 别名]
# 或者: from sage.graphs.graph.Graph import set_pos [as 别名]
def CycleGraph(n):
r"""
Return a cycle graph with n nodes.
A cycle graph is a basic structure which is also typically called an
`n`-gon.
PLOTTING: Upon construction, the position dictionary is filled to override
the spring-layout algorithm. By convention, each cycle graph will be
displayed with the first (0) node at the top, with the rest following in a
counterclockwise manner.
The cycle graph is a good opportunity to compare efficiency of filling a
position dictionary vs. using the spring-layout algorithm for
plotting. Because the cycle graph is very symmetric, the resulting plots
should be similar (in cases of small `n`).
Filling the position dictionary in advance adds `O(n)` to the constructor.
EXAMPLES: Compare plotting using the predefined layout and networkx::
sage: import networkx
sage: n = networkx.cycle_graph(23)
sage: spring23 = Graph(n)
sage: posdict23 = graphs.CycleGraph(23)
sage: spring23.show() # long time
sage: posdict23.show() # long time
We next view many cycle graphs as a Sage graphics array. First we use the
``CycleGraph`` constructor, which fills in the position dictionary::
sage: g = []
sage: j = []
sage: for i in range(9):
....: k = graphs.CycleGraph(i+3)
....: g.append(k)
sage: for i in range(3):
....: n = []
....: for m in range(3):
....: n.append(g[3*i + m].plot(vertex_size=50, vertex_labels=False))
....: j.append(n)
sage: G = sage.plot.graphics.GraphicsArray(j)
sage: G.show() # long time
Compare to plotting with the spring-layout algorithm::
sage: g = []
sage: j = []
sage: for i in range(9):
....: spr = networkx.cycle_graph(i+3)
....: k = Graph(spr)
....: g.append(k)
sage: for i in range(3):
....: n = []
....: for m in range(3):
....: n.append(g[3*i + m].plot(vertex_size=50, vertex_labels=False))
....: j.append(n)
sage: G = sage.plot.graphics.GraphicsArray(j)
sage: G.show() # long time
TESTS:
The input parameter must be a positive integer::
sage: G = graphs.CycleGraph(-1)
Traceback (most recent call last):
...
ValueError: parameter n must be a positive integer
"""
if n < 0:
raise ValueError("parameter n must be a positive integer")
G = Graph(n, name="Cycle graph")
if n == 1:
G.set_pos({0:(0, 0)})
else:
G._circle_embedding(list(range(n)), angle=pi/2)
G.add_cycle(list(range(n)))
return G
示例6: StarGraph
# 需要导入模块: from sage.graphs.graph import Graph [as 别名]
# 或者: from sage.graphs.graph.Graph import set_pos [as 别名]
def StarGraph(n):
r"""
Return a star graph with `n+1` nodes.
A Star graph is a basic structure where one node is connected to all other
nodes.
PLOTTING: Upon construction, the position dictionary is filled to override
the spring-layout algorithm. By convention, each star graph will be
displayed with the first (0) node in the center, the second node (1) at the
top, with the rest following in a counterclockwise manner. (0) is the node
connected to all other nodes.
The star graph is a good opportunity to compare efficiency of filling a
position dictionary vs. using the spring-layout algorithm for plotting. As
far as display, the spring-layout should push all other nodes away from the
(0) node, and thus look very similar to this constructor's positioning.
EXAMPLES::
sage: import networkx
Compare the plots::
sage: n = networkx.star_graph(23)
sage: spring23 = Graph(n)
sage: posdict23 = graphs.StarGraph(23)
sage: spring23.show() # long time
sage: posdict23.show() # long time
View many star graphs as a Sage Graphics Array
With this constructor (i.e., the position dictionary filled)
::
sage: g = []
sage: j = []
sage: for i in range(9):
....: k = graphs.StarGraph(i+3)
....: g.append(k)
sage: for i in range(3):
....: n = []
....: for m in range(3):
....: n.append(g[3*i + m].plot(vertex_size=50, vertex_labels=False))
....: j.append(n)
sage: G = sage.plot.graphics.GraphicsArray(j)
sage: G.show() # long time
Compared to plotting with the spring-layout algorithm
::
sage: g = []
sage: j = []
sage: for i in range(9):
....: spr = networkx.star_graph(i+3)
....: k = Graph(spr)
....: g.append(k)
sage: for i in range(3):
....: n = []
....: for m in range(3):
....: n.append(g[3*i + m].plot(vertex_size=50, vertex_labels=False))
....: j.append(n)
sage: G = sage.plot.graphics.GraphicsArray(j)
sage: G.show() # long time
"""
G = Graph({0: list(range(1, n + 1))}, name="Star graph")
G.set_pos({0:(0, 0)})
G._circle_embedding(list(range(1, n + 1)), angle=pi/2)
return G