Esempio n. 1
0
def main():
    # Create a random multiseries
    num_points = 10

    series_set = SeriesSet()
    for i in range(6):
        series_set.add_series(
            Series(
                "Series%s" % i,
                randomvalues(num_points),
                "#3366%2xff" % (50 * i),
                {
                    0: (i - 1) % 5,
                    5: 0
                },
            ))

    # Create the output
    output = FileOutput()

    # We'll have major lines every integer, and minor ones every half
    scale = SimpleScale(0, num_points - 1, 1)

    # OK, render that.
    wg = WaveGraph(series_set, scale, None, False)
    lb = Label("Test Graph", None)

    output.add_item(lb, x=10, y=5, width=490, height=20)
    output.add_item(wg, x=0, y=30, width=500, height=200)

    # Save the images
    output.write("svg", "random_wavegraph.svg")
    output.write("png", "random_wavegraph.png")
    output.write("pdf", "random_wavegraph.pdf")
Esempio n. 2
0
def graph_timeline_data(username):

    uh = UserHistory(username)
    uh.load_if_possible()

    series_set = SeriesSet()
    series_set.add_series(Series(
        "Plays",
        uh.week_plays(),
        "#369f",
        {0: 4},
    ))

    return series_set
Esempio n. 3
0
def graph_timeline_data(username):
    
    uh = UserHistory(username)
    uh.load_if_possible()
    
    series_set = SeriesSet()
    series_set.add_series(Series(
        "Plays",
        uh.week_plays(),
        "#369f",
        {0:4},
    ))
    
    return series_set
Esempio n. 4
0
def get_series(grouped):
  colour_loop = colorgen(
       ("#4D8963",
       "#69A583",
       "#E1B378",
       "#E0CC97",
       "#EC799A",
       "#9F0251")
  )
  series_set = SeriesSet()

  for (t, list) in grouped:
    data = dict([(datetime.strptime(k+'0', "%Y-%W%w") ,v) for k,v in list.iteritems()])
    series_set.add_series(Series(t, data, colour_loop.next()))

  return series_set
Esempio n. 5
0
def graph_artist(request, username, artist, width=800, height=300):

    ready_or_update(username)

    width = int(width)
    height = int(height)

    if not width:
        width = 800

    if not height:
        width = 300

    uh = UserHistory(username)
    uh.load_if_possible()

    series_set = SeriesSet()
    series_set.add_series(
        Series(
            artist,
            uh.artist_plays(artist),
            "#369f",
            {0: 4},
        ))

    # Create the output
    output = FileOutput(padding=0, style=artist_detail_white_css)

    try:
        scale = AutoWeekDateScale(series_set, short_labels=True, month_gap=2)
    except ValueError:
        raise Http404("Bad data (ValueError)")

    # OK, render that.
    wg = WaveGraph(series_set,
                   scale,
                   artist_detail_white_css,
                   False,
                   vertical_scale=True)
    output.add_item(wg, x=0, y=0, width=width, height=height)

    # Save the images
    return stream_graph(output)
Esempio n. 6
0
def main():
    series_set = SeriesSet()
    for i in range(3):
        series_set.add_series(
            Series("Series%s" % i, {0: random.randint(1, 100)},
                   colours[i % 3]))

    # Create the output
    output = FileOutput(padding=5)

    # OK, render that.
    dn = Doughnut(series_set, style)
    lb = Label("Test Graph", style)

    output.add_item(dn, x=0, y=0, width=300, height=300)

    # Save the images
    output.write("png", "dn.png")
    output.write("pdf", "dn.pdf")
Esempio n. 7
0
def graph_artist(request, username, artist, width=800, height=300):
    
    ready_or_update(username)
    
    width = int(width)
    height = int(height)
    
    if not width:
        width=800
    
    if not height:
        width=300
    
    uh = UserHistory(username)
    uh.load_if_possible()
    
    series_set = SeriesSet()
    series_set.add_series(Series(
        artist,
        uh.artist_plays(artist),
        "#369f",
        {0:4},
    ))
    
    # Create the output
    output = FileOutput(padding=0, style=artist_detail_white_css)
    
    try:
        scale = AutoWeekDateScale(series_set, short_labels=True, month_gap=2)
    except ValueError:
        raise Http404("Bad data (ValueError)")
    
    # OK, render that.
    wg = WaveGraph(series_set, scale, artist_detail_white_css, False, vertical_scale=True)
    output.add_item(wg, x=0, y=0, width=width, height=height)
    
    # Save the images
    return stream_graph(output)
Esempio n. 8
0
def main():
    artists = get_fake_lastfm_data().items()

    # Create the series set and throw in the artists

    series_set = SeriesSet()
    for artist, plays in artists:
        series_set.add_series(Series(
            artist,
            dict(plays),
        ))

    # Initialise our style
    style = css.CssStylesheet.from_css(
        os.path.join(os.path.dirname(__file__), './lastgraph.css'))

    # Colour that set!
    cr = Colourer(style)
    cr.colour(series_set)

    # Create the output
    output = FileOutput(style)

    # Weeky scale
    scale = AutoWeekDateScale(series_set)

    # OK, render that.
    wg = WaveGraph(series_set, scale, style, label_curves=True)
    lb = Label("username", style)

    width = 30 * len(list(series_set.keys()))
    output.add_item(lb, x=10, y=5, width=width - 20, height=20)
    output.add_item(wg, x=0, y=30, width=width, height=200)

    # Save the images
    output.write("pdf", "fake_lastfm.pdf")
Esempio n. 9
0
def render_poster():
    from settings import apiurl, local_store, local_store_url, nodename, nodepwd

    DEBUG = "--debug" in sys.argv
    GDEBUG = "--gdebug" in sys.argv
    TEST = "--test" in sys.argv
    PROXYUPLOAD = "--proxyupload" in sys.argv

    if "--" not in sys.argv[-1] and TEST:
        SPECIFIC = int(sys.argv[-1])
    else:
        SPECIFIC = None

    print "# Welcome to the LastGraph Renderer"

    print "# This is node '%s'." % nodename
    print "# Using server '%s'." % apiurl

    def jsonfetch(url):
        """Fetches the given URL and parses it as JSON, then returns the result."""
        try:
            data = urllib.urlopen(url).read()
        except AttributeError:
            sys.exit(2001)
        if data[0] == "(" and data[-1] == ")":
            data = data[1:-1]
        try:
            return json.loads(data)
        except ValueError:
            if DEBUG:
                print extract_django_error(data)
            raise ValueError

    # See if we need to download something to render
    try:
        if SPECIFIC:
            print "~ Rendering only graph %s." % SPECIFIC
            status = jsonfetch(apiurl % "render/data/%i/?nodename=%s&password=%s" % (SPECIFIC, nodename, nodepwd))
        else:
            status = jsonfetch(apiurl % "render/next/?nodename=%s&password=%s" % (nodename, nodepwd))

    except ValueError:
        print "! Garbled server response to 'next render' query."
        sys.exit(0)

    except IOError:
        print "! Connection error to server"
        sys.exit(0)

    if "error" in status:
        print "! Error from server: '%s'" % status['error']
        sys.exit(0)

    elif "id" in status:

        try:
            id = status['id']
            username = status['username']
            start = status['start']
            end = status['end']
            data = status['data']
            params = status['params']
            colourscheme, detail = params.split("|")
            detail = int(detail)

            print "* Rendering graph #%s for '%s' (%.1f weeks)" % (id, username, (end-start)/(86400.0*7.0))

            # Gather a list of all artists
            artists = {}
            for week_start, week_end, plays in data:
                for artist, play in plays:
                    try:
                        artist.encode("utf-8")
                        artists[artist] = {}
                    except (UnicodeDecodeError, UnicodeEncodeError):
                        print "Bad artist!"

            # Now, get that into a set of series
            for week_start, week_end, plays in data:
                plays = dict(plays)
                for artist in artists:
                    aplays = plays.get(artist, 0)
                    if aplays < detail:
                        aplays = 0
                    artists[artist][week_end] = aplays

            series_set = SeriesSet()
            for artist, plays in artists.items():
                series_set.add_series(Series(artist, plays))

            # Create the output
            output = FileOutput()

            import lastgraph_css as style

            # We'll have major lines every integer, and minor ones every half
            scale = AutoWeekDateScale(series_set)

            # Choose an appropriate colourscheme
            c1, c2 = {
                "ocean": ("#334489", "#2d8f3c"),
                "blue": ("#264277", "#338a8c"),
                "desert": ("#ee6800", "#fce28d"),
                "rainbow": ("#ff3333", "#334489"),
                "sunset": ("#aa0000", "#ff8800"),
                "green": ("#44ff00", "#264277"),
                "eclectic": ("#510F7A", "#FFc308"),
            }[colourscheme]

            style = style.merge(css.CssStylesheet.from_css("colourer { gradient-start: %s; gradient-end: %s; }" % (c1, c2)))

            # Colour that set!
            cr = Colourer(style)
            cr.colour(series_set)

            # OK, render that.
            wg = WaveGraph(series_set, scale, style, debug=GDEBUG, textfix=True)
            lb = Label(username, style)

            width = 30 * len(series_set.keys())
            output.add_item(lb, x=10, y=10, width=width-20, height=20)
            output.add_item(wg, x=0, y=40, width=width, height=300)

            # Save the images

            if TEST:
                output.write("pdf", "test.pdf")
                print "< Wrote output to test.pdf"
            else:
                pdf_stream = output.stream("pdf")
                print "* Rendered PDF"
                svgz_stream = output.stream("svgz")
                print "* Rendered SVG"
                urls = {}
                for format in ('svgz', 'pdf'):
                    filename = 'graph_%s.%s' % (id, format)
                    fileh = open(os.path.join(local_store, filename), "w")
                    fileh.write({'svgz': svgz_stream, 'pdf': pdf_stream}[format].read())
                    fileh.close()
                    urls[format] = "%s/%s" % (local_store_url.rstrip("/"), filename)

                print "< Successful. Telling server..."
                response = posturl(apiurl % "render/links/", [
                    ("nodename", nodename), ("password", nodepwd), ("id", id),
                    ("pdf_url", urls['pdf']), ("svg_url", urls['svgz']),
                ], [])
                if DEBUG:
                    print extract_django_error(response)
                print "* Done."
                if "pdf_stream" in locals():
                    pdf_stream.close()
                if "svgz_stream" in locals():
                    svgz_stream.close()

        except:
            import traceback
            traceback.print_exc()
            print "< Telling server about error..."
            if "pdf_stream" in locals():
                pdf_stream.close()
            if "svgz_stream" in locals():
                svgz_stream.close()
            try:
                jsonfetch(apiurl % "render/failed/?nodename=%s&password=%s&id=%s" % (nodename, nodepwd, id))
                response = posturl(apiurl % "render/failed/", [
                    ("nodename", nodename), ("password", nodepwd), ("id", id),
                    ("traceback", traceback.format_exc()),
                ], [])
                print "~ Done."
            except:
                print "! Server notification failed"
            sys.exit(0)

    elif "nothing" in status:
        if "skipped" in status:
            print "~ Server had to skip: %s." % status['skipped']
        else:
            print "- No graphs to render."

    if SPECIFIC:
        sys.exit(0)
Esempio n. 10
0
#!/usr/bin/python

import random
from graphication import FileOutput, Series, SeriesSet, Label, SimpleScale, css, default_css as style
from graphication.wavegraph import WaveGraph

# Create a random multiseries
num_points = 10
randomvalues = lambda n: dict([(i, random.choice(range(2, 25)))
                               for i in range(n)])

series_set = SeriesSet()
for i in range(6):
    series_set.add_series(
        Series(
            "Series%s" % i,
            randomvalues(num_points),
            "#3366%2xff" % (50 * i),
            {
                0: (i - 1) % 5,
                5: 0
            },
        ))

# Create the output
output = FileOutput()

# We'll have major lines every integer, and minor ones every half
scale = SimpleScale(0, num_points - 1, 1)

# OK, render that.
Esempio n. 11
0
def colorgen():
  colours = (
  "#4D8963",
  "#69A583",
  "#E1B378",
  "#E0CC97",
  "#EC799A",
  "#9F0251")

  while 1:
    for c in colours: yield c

colour_loop = colorgen()

series_set = SeriesSet()
for filename in sys.argv[1:]:
  data = []
  for row in csv.reader(open(filename)):
    data.append((datetime.strptime(row[0], '%m-%d-%Y'), int(row[1])))

  name = os.path.splitext(filename)[0]
  series_set.add_series(Series(name, dict(data), colour_loop.next()))

output = FileOutput()
scale = AutoWeekDateScale(series_set)
#scale = AutoDateScale(series_set)

wg = WaveGraph(series_set, scale, None, label_curves=True)
lb = Label(', '.join(map(lambda x: x.title, series_set)), None)
#!/usr/bin/python

import random
from graphication import FileOutput, Series, SeriesSet, Label, SimpleScale, css
from graphication.linegraph import LineGraph

# Create a random multiseries
num_points = 10
randomvalues = lambda n: dict([(i, random.choice(range(2,25))) for i in range(n)])

series_set = SeriesSet()
for i in range(2):
	series_set.add_series(Series(
		"Series%s" % i,
		randomvalues(num_points),
		"#3366%2xff" % (50*i),
		{0:i%3,5:0},
	))

# Create the output
output = FileOutput()

# We'll have major lines every integer, and minor ones every half
scale = SimpleScale(0, num_points-1, 1)

# OK, render that.
wg = LineGraph(series_set, scale, None)
lb = Label("Test Graph", None)

output.add_item(lb, x=10, y=5, width=490, height=20)
output.add_item(wg, x=0, y=30, width=500, height=200)
Esempio n. 13
0
def render_poster():
    from settings import apiurl, local_store, local_store_url, nodename, nodepwd

    DEBUG = "--debug" in sys.argv
    GDEBUG = "--gdebug" in sys.argv
    TEST = "--test" in sys.argv
    PROXYUPLOAD = "--proxyupload" in sys.argv

    if "--" not in sys.argv[-1] and TEST:
        SPECIFIC = int(sys.argv[-1])
    else:
        SPECIFIC = None

    print "# Welcome to the LastGraph Renderer"

    print "# This is node '%s'." % nodename
    print "# Using server '%s'." % apiurl

    def jsonfetch(url):
        """Fetches the given URL and parses it as JSON, then returns the result."""
        try:
            data = urllib.urlopen(url).read()
        except AttributeError:
            sys.exit(2001)
        if data[0] == "(" and data[-1] == ")":
            data = data[1:-1]
        try:
            return json.loads(data)
        except ValueError:
            if DEBUG:
                print extract_django_error(data)
            raise ValueError

    # See if we need to download something to render
    try:
        if SPECIFIC:
            print "~ Rendering only graph %s." % SPECIFIC
            status = jsonfetch(apiurl %
                               "render/data/%i/?nodename=%s&password=%s" %
                               (SPECIFIC, nodename, nodepwd))
        else:
            status = jsonfetch(apiurl %
                               "render/next/?nodename=%s&password=%s" %
                               (nodename, nodepwd))

    except ValueError:
        print "! Garbled server response to 'next render' query."
        sys.exit(0)

    except IOError:
        print "! Connection error to server"
        sys.exit(0)

    if "error" in status:
        print "! Error from server: '%s'" % status['error']
        sys.exit(0)

    elif "id" in status:

        try:
            id = status['id']
            username = status['username']
            start = status['start']
            end = status['end']
            data = status['data']
            params = status['params']
            colourscheme, detail = params.split("|")
            detail = int(detail)

            print "* Rendering graph #%s for '%s' (%.1f weeks)" % (
                id, username, (end - start) / (86400.0 * 7.0))

            # Gather a list of all artists
            artists = {}
            for week_start, week_end, plays in data:
                for artist, play in plays:
                    try:
                        artist.encode("utf-8")
                        artists[artist] = {}
                    except (UnicodeDecodeError, UnicodeEncodeError):
                        print "Bad artist!"

            # Now, get that into a set of series
            for week_start, week_end, plays in data:
                plays = dict(plays)
                for artist in artists:
                    aplays = plays.get(artist, 0)
                    if aplays < detail:
                        aplays = 0
                    artists[artist][week_end] = aplays

            series_set = SeriesSet()
            for artist, plays in artists.items():
                series_set.add_series(Series(artist, plays))

            # Create the output
            output = FileOutput()

            import lastgraph_css as style

            # We'll have major lines every integer, and minor ones every half
            scale = AutoWeekDateScale(series_set)

            # Choose an appropriate colourscheme
            c1, c2 = {
                "ocean": ("#334489", "#2d8f3c"),
                "blue": ("#264277", "#338a8c"),
                "desert": ("#ee6800", "#fce28d"),
                "rainbow": ("#ff3333", "#334489"),
                "sunset": ("#aa0000", "#ff8800"),
                "green": ("#44ff00", "#264277"),
                "eclectic": ("#510F7A", "#FFc308"),
            }[colourscheme]

            style = style.merge(
                css.CssStylesheet.from_css(
                    "colourer { gradient-start: %s; gradient-end: %s; }" %
                    (c1, c2)))

            # Colour that set!
            cr = Colourer(style)
            cr.colour(series_set)

            # OK, render that.
            wg = WaveGraph(series_set,
                           scale,
                           style,
                           debug=GDEBUG,
                           textfix=True)
            lb = Label(username, style)

            width = 30 * len(series_set.keys())
            output.add_item(lb, x=10, y=10, width=width - 20, height=20)
            output.add_item(wg, x=0, y=40, width=width, height=300)

            # Save the images

            if TEST:
                output.write("pdf", "test.pdf")
                print "< Wrote output to test.pdf"
            else:
                pdf_stream = output.stream("pdf")
                print "* Rendered PDF"
                svgz_stream = output.stream("svgz")
                print "* Rendered SVG"
                urls = {}
                for format in ('svgz', 'pdf'):
                    filename = 'graph_%s.%s' % (id, format)
                    fileh = open(os.path.join(local_store, filename), "w")
                    fileh.write({
                        'svgz': svgz_stream,
                        'pdf': pdf_stream
                    }[format].read())
                    fileh.close()
                    urls[format] = "%s/%s" % (local_store_url.rstrip("/"),
                                              filename)

                print "< Successful. Telling server..."
                response = posturl(apiurl % "render/links/", [
                    ("nodename", nodename),
                    ("password", nodepwd),
                    ("id", id),
                    ("pdf_url", urls['pdf']),
                    ("svg_url", urls['svgz']),
                ], [])
                if DEBUG:
                    print extract_django_error(response)
                print "* Done."
                if "pdf_stream" in locals():
                    pdf_stream.close()
                if "svgz_stream" in locals():
                    svgz_stream.close()

        except:
            import traceback
            traceback.print_exc()
            print "< Telling server about error..."
            if "pdf_stream" in locals():
                pdf_stream.close()
            if "svgz_stream" in locals():
                svgz_stream.close()
            try:
                jsonfetch(apiurl %
                          "render/failed/?nodename=%s&password=%s&id=%s" %
                          (nodename, nodepwd, id))
                response = posturl(apiurl % "render/failed/", [
                    ("nodename", nodename),
                    ("password", nodepwd),
                    ("id", id),
                    ("traceback", traceback.format_exc()),
                ], [])
                print "~ Done."
            except:
                print "! Server notification failed"
            sys.exit(0)

    elif "nothing" in status:
        if "skipped" in status:
            print "~ Server had to skip: %s." % status['skipped']
        else:
            print "- No graphs to render."

    if SPECIFIC:
        sys.exit(0)
#!/usr/bin/python

import random
from graphication import FileOutput, Series, SeriesSet, Label, SimpleScale, css, default_css as style
from graphication.doughnut import Doughnut

colours = ["#844648","#b3c234","#244574"]

series_set = SeriesSet()
for i in range(3):
	series_set.add_series(Series(
		"Series%s" % i,
		{0: random.randint(1,100)},
		colours[i%3]
	))

# Create the output
output = FileOutput(padding=5)

# OK, render that.
dn = Doughnut(series_set, style)
lb = Label("Test Graph", style)

output.add_item(dn, x=0, y=0, width=300, height=300)

# Save the images
output.write("png", "dn.png")
output.write("pdf", "dn.pdf")