Opened 3 years ago

Closed 3 years ago

#25120 closed defect (fixed)

dot2tex edge coloring is broken

Reported by: vdelecroix Owned by:
Priority: major Milestone: sage-8.2
Component: graphics Keywords: thursdaysbdx
Cc: slabbe, nthiery Merged in:
Authors: Vincent Delecroix Reviewers: Sébastien Labbé
Report Upstream: N/A Work issues:
Branch: b4176d5 (Commits) Commit: b4176d59c0c369e6ac246d05ed8b3377e9109e97
Dependencies: Stopgaps:


From the documentation

sage: sage.graphs.graph_latex.GraphLatex.set_option?
    - ``edge_colors`` -- a dictionary whose keys are edges of the
      graph and whose values are colors. 


sage: G = Graph([(0,1)])
sage: G.set_latex_options(format='dot2tex', edge_colors = {(0,1): 'red'})
sage: view(G)
AssertionError                            Traceback (most recent call last)
<ipython-input-46-e13ee6ead400> in <module>()
----> 1 view(G)

/opt/sage/local/lib/python2.7/site-packages/sage/misc/latex.pyc in view(objects, title, debug, sep, tiny, pdflatex, engine, viewer, tightpage, margin, mode, combine_all, **kwds)
   2201         latex_options = {}
-> 2203     s = _latex_file_(objects, title=title, sep=sep, tiny=tiny, debug=debug, **latex_options)
   2204     if engine is None:
   2205         engine = _Latex_prefs._option["engine"]

/opt/sage/local/lib/python2.7/site-packages/sage/misc/latex.pyc in _latex_file_(objects, title, debug, sep, tiny, math_left, math_right, extra_preamble)
   1767         for i in range(len(objects)):
   1768             x = objects[i]
-> 1769             L = latex(x)
   1770             if '\\begin{pgfpicture}' in L:
   1771                 # Resize the pgf figure to the text width if larger.

/opt/sage/local/lib/python2.7/site-packages/sage/misc/latex.pyc in __call__(self, x, combine_all)
    921         """
    922         if has_latex_attr(x):
--> 923             return LatexExpr(x._latex_())
    924         try:
    925             f = latex_table[type(x)]

/opt/sage/local/lib/python2.7/site-packages/sage/graphs/generic_graph.pyc in _latex_(self)
    768         setup_latex_preamble()
--> 770         return self.latex_options().latex()
    772     def _matrix_(self, R=None):

/opt/sage/local/lib/python2.7/site-packages/sage/graphs/graph_latex.pyc in latex(self)
   1302             return self.tkz_picture()
   1303         elif format == "dot2tex":
-> 1304             return self.dot2tex_picture()
   1306     def dot2tex_picture(self):

/opt/sage/local/lib/python2.7/site-packages/sage/graphs/graph_latex.pyc in dot2tex_picture(self)
   1356         options = self.__graphlatex_options.copy()
   1357         options.update(self._options)
-> 1358         dotdata = self._graph.graphviz_string(labels="latex", **options)
   1359         import dot2tex
   1360         return dot2tex.dot2tex(dotdata,
/opt/sage/local/lib/python2.7/site-packages/sage/misc/decorators.pyc in wrapper(*args, **kwds)
    562                 options['__original_opts'] = kwds
    563             options.update(kwds)
--> 564             return func(*args, **options)
    566         #Add the options specified by @options to the signature of the wrapped

/opt/sage/local/lib/python2.7/site-packages/sage/graphs/generic_graph.pyc in graphviz_string(self, **options)
  20705                 for edge in options['edge_colors'][color]:
  20706                     assert isinstance(edge, (list, tuple)) and len(edge) >= 2 and len(edge) <= 3,\
> 20707                         "%s is not a valid format for edge"%(edge)
  20708                     u = edge[0]
  20709                     v = edge[1]

AssertionError: r is not a valid format for edge

The confusion comes from the fact that the convention for edge_colors with .plot() is the reverse

sage: G.plot?
   * "edge_colors" - a dictionary specifying edge colors: each key
     is a color recognized by matplotlib, and each entry is a list of

So is the case for graphviz_string

sage: G.graphviz_string?
   * "edge_colors" -- (default: None) a dictionary whose keys are
     colors and values are list of edges. }

Change History (8)

comment:1 Changed 3 years ago by vdelecroix

  • Authors set to Vincent Delecroix
  • Branch set to u/vdelecroix/25120
  • Commit set to 11e8cb907259ab545d51dbd2589ef839ec279ada
  • Status changed from new to needs_review

Any better idea welcome!

New commits:

73b6846_invert_unit -> inverse_of_unit
11e8cb9dirty fix for edge colors with dot2tex

comment:2 Changed 3 years ago by git

  • Commit changed from 11e8cb907259ab545d51dbd2589ef839ec279ada to b4176d59c0c369e6ac246d05ed8b3377e9109e97

Branch pushed to git repo; I updated commit sha1. This was a forced push. New commits:

b4176d5dirty fix for edge colors with dot2tex

comment:3 Changed 3 years ago by nthiery

Hi Vincent,

Ouch, this clash of option format is annoying indeed. I went through the code and patch, and not sure what's the best way out. Especially since I am pretty sure there is code around using set_latex_options with edge_options already in the graphviz_string format.

I am available for a phone brainstorm this morning if you are available.

comment:4 Changed 3 years ago by slabbe

What if we rather change the documentation of sage.graphs.graph_latex.GraphLatex.set_option so that it takes a dict colors -> list of edges like the others. Then, this ticket would do some modification of the tkz_picture code to revert the dict the other way around?

This way, the dict edge_colors would always have the same form as input.

comment:5 Changed 3 years ago by vdelecroix

This clash of option was there and will remain after the ticket. I will not try to fix it. Would it be possible to review this ticket (which does fix an issue) without discussing the option clash?

comment:6 Changed 3 years ago by slabbe

Indeed, I realised soon after that my suggestion would have been backward incompatible.

Once stuff are in Sage we can not change their interface anymore. This is why I am keeping my TikzPicture in my personnal package for now, because I am still sometimes changing its interface.

To make sure all the test are tested in the file, I did:

sage -t --show-skipped --optional=dot2tex,sage,graphviz src/sage/graphs/

Thanks for digging this problem and fixing this issue. I may have stumble over this many years ago. But, once I realized that color_by_labels=True was working and I have always been using this way and forgot about the problem you are fixing.

comment:7 Changed 3 years ago by slabbe

  • Keywords thursdaysbdx added
  • Reviewers set to Sébastien Labbé
  • Status changed from needs_review to positive_review

comment:8 Changed 3 years ago by vbraun

  • Branch changed from u/vdelecroix/25120 to b4176d59c0c369e6ac246d05ed8b3377e9109e97
  • Resolution set to fixed
  • Status changed from positive_review to closed
Note: See TracTickets for help on using tickets.