from io import BytesIO from igraph.configuration import Configuration from igraph.drawing.colors import Palette, palettes from igraph.drawing.graph import DefaultGraphDrawer, MatplotlibGraphDrawer from igraph.drawing.utils import ( BoundingBox, Point, Rectangle, find_cairo, find_matplotlib, ) from igraph.utils import _is_running_in_ipython, named_temporary_file __all__ = ("BoundingBox", "DefaultGraphDrawer", "Plot", "Point", "Rectangle", "plot") cairo = find_cairo() ##################################################################### class Plot: """Class representing an arbitrary plot Every plot has an associated surface object where the plotting is done. The surface is an instance of C{cairo.Surface}, a member of the C{pycairo} library. The surface itself provides a unified API to various plotting targets like SVG files, X11 windows, PostScript files, PNG files and so on. C{igraph} usually does not know on which surface it is plotting right now, since C{pycairo} takes care of the actual drawing. Everything that's supported by C{pycairo} should be supported by this class as well.
def test(): """Testing routine for L{TextDrawer}""" import math from igraph.drawing.utils import find_cairo cairo = find_cairo() text = "The quick brown fox\njumps over a\nlazy dog" width, height = (600, 1000) surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height) context = cairo.Context(surface) drawer = TextDrawer(context, text) context.set_source_rgb(1, 1, 1) context.set_font_size(16.0) context.rectangle(0, 0, width, height) context.fill() context.set_source_rgb(0.5, 0.5, 0.5) for i in range(200, width, 200): context.move_to(i, 0) context.line_to(i, height) context.stroke() for i in range(200, height, 200): context.move_to(0, i) context.line_to(width, i) context.stroke() context.set_source_rgb(0.75, 0.75, 0.75) context.set_line_width(0.5) for i in range(100, width, 200): context.move_to(i, 0) context.line_to(i, height) context.stroke() for i in range(100, height, 200): context.move_to(0, i) context.line_to(width, i) context.stroke() def mark_point(red, green, blue): """Marks the current point on the canvas by the given color""" x, y = context.get_current_point() context.set_source_rgba(red, green, blue, 0.5) context.arc(x, y, 4, 0, 2 * math.pi) context.fill() # Testing drawer.draw_at() for i, halign in enumerate(("left", "center", "right")): # Mark the reference points context.move_to(i * 200, 40) mark_point(0, 0, 1) context.move_to(i * 200, 140) mark_point(0, 0, 1) # Draw the text context.set_source_rgb(0, 0, 0) drawer.halign = halign drawer.draw_at(i * 200, 40) drawer.draw_at(i * 200, 140, width=200) # Mark the new reference point mark_point(1, 0, 0) # Testing TextDrawer.draw() for i, halign in enumerate(("left", "center", "right")): for j, valign in enumerate(("top", "center", "bottom")): # Draw the text context.set_source_rgb(0, 0, 0) drawer.halign = halign drawer.valign = valign drawer.bbox = (i * 200, j * 200 + 200, i * 200 + 200, j * 200 + 400) drawer.draw() # Mark the new reference point mark_point(1, 0, 0) # Testing TextDrawer.wrap() drawer.text = ( "Jackdaws love my big sphinx of quartz. Yay, wrapping! " + "Jackdaws love my big sphinx of quartz.\n\n" + "Jackdaws love my big sphinx of quartz." ) drawer.valign = TextDrawer.TOP for i, halign in enumerate(("left", "center", "right")): context.move_to(i * 200, 840) # Mark the reference point mark_point(0, 0, 1) # Draw the text context.set_source_rgb(0, 0, 0) drawer.halign = halign drawer.draw_at(i * 200, 840, width=199, wrap=True) # Mark the new reference point mark_point(1, 0, 0) surface.write_to_png("test.png")
Drawers for various edge styles in graph plots. """ __all__ = ["AbstractEdgeDrawer", "AlphaVaryingEdgeDrawer", "ArrowEdgeDrawer", "DarkToLightEdgeDrawer", "LightToDarkEdgeDrawer", "TaperedEdgeDrawer"] __license__ = "GPL" from igraph.drawing.colors import clamp from igraph.drawing.metamagic import AttributeCollectorBase from igraph.drawing.text import TextAlignment from igraph.drawing.utils import find_cairo from math import atan2, cos, pi, sin, sqrt cairo = find_cairo() class AbstractEdgeDrawer(object): """Abstract edge drawer object from which all concrete edge drawer implementations are derived.""" def __init__(self, context, palette): """Constructs the edge drawer. @param context: a Cairo context on which the edges will be drawn. @param palette: the palette that can be used to map integer color indices to colors when drawing edges """ self.context = context self.palette = palette self.VisualEdgeBuilder = self._construct_visual_edge_builder()
def test(): """Testing routine for L{TextDrawer}""" import math from igraph.drawing.utils import find_cairo cairo = find_cairo() text = "The quick brown fox\njumps over a\nlazy dog" width, height = (600, 1000) surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height) context = cairo.Context(surface) drawer = TextDrawer(context, text) context.set_source_rgb(1, 1, 1) context.set_font_size(16.) context.rectangle(0, 0, width, height) context.fill() context.set_source_rgb(0.5, 0.5, 0.5) for i in range(200, width, 200): context.move_to(i, 0) context.line_to(i, height) context.stroke() for i in range(200, height, 200): context.move_to(0, i) context.line_to(width, i) context.stroke() context.set_source_rgb(0.75, 0.75, 0.75) context.set_line_width(0.5) for i in range(100, width, 200): context.move_to(i, 0) context.line_to(i, height) context.stroke() for i in range(100, height, 200): context.move_to(0, i) context.line_to(width, i) context.stroke() def mark_point(red, green, blue): """Marks the current point on the canvas by the given color""" x, y = context.get_current_point() context.set_source_rgba(red, green, blue, 0.5) context.arc(x, y, 4, 0, 2 * math.pi) context.fill() # Testing drawer.draw_at() for i, halign in enumerate(("left", "center", "right")): # Mark the reference points context.move_to(i * 200, 40) mark_point(0, 0, 1) context.move_to(i * 200, 140) mark_point(0, 0, 1) # Draw the text context.set_source_rgb(0, 0, 0) drawer.halign = halign drawer.draw_at(i * 200, 40) drawer.draw_at(i * 200, 140, width=200) # Mark the new reference point mark_point(1, 0, 0) # Testing TextDrawer.draw() for i, halign in enumerate(("left", "center", "right")): for j, valign in enumerate(("top", "center", "bottom")): # Draw the text context.set_source_rgb(0, 0, 0) drawer.halign = halign drawer.valign = valign drawer.bbox = (i*200, j*200+200, i*200+200, j*200+400) drawer.draw() # Mark the new reference point mark_point(1, 0, 0) # Testing TextDrawer.wrap() drawer.text = "Jackdaws love my big sphinx of quartz. Yay, wrapping! " + \ "Jackdaws love my big sphinx of quartz.\n\n" + \ "Jackdaws love my big sphinx of quartz." drawer.valign = TextDrawer.TOP for i, halign in enumerate(("left", "center", "right")): context.move_to(i * 200, 840) # Mark the reference point mark_point(0, 0, 1) # Draw the text context.set_source_rgb(0, 0, 0) drawer.halign = halign drawer.draw_at(i * 200, 840, width=199, wrap=True) # Mark the new reference point mark_point(1, 0, 0) surface.write_to_png("test.png")