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 windowLet 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 displaygraph_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
parametersFor
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 leftNow, 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 drawngraph_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.
Hi,
ReplyDeleteHow 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
Hi foppe, interesting question! I will look to it more deeply later.
ReplyDeleteTo 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
Hi!
ReplyDeleteThanks 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...