Some of my scripts for daily use on a linux desktop

Sunday, October 31, 2010

Graph Widget

After some months, here is a new widget.
This one draw graphs like *_graph variables in conky (cpugraph, downspeedgraph, ...) but with some amazing options.

The widget use a lot of parameters but only three are mandatory, others are optional. If they are missing, default values are used.

Link to download on deviantArt : here

As usual, settings are made through tables :
graph_settings={
{table_setting for ring1},
{table_setting for ring2},
{table_setting for ring3},
}


For each table, the 3 mandatory parameters are name, arg and max.

In a conky, you write: ${cpu cpu1}, In the script, you will write :
graph_settings={
{
name="cpu",
arg="cpu1",
max=100,
--(max is set to 100 because maximum value of $cpu is 100% but you can set it to 50% if you want)
}
}


For my next examples, I will use this table :
graph_settings={
{
name="time",
arg="%S",
max=60,
}
}

and update_interval 1 in conkyrc.


This simple table will draw this kind of graph in the bottom-left corner of the conky window:

You can see a gradient on the background and a gradient on the graph itself.

The default size of the graph is 100x20 pixels but we can change the size and position with width, height, x and y parameters.
x and y are the bottom-left corner of the graph, they are relative to the top-left corner of the conky window

Let zoom in the graph for the next screenshots :
 graph_settings={
{
name="time",
arg="%S",
max=60,
width=250,
height=75,
x=20,
y=200,
},
}




On the above image, the width is set to 250 pixels, it means , with a conky update of 1 s, that the graph duration is 250 seconds. (each triangle is for one minute)

The same graph with update_interval 0.5 will display half the previous one.


By default, the graph displays one value per pixel, but we can change that with the nb_values parameter : it sets the number of values to display
 graph_settings={
{
name="time",
arg="%S",
max=60,
width=250,
height=75,
nb_values=60,
},
}


Here, we display 60 values, with update_interval 1, it display values for one minute :


Ok, theses triangle are boring, let play with a cpu graph :
 graph_settings={
{
name="cpu",
arg="",
max=100,
width=250,
height=75,
nb_values=60,
},
}

With the maximum value set to 100% (max=100), this graph is not useful :


For a better view, we can use the autoscale parameter, if set to true true, the script calculate the maximum value to use (and do not use the max parameter)

 graph_settings={
{
name="cpu",
arg="",
max=100,
width=250,
height=75,
nb_values=60,
autoscale=true,
},
}





Others ways to change the layout of the output are angle, skew_x and skew_y parameters
For angle :
   graph_settings={
{
name="cpu",
arg="",
max=100,
width=250,
height=75,
nb_values=60,
autoscale=true,
x=50,
angle=-35,
},
}




For skew_x :
 graph_settings={
{
name="cpu",
arg="",
max=100,
width=250,
height=75,
nb_values=60,
autoscale=true,
x=175,
skew_x=-15,
},
}




For skew_y :
 graph_settings={
{
name="cpu",
arg="",
max=100,
width=250,
height=75,
nb_values=60,
autoscale=true,
skew_y=-15,
},
}




For both skew_x and skew_y :
 graph_settings={
{
name="cpu",
arg="",
max=100,
width=250,
height=75,
nb_values=60,
autoscale=true,
x=175,
skew_y=-25,
skew_x=-15,
},
}





Another parameter is inverse, if set to true, the graph is drawn from right to left




Now, some parameters to change the output of the graph :
background set to false to not display the background :
 graph_settings={
{
name="cpu",
arg="",
max=100,
width=250,
height=75,
nb_values=60,
autoscale=true,
background=false,
},
}



foreground set to false to not display the graph! (Wait, you will see that is useful soon !):
 graph_settings={
{
name="cpu",
arg="",
max=100,
width=250,
height=75,
nb_values=60,
autoscale=true,
foreground=false,
},
}


But ... we can add a border to the graph with fg_bd_size. If set to zero, no border is drawn
 graph_settings={
{
name="cpu",
arg="",
max=100,
width=250,
height=75,
nb_values=60,
autoscale=true,
foreground=false,
fg_bd_size=5,
},
}



And a border can be added to the background with bg_bd_size
 graph_settings={
{
name="cpu",
arg="",
max=100,
width=250,
height=75,
nb_values=60,
autoscale=true,
fg_bd_size=2,
bg_bd_size=2,
},
}

with foreground back to true, the default value, we can have that :




Now have a look on the colours.
Each colours for background, foreground, background_border, graph border are set in theses parameters :
bg_colour, fg_colour, bg_bd_colour and fg_bd_colour.

For example, for a single colour table:
bg_colour={{0,0x0000ff,1}}

for a 2-colours table :
bg_colour={
{0,0x0000ff,1},
{1,0xff00ff,1}
}

for a 3-colours table:
bg_colour={
{0,0x0000ff,1},
{0.5,0xff00ff,1},
{1,0xff00ff,1}
}



and so on ...

Each "table colour" above contains one or more tables which defines the colours of a gradient :
table={P,C,A}
P = position inside the linear gradient (0 = start of the gradient, 1= end of the gradient)
C = hexadecimal colour
A = alpha (opacity) of colour (0=invisible,1=opacity 100%)

Some examples with the background only :


As the gradient is linear, I add an orientation parameter, for the four colours :
bg_orientation, bg_bd_orientation, fg_orientation and fg_bd_orientation.
The values of the parameter are the starting point of the gradient, like in this picture :

and, in use :

On the above image, the difference between nw and ww is not obvious but if we decrease the width of the graph, the effect is more visible, like this, for the 8 possible values : "nn","ne","ee","se","ss","sw","ww","nw" :


Stop playing now, try to draw a real graph with some gradients :
 graph_settings={
{
name="cpu",
arg="",
max=100,
width=250,
height=75,
nb_values=100,
autoscale=true,
bg_bd_size=1,
fg_bd_size=3,
bg_colour = {{0,0xFFFFFF,1}},
bg_bd_colour = { {0,0x00000,1}},

fg_colour = { {0,0xFF0000,1},
{0.66,0xFFFF00,1},
{1,0x00FF00,1},
},
fg_bd_colour = { {0,0x000000,1}},
},
}




Another one:
 graph_settings={
{
name="cpu",
arg="",
max=100,
width=250,
height=75,
nb_values=100,
autoscale=true,
bg_bd_size=0,
fg_bd_size=0,
bg_colour = { {0,0x00000,1},
{0.5,0xFFFFFF,1},
{1,0x00000,1}},

fg_colour = { {0,0x000000,1},
{0.5,0x0000FF,0.5},
{1,0x000000,1}},

},
}




One more :
 graph_settings={
{
name="cpu",
arg="",
max=100,
width=250,
height=75,
nb_values=100,
autoscale=true,
bg_bd_size=2,
fg_bd_size=0,
bg_colour = { {0,0x00000,0},
{0.5,0xFFFFFF,1},
{1,0x00000,0}},

bg_bd_colour = { {0,0x00000,0},
{0.5,0x000000,1},
{1,0x00000,0}},

fg_colour = { {0,0x000000,0},
{0.5,0xFF0000,0.5},
{1,0x000000,0}},

bg_bd_orientation="ww",
bg_orientation="ww",
fg_orientation="ww",
},
}




Again :
 graph_settings={
{
name="cpu",
arg="",
max=100,
width=250,
height=75,
nb_values=100,
autoscale=true,
bg_bd_size=0,
fg_bd_size=3,

fg_bd_colour = { {0,0x000000,1},
{.75,0x00000,0},
},

foreground=false,
background=false
},
}






Now, we will draw more that one graph. Remember, the script can draw as many graph as you want! So, to draw overlaping graphs, we first draw the main graph with the background on it and then we add others graphs, like this, for a quad core cpu :

graph_settings={
{
name="cpu",
arg="cpu1",
max=100,
width=250,
height=75,
nb_values=100,
fg_bd_size=1,
bg_colour={{0,0xeeeeee,0.5}},
fg_bd_colour = { {0,0xFF0000,1}, },
foreground=false,
},
{
name="cpu",
arg="cpu2",
max=100,
width=250,
height=75,
nb_values=100,
fg_bd_size=1,
fg_bd_colour = { {0,0x00FF00,1}, },
background=false,
foreground=false,
},
{
name="cpu",
arg="cpu3",
max=100,
width=250,
height=75,
nb_values=100,
fg_bd_size=1,
fg_bd_colour = { {0,0x0000FF,1}, },
background=false,
foreground=false,
},
{
name="cpu",
arg="cpu4",
max=100,
width=250,
height=75,
nb_values=100,
fg_bd_size=1,
fg_bd_colour = { {0,0xFFFF00,1}, },
background=false,
foreground=false,
},
}

While running avidemux :


One of the nice feature in conky is transparancy :


That's all for today !



A new website about Conky is starting here. It's name is Conky PitStop and you will fine some Conky's addicts on it. I'm working on the french translation, if anyone is interested to join, drop me a note!
There are also translation ion german and spanish but more languages can be added.

3 comments:

  1. Hi,

    How would I go about if I want to display a graph, using this script, where the data is not a conky variable?
    The usecase is this: I have a python script that parses weather data. For instance parsing humidty would generate a number as % so it would do great in a bar graph. However I don't see where I should either
    - create a variable in conkyrc and pass that to a modified lua script ${humidity} and graph_settings{{name="humidity", agr="" etc.
    - or modify the setup_bar_graph() function in the lua script to add a conky_parse('${exec ./scripts/foo.py 5}')

    Greetings,

    Foppe

    ReplyDelete
  2. Hi foppe, interesting question! I will look to it more deeply later.

    To answer you : you can't create Conky variable.
    The second solution is better :
    {name="exec", agr="./scripts/foo.py 5" ...

    Or try to redirect the output of the python script to a text file and parse it with in the Lua script with
    {{name="exec", agr="cat /path/file", " etc.
    just be sure the cat command returns a number (or mix it with grep cut awk or sed, whatever you want !)

    You can read the text file with Lua function but the $exec function of conky will be ok for the moment.

    Hope this help ans sorry for the late answer !

    wlourf

    ReplyDelete
  3. Hi!

    Thanks for awesome widget!

    I've made a small improvement and decided to share it. It concerns conky vars, which return values with units (i.e. diskio - 1B, 1K, 1M, etc). Here's diff:
    http://pastebin.com/JtGxQnDq

    In short, it converts given values to byte units.
    Of course, it could use some further improvement to make it more general (not just the case with diskio) - other units, improved unit grabbing (i.e. with string.gsub), decimal vs. binary prefix interpretation, etc...

    ReplyDelete