pycha:initial prototype with unmodified pycha_line_deluge
This commit is contained in:
parent
4da4b5ac03
commit
4b33809529
|
@ -0,0 +1,4 @@
|
|||
<html>
|
||||
<img src="output_sync.png"><br>
|
||||
<img src="pycha1.png">
|
||||
</html>
|
|
@ -0,0 +1,113 @@
|
|||
# Copyright (c) 2007-2008 by Lorenzo Gil Sanchez <lorenzo.gil.sanchez@gmail.com>
|
||||
#
|
||||
# This file is part of PyCha.
|
||||
#
|
||||
# PyCha is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# PyCha is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with PyCha. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from pycha.chart import Chart
|
||||
from pycha.color import hex2rgb, clamp
|
||||
|
||||
class LineChart(Chart):
|
||||
|
||||
def __init__(self, surface=None, options={}):
|
||||
super(LineChart, self).__init__(surface, options)
|
||||
self.points = []
|
||||
|
||||
def _updateChart(self):
|
||||
"""Evaluates measures for line charts"""
|
||||
self.points = []
|
||||
|
||||
for i, (name, store) in enumerate(self.datasets):
|
||||
for item in store:
|
||||
xval, yval = item
|
||||
x = (xval - self.minxval) * self.xscale
|
||||
y = 1.0 - (yval - self.minyval) * self.yscale
|
||||
point = Point(x, y, xval, yval, name)
|
||||
|
||||
if 0.0 <= point.x <= 1.0 and 0.0 <= point.y <= 1.0:
|
||||
self.points.append(point)
|
||||
|
||||
def _renderChart(self, cx):
|
||||
"""Renders a line chart"""
|
||||
def preparePath(storeName):
|
||||
cx.new_path()
|
||||
firstPoint = True
|
||||
lastX = None
|
||||
if self.options.shouldFill:
|
||||
# Go to the (0,0) coordinate to start drawing the area
|
||||
cx.move_to(self.area.x, self.area.y + self.area.h)
|
||||
|
||||
for point in self.points:
|
||||
if point.name == storeName:
|
||||
if not self.options.shouldFill and firstPoint:
|
||||
# starts the first point of the line
|
||||
cx.move_to(point.x * self.area.w + self.area.x,
|
||||
point.y * self.area.h + self.area.y)
|
||||
firstPoint = False
|
||||
continue
|
||||
cx.line_to(point.x * self.area.w + self.area.x,
|
||||
point.y * self.area.h + self.area.y)
|
||||
# we remember the last X coordinate to close the area
|
||||
# properly. See bug #4
|
||||
lastX = point.x
|
||||
|
||||
if self.options.shouldFill:
|
||||
# Close the path to the start point
|
||||
cx.line_to(lastX * self.area.w + self.area.x,
|
||||
self.area.h + self.area.y)
|
||||
cx.line_to(self.area.x, self.area.y + self.area.h)
|
||||
cx.close_path()
|
||||
else:
|
||||
cx.set_source_rgb(*self.options.colorScheme[storeName])
|
||||
cx.stroke()
|
||||
|
||||
|
||||
cx.save()
|
||||
cx.set_line_width(self.options.stroke.width)
|
||||
if self.options.shouldFill:
|
||||
def drawLine(storeName):
|
||||
if self.options.stroke.shadow:
|
||||
# draw shadow
|
||||
cx.save()
|
||||
cx.set_source_rgba(0, 0, 0, 0.15)
|
||||
cx.translate(2, -2)
|
||||
preparePath(storeName)
|
||||
cx.fill()
|
||||
cx.restore()
|
||||
|
||||
# fill the line
|
||||
cx.set_source_rgb(*self.options.colorScheme[storeName])
|
||||
preparePath(storeName)
|
||||
cx.fill()
|
||||
|
||||
if not self.options.stroke.hide:
|
||||
# draw stroke
|
||||
cx.set_source_rgb(*hex2rgb(self.options.stroke.color))
|
||||
preparePath(storeName)
|
||||
cx.stroke()
|
||||
|
||||
# draw the lines
|
||||
for key in self._getDatasetsKeys():
|
||||
drawLine(key)
|
||||
else:
|
||||
for key in self._getDatasetsKeys():
|
||||
preparePath(key)
|
||||
|
||||
cx.restore()
|
||||
|
||||
class Point(object):
|
||||
def __init__(self, x, y, xval, yval, name):
|
||||
self.x, self.y = x, y
|
||||
self.xval, self.yval = xval, yval
|
||||
self.name = name
|
|
@ -4,7 +4,7 @@ from graph import NetworkGraph
|
|||
|
||||
|
||||
def test_sync():
|
||||
if 1:
|
||||
if 0:
|
||||
upload = sclient.graph_get_upload()
|
||||
download = sclient.graph_get_download()
|
||||
print upload
|
||||
|
@ -53,8 +53,8 @@ def test_write():
|
|||
|
||||
|
||||
test_sync()
|
||||
test_async()
|
||||
test_write()
|
||||
#test_async()
|
||||
#test_write()
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -5,71 +5,111 @@ good :
|
|||
|
||||
bad :
|
||||
* docs are sparse.
|
||||
|
||||
Make it look like the deluge graph:
|
||||
#Is it easy to hack in a n'th line color option? --> probably just not documented... ->YEP
|
||||
*fill is broken? , no opacity. -> pycha needs to be hacked to mimic the current deluge style.
|
||||
*how to set line-width?
|
||||
|
||||
|
||||
|
||||
*kbps label on y axis
|
||||
"""
|
||||
upload = [66804, 66915, 66974, 67447, 67540, 67318, 67320, 67249, 66659, 66489, 67027, 66914, 66802, 67303, 67654, 67643, 67763, 67528, 67523, 67431, 67214, 66939, 67316, 67020, 66881, 67103, 67377, 67141, 67366, 67492, 67375, 67203, 67056, 67010, 67029, 66741, 66695, 66868, 66805, 66264, 66249, 66317, 66459, 66306, 66681, 66954, 66662, 66278, 65921, 65695, 65681, 65942, 66000, 66140, 66424, 66480, 66257, 66271, 66145, 65854, 65568, 65268, 65112, 65050, 65027, 64676, 64655, 64178, 64386, 63979, 63271, 62746, 62337, 62297, 62496, 62902, 63801, 64121, 62957, 62921, 63051, 62644, 63240, 64107, 63968, 63987, 63644, 63263, 63153, 62999, 62843, 62777, 63101, 63078, 63178, 63126, 63401, 62630, 62451, 62505, 62254, 61485, 61264, 60937, 60568, 61011, 61109, 60325, 60196, 59640, 59619, 59514, 60813, 60572, 61632, 61689, 63365, 64583, 66396, 67179, 68209, 68295, 67674, 67559, 67195, 66178, 65632, 66124, 66456, 66676, 67183, 67620, 66960, 66347, 65925, 65907, 65896, 66738, 66703, 67060, 67004, 67007, 66329, 65304, 52002, 38969, 25433, 12426, 0, 0]
|
||||
download = [42926, 43853, 43157, 45470, 44254, 46272, 45083, 47344, 46716, 51963, 50112, 52334, 55525, 57545, 53691, 51637, 49574, 49836, 48295, 49843, 52878, 56014, 56966, 56938, 60065, 60461, 56542, 59526, 58678, 54424, 51862, 55109, 52132, 53783, 51687, 56567, 52182, 50758, 46714, 50511, 48161, 50920, 48694, 50528, 55074, 55420, 55882, 59268, 59958, 57938, 57115, 51424, 51180, 53184, 52879, 51177, 54417, 51097, 47901, 49870, 55865, 61118, 61476, 63498, 58878, 49630, 45975, 45632, 45892, 44855, 49495, 48304, 45829, 42152, 39403, 37574, 32384, 34933, 34901, 33492, 31953, 36271, 33826, 34515, 36408, 41106, 43054, 44110, 40810, 41383, 37267, 35881, 38660, 37525, 34857, 36718, 36842, 34281, 39528, 41854, 42952, 40021, 41722, 41045, 42917, 39287, 38672, 32824, 28765, 22686, 18490, 15714, 15268, 14793, 15305, 16354, 16720, 17502, 17857, 16622, 18447, 19929, 31138, 36965, 36158, 32795, 30445, 21997, 18100, 22491, 27227, 29317, 32436, 35700, 39140, 36258, 33697, 24751, 20354, 8211, 3836, 1560, 834, 2034, 1744, 1637, 1637, 1637, 0, 0]
|
||||
|
||||
|
||||
import sys
|
||||
import cairo
|
||||
import pycha.line
|
||||
#import pycha.line
|
||||
import pycha_line_deluge as line
|
||||
from pycha.color import hex2rgb
|
||||
from pycha.chart import Option
|
||||
|
||||
#Complete pycha style ;
|
||||
options = Option(
|
||||
axis=Option(
|
||||
lineWidth=1.0,
|
||||
lineColor='#000000',
|
||||
tickSize=3.0,
|
||||
labelColor='#666666',
|
||||
labelFont='Tahoma',
|
||||
labelFontSize=9,
|
||||
labelWidth=50.0,
|
||||
x=Option(
|
||||
hide=True,
|
||||
ticks=None,
|
||||
tickCount=10,
|
||||
tickPrecision=1,
|
||||
range=None,
|
||||
rotate=None,
|
||||
label=None,
|
||||
),
|
||||
y=Option(
|
||||
hide=False,
|
||||
ticks=None,
|
||||
tickCount=3,
|
||||
tickPrecision=1,
|
||||
range=None,
|
||||
rotate=None,
|
||||
label=None,
|
||||
),
|
||||
),
|
||||
background=Option(
|
||||
hide=False,
|
||||
baseColor=None,
|
||||
chartColor='#ffffff',
|
||||
lineColor='#f5f5f5',
|
||||
lineWidth=1.5,
|
||||
),
|
||||
legend=Option(
|
||||
opacity=0.8,
|
||||
borderColor='#FFFFFF',
|
||||
style={},
|
||||
hide=False,
|
||||
position=Option(top=0, left=800 - 100)
|
||||
),
|
||||
padding=Option(
|
||||
left=30,
|
||||
right=30,
|
||||
top=15,
|
||||
bottom=15,
|
||||
),
|
||||
stroke=Option(
|
||||
color='#ffffff',
|
||||
hide=False,
|
||||
shadow=True,
|
||||
width=2
|
||||
),
|
||||
fillOpacity=0.5,
|
||||
shouldFill=False,
|
||||
barWidthFillFraction=0.75,
|
||||
xOriginIsZero=True,
|
||||
yOriginIsZero=True,
|
||||
pieRadius=0.4,
|
||||
colorScheme="blue",
|
||||
title=None,
|
||||
titleFont='Tahoma',
|
||||
titleFontSize=12,
|
||||
)
|
||||
|
||||
|
||||
def test_colscheme():
|
||||
print pycha.color.generateColorscheme("#6d1d1d", ["one","two"])
|
||||
|
||||
|
||||
|
||||
def lineChart(output):
|
||||
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 800, 300)
|
||||
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 800, 200)
|
||||
|
||||
options["colorScheme"] = {
|
||||
'upload': hex2rgb("#444499"),
|
||||
'download': hex2rgb("#449944"),
|
||||
}
|
||||
|
||||
dataSet = (
|
||||
('download',[(i, bps / 1024) for i, bps in enumerate(download) ] ),
|
||||
('upload', [(i, bps / 1024) for i, bps in enumerate(upload) ] ),
|
||||
('download',[(i, bps / 1024) for i, bps in enumerate(reversed(download)) ] ),
|
||||
('upload', [(i, bps / 1024) for i, bps in enumerate(reversed(upload)) ] ),
|
||||
)
|
||||
|
||||
|
||||
options = {
|
||||
"legend":Option(
|
||||
opacity=0.8,
|
||||
borderColor='#FFFFFF',
|
||||
style={},
|
||||
hide=False,
|
||||
position=Option(top=0, left=800 - 100)
|
||||
),
|
||||
|
||||
'axis': {
|
||||
'x': {
|
||||
'ticks': [],
|
||||
},
|
||||
'y': {
|
||||
'tickCount': 4,
|
||||
}
|
||||
},
|
||||
'background': {
|
||||
'color': '#ffffff',
|
||||
'lineColor': '#444444'
|
||||
},
|
||||
#'colorScheme': 'blue',
|
||||
"colorScheme":{
|
||||
'upload': hex2rgb("#449944"),
|
||||
'download': hex2rgb("#444499"),
|
||||
},
|
||||
'padding': {
|
||||
'left': 55,
|
||||
'bottom': 40,
|
||||
},
|
||||
"fillOpacity":0.5,
|
||||
"shouldFill":False,
|
||||
}
|
||||
chart = pycha.line.LineChart(surface, options)
|
||||
chart = line.LineChart(surface, options)
|
||||
|
||||
chart.addDataset(dataSet)
|
||||
chart.render()
|
||||
|
|
Loading…
Reference in New Issue