Author avatar

Gaurav Singhal

Charts in Pygal

Gaurav Singhal

  • Feb 5, 2020
  • 16 Min read
  • 106 Views
  • Feb 5, 2020
  • 16 Min read
  • 106 Views
Data
Pygal

Introduction

Pygal is a Python API that enables us to build SVG (scalar vector graphic) graphs and charts in a variety of styles. In this guide, we will learn how to use pygal to apply different methods to visualize data interactively and dynamically. We will also see how to plot in maps using the pygal_maps_world package of pygal and properties of custom styling.

About Pygal

Pygal is highly customizable yet extremely simple, a rare combination. We can create line graphs, bar graphs, histograms, pie charts, maps, and a whole lot more. From there, we can further customize the look and feel of the graphs.

Advantages of Pygal

  • It specializes in creating SVGs.
  • We can easily integrate pygal with flask and Django/Flask apps.
  • To keep it a reasonable size package, three map packages are kept separately.
  • We can customize charts using pygal.style within pygal.

Installation of Pygal

There are no dependencies for installing pygal. It's available for Python 2.7+, assuming that you have Python and pip installed on your system.

  • pip install: To install using pip, open the terminal and run the following command:
1
pip install pygal
terminal
  • conda Install: To install using conda, open the terminal and run the following command:
1
conda install -c conda-forge pygal
terminal

Charts in Pygal

I assume you have basic knowledge of python, you have installed Python 3 on your system, and you have a web browser. We'll look at how to create each of the following charts:

  • Line graphs
  • Bar charts
  • Pie charts
  • Maps
  • Customized charts

Line Graphs

Basic Example

We will take some random data and look at how to plot that data .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#importing pygal
import pygal
# creating line chart object
line_chart = pygal.Line()
# naming the title
line_chart.title = 'A vs B vs C vs D'
# set  the range of plot
line_chart.x_labels = map(str, range(0, 20))
# adding lines
line_chart.add('A', [None, None,0, 1, 1, 2, 3, 5, None, 13, 21, 34, 55])
line_chart.add('B',  [None, None, None,10, 0, 2, 5,None, 0,  3.9, 10.8, 3.8, 5.3])
line_chart.add('C',      [1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 5.7, 4.8, 6.2, 6.6, 0.1])
line_chart.add('D',  [9.2, 19.4, 15.3,  8.9,None,    9, 10.4,  10,  5.8,  6.7,  6.8,  7.5])
# rendering the file
line_chart.render_to_file('basic_line_chart.svg')
python

The rendered file will be saved in the current directory.

Horizontal Line

We will plot the same data from the example above horizontally.

1
2
3
4
5
6
7
8
9
10
11
12
13
# importing pygal
import pygal
# creating horizontal line chart object
line_chart = pygal.HorizontalLine()
# add title
line_chart.title = 'A vs B vs C vs D'
line_chart.x_labels = map(str, range(0, 20))
line_chart.add('A', [None, None,0, 1, 1, 2, 3, 5, None, 13, 21, 34, 55])
line_chart.add('B',  [None, None, None,10, 0, 2, 5,None, 0,  3.9, 10.8, 3.8, 5.3])
line_chart.add('C',      [1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 5.7, 4.8, 6.2, 6.6, 0.1])
line_chart.add('D',  [9.2, 19.4, 15.3,  8.9,None,    9, 10.4,  10,  5.8,  6.7,  6.8,  7.5])
# rendering file
line_chart.render_to_file('horizontal_line_chart.svg')
python

Stacked Line Chart.

1
2
3
4
5
6
7
8
9
10
11
12
13
# importing pygal
import pygal
# creating horizontal line chart object
line_chart = pygal.StackedLine(fill=True)
# add title
line_chart.title = 'A vs B vs C vs D'
line_chart.x_labels = map(str, range(0, 20))
line_chart.add('A', [None, None,0, 1, 1, 2, 3, 5, None, 13, 21, 34, 55])
line_chart.add('B',  [None, None, None,10, 0, 2, 5,None, 0,  3.9, 10.8, 3.8, 5.3])
line_chart.add('C',      [1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 5.7, 4.8, 6.2, 6.6, 0.1])
line_chart.add('D',  [9.2, 19.4, 15.3,  8.9,None,    9, 10.4,  10,  5.8,  6.7,  6.8,  7.5])
# rendering file
line_chart.render_to_file('stacked_line_chart.svg')
python

Bar Graphs

Basic Example

1
2
3
4
5
6
7
8
# First import pygal
import pygal
# Then create a bar graph object
bar_chart = pygal.Bar()
# Add some values
bar_chart.add('Sequence Series', [0, 2, 4, 6, 8, 5, 6, 7, 21, 34, 55])
# save the svgs
bar_chart.render_in_browser() 
python

Note: you can also render SVG in the browser directly using the render_in_browsercommand. It becomes constructive if you are using Jupyter notebook.

Stacked Bar Graph

In this example, we will look at how to create a stacked bar using multiple series.

1
2
3
4
5
6
7
8
9
10
11
# First import pygal
import pygal
# Then create a bar graph object
bar_chart = pygal.Bar()
# Then create a bar graph
bar_chart = pygal.StackedBar()
# adding random values
bar_chart.add('Series A', [0, 50, 1, 2, 3, 5, 8, 3, 1, 44, 5])
bar_chart.add('Series B', [1, 4, 1, 5, 2, 7, 4, 5, 7, 9, 8])
# this will render the svgs in browser
bar_chart.render_to_file('stacked_bar_chart.svg') 
python

Horizontal Multiple Series Bar Chart

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# First import pygal
import pygal
# Then create a bar graph object
bar_chart = pygal.Bar()
# Then create a bar graph
line_chart = pygal.HorizontalBar()
line_chart.title = 'Random data'
line_chart.add('A', 20.5)
line_chart.add('B', 36.7)
line_chart.add('C', 6.3)
line_chart.add('D', 4.5)
line_chart.add('E', 80.3)
# rendering the file
line_chart.render_to_file('Horizontal_bar_chart.svg')
python

Pie Charts

We will now learn how to plot basic pie charts.

Basic Example

1
2
3
4
5
6
7
8
9
10
11
12
13
# importing pygal
import pygal
# creating pie_chart object
pie_chart = pygal.Pie()
pie_chart.title = 'random data'
# adding random data
pie_chart.add('A', 20.5)
pie_chart.add('B', 36.0)
pie_chart.add('C', 35.9)
pie_chart.add('D', 5.5)
pie_chart.add('E', 1.3)
# rendering the svg to the file
pie_chart.render_to_file('pie_chart.svg')
python

Multiple Series Pie

1
2
3
4
5
6
7
8
9
10
11
#importing pygal
import pygal
# creating pie_chart object
pie_chart = pygal.Pie()
pie_chart.title = 'random data'
# adding random data
pie_chart.add("Series A", [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55])
pie_chart.add("Series C", [0, 1, 1, 2, 3, 7, 5, 10, 20, 32, 35])
pie_chart.add("Series B", [0, 1, 1, 4, 5, 5.5, 7, 12, 26, 24, 45])
# rendering the svgs
pie_chart.render_to_file('multiple_pie_chart.svg')
python

Donut

1
2
3
4
5
6
7
8
9
10
11
12
13
# importing pygal
import pygal
# creating pie_chart object
pie_chart = pygal.Pie(inner_radius=.4)
pie_chart.title = 'random data'
# adding random data
pie_chart.add('A', 20.5)
pie_chart.add('B', 36.0)
pie_chart.add('C', 35.9)
pie_chart.add('D', 5.5)
pie_chart.add('E', 80.3)
# rendering the svg to file
pie_chart.render_to_file('donut_chart.svg')
python

Maps

Maps are now kept separately to keep pygal a reasonably sized package.

Three map packages are available in pygal:

  • World map
  • French map
  • Swiss map

We will use the world map package to plot the maps.

Installation

Before plotting, we have to install the world map package on our system.

  • pip install - To install using pip, open the terminal and run the following command:

    1
    pip install pygal_maps_world
    terminal

Basic Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import pygal
# importing World_map package 
from pygal.maps.world import World
# creating object
worldmap_chart = pygal.maps.world.World()
# adding title
worldmap_chart.title = 'Some countries'
# add data
worldmap_chart.add('F countries', ['fr', 'fi'])
worldmap_chart.add('I countries', ['in', 'il','iq'])
worldmap_chart.add('M countries', ['ma', 'mc', 'md', 'me', 'mg',
                                   'mk', 'ml', 'mm', 'mn', 'mo',
                                   'mr', 'mt', 'mu', 'mv', 'mw',
                                   'mx', 'my', 'mz'])
worldmap_chart.add('U countries', ['ua', 'ug', 'us', 'uy', 'uz'])
# rendering the svg to file
worldmap_chart.render_to_file('basic_map.svg')
python

Adding Values to Map

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import pygal
# importing World_map package 
from pygal.maps.world import World
# creating the object
worldmap_chart = pygal.maps.world.World()
# adding the title.
worldmap_chart.title = 'random data'
# adding the random values.
worldmap_chart.add('values', {
  'af': 14,
  'bd': 1,
  'by': 3,
  'cn': 1000,
  'gm': 9,
  'in': 1,
  'ir': 314,
  'iq': 129,
  'jp': 7,
  'kp': 6,
  'pk': 1,
  'ps': 6,
  'sa': 79,
  'so': 6,
  'sd': 5,
  'tw': 6,
  'ae': 1,
  'us': 43,
  'ye': 28
})
# directly rendering the file to browser 
worldmap_chart.render_in_browser()
python

For a list of country codes, see the Pygal documentation .

Continents Chart

In pygal, we also have access to continents as well.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import pygal
# importing World_map package 
from pygal.maps.world import World
# creating object
worldmap_chart = pygal.maps.world.World()
supra = pygal.maps.world.SupranationalWorld()
# adding the values
supra.add('Asia', [('asia', 1)])
supra.add('Europe', [('europe', 2)])
supra.add('Africa', [('africa', 3)])
supra.add('North america', [('north_america', 4)])
supra.add('South america', [('south_america', 5)])
supra.add('Oceania', [('oceania', 6)])
supra.add('Antartica', [('antartica', 7)])
# rendering the svgs
supra.render_to_file('continents.svg')
python

For continent codes, see the pygal documentation .

Style Charts

There are three ways to style a chart:

  • Built-in styles
  • Parametric style
  • Custom style

Built-in Styles

1
2
3
4
5
6
7
8
9
10
11
# importing built-in style
from pygal.style import LightGreenStyle
# creating the object
chart = pygal.StackedLine(fill=True, interpolate='cubic', style=LightGreenStyle)
# adding the random
chart.add('A', [10, 30,  5, 16, 13, 3,  7])
chart.add('B', [25, 2,  3,  4,  5, 7, 12])
chart.add('C', [6, 10, 9,  7,  3, 15,  0])
chart.add('D', [2,  3, 5,  4, 12, 18,  5])
chart.add('E', [7,  4, 4,  1,  2, 25, 0])
chart.render_to_file('style_chart 1.svg')
python

Pygal provides 14 types of built-in styles, including the following:

  • Default

    1
    2
    from pygal.style import DefaultStyle
    chart = pygal.StackedLine(fill=True, interpolate='cubic', style=DefaultStyle
    python
  • Neon

    1
    2
     pygal.style import NeonStyle
    chart = pygal.StackedLine(fill=True, interpolate='cubic', style=NeonStyle)
    python
  • Light Solarized

    1
    2
    from pygal.style import LightSolarizedStyle
    chart = pygal.StackedLine(fill=True, interpolate='cubic', style=LightSolarizedStyle)
    python
  • Red Blue

    1
    2
    from pygal.style import RedBlueStyle
    chart = pygal.StackedLine(fill=True, interpolate='cubic', style=RedBlueStyle)
    python
  • Turquoise

    1
    2
    from pygal.style import TurquoiseStyle
    chart = pygal.StackedLine(fill=True, interpolate='cubic', style=TurquoiseStyle)
    python

Parametric Style

A parametric style is initiated with a default color, and other shades are generated from that color.

1
2
3
4
5
6
7
8
9
10
11
# import lightenstyle theme
from pygal.style import LightenStyle
dark_lighten_style = LightenStyle('#336676')
# creating the object
chart = pygal.StackedLine(fill=True, interpolate='cubic', style=dark_lighten_style)
chart.add('A', [10, 3,  5, 16, 13, 3,  8])
chart.add('B', [50, 52,  3,  2,  5, 7, 27])
chart.add('C', [6, 10, 79,  7,  3, 1,  7])
chart.add('D', [2,  3, 45,  9, 12, 9,  5])
chart.add('E', [7,  4, 22,  41,  82, .50, 5])
chart.render_to_file('parameterized_chart.svg')
python

There are five types of parametric styles in pygal.

  • Dark style

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # importing the dark style
    from pygal.style import DarkStyle
    # creating the object
    chart = pygal.StackedLine(fill=True, interpolate='cubic', style=DarkStyle)
    # adding random values
    chart.add('A', [10, 30,  5, 16, 13, 3,  7])
    chart.add('B', [25, 2,  3,  4,  5, 7, 12])
    chart.add('C', [6, 10, 9,  7,  3, 15,  0])
    chart.add('D', [2,  3, 5,  4, 12, 18,  5])
    chart.add('E', [7,  4, 4,  1,  2, 25, 0])
    chart.render_to_file('style_chart.svg')
    python

  • Saturate style

    1
    2
    3
    from pygal.style import SaturateStyle
    saturate_style = SaturateStyle('#609f86')
    chart = pygal.StackedLine(fill=True, interpolate='cubic', style=saturate_style)
    python
  • Rotate style

    1
    2
    3
    from pygal.style import RotateStyle
    dark_rotate_style = RotateStyle('#9e6ffe')
    chart = pygal.StackedLine(fill=True, interpolate='cubic', style=dark_rotate_style)
    python
  • Lighten Style

    1
    2
    3
    from pygal.style import LightenStyle
    dark_lighten_style = LightenStyle('#004466')
    chart = pygal.StackedLine(fill=True, interpolate='cubic', style=dark_lighten_style)
    python
  • Desaturate style

    1
    2
    3
    from pygal.style import DesaturateStyle
    desaturate_style = DesaturateStyle('#8322dd', step=8)
    chart = pygal.StackedLine(fill=True, interpolate='cubic', style=desaturate_style)
    python

Custom Style

We will now look at how to customize a chart using the style class .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import pygal
# importing the style object from pygal.style
from pygal.style import Style
# customizing the plot using the properties of custom_style object.
custom_style = Style(
  background='transparent',
  plot_background='transparent',
  foreground='#53E89B',
  foreground_strong='#53A0E8',
  foreground_subtle='#630C0D',
  opacity='.6',
  opacity_hover='.9',
  transition='400ms ease-in',
  colors=('#E853A0', '#E8537A', '#E95355', '#E87653', '#E89B53'))
# creating the object
chart = pygal.StackedLine(fill=True, interpolate='cubic', style=custom_style)
# adding the values
chart.add('A', [1, 3,  5, 16, 13, 3,  7])
chart.add('B', [5, 2,  23,  2,  5, 7, 17])
chart.add('C', [6, 10, 9,  57,  3, 1,  0])
chart.add('D', [2,  3, 45,  9, 12, 0,  5])
chart.add('E', [7,  4, 2,  1,  2, 10, 0])
# render the file
chart.render_to_file('custom_style_chart.svg')
python

Some properties you need to remember which are supported by the style class:

PropertiesDescription
plot_backgroundThe color of the chart area background
backgroundThe color of the image background
foregroundThe main foregrond color
font_familyThe main font family
label_font_familyThe label font family
value_font_familyThe print_values font family
title_font_familyThe title font family
value_font_sizeThe print_values font size
tooltip_font_sizeThe tooltip font size
title_font_sizeThe title font size
legend_font_sizeThe legend font size
opacityThe opacity of chart element
colorsThe series color list
value_colorsThe print_values color list

Conclusion

In this tutorial, we used the pygal library to plot resourceful, dynamic, and interactive visualizations using different types of methods and custom styles. We also plotted on a world map using the pygal_maps_world package available in Python, and we saw how easy it is to make SVGTs in pygal. After reading this guide, you should have all the knowledge needed to create visually appealing graphs and charts with Python pygal.

Feel free to ask me any questions at CodeAlphabet.

0