Charts in Pygal
See how Pygal - a Python API used to build Scalar Vector Graphic (SVG) graphs and charts - can visualize data interactively and dynamically.
Feb 5, 2020 • 16 Minute Read
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:
pip install pygal
- conda Install: To install using conda, open the terminal and run the following command:
conda install -c conda-forge pygal
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 .
#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')
The rendered file will be saved in the current directory.
Horizontal Line
We will plot the same data from the example above horizontally.
# 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')
Stacked Line Chart.
# 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')
Bar Graphs
Basic Example
# 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()
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.
# 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')
Horizontal Multiple Series Bar Chart
# 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')
Pie Charts
We will now learn how to plot basic pie charts.
Basic Example
# 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')
Multiple Series Pie
#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')
Donut
# 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')
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:
pip install pygal_maps_world
Basic Example
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')
Adding Values to Map
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()
For a list of country codes, see the Pygal documentation .
Continents Chart
In pygal, we also have access to continents as well.
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')
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
# 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')
Pygal provides 14 types of built-in styles, including the following:
-
Default
from pygal.style import DefaultStyle chart = pygal.StackedLine(fill=True, interpolate='cubic', style=DefaultStyle
-
Neon
pygal.style import NeonStyle chart = pygal.StackedLine(fill=True, interpolate='cubic', style=NeonStyle)
-
Light Solarized
from pygal.style import LightSolarizedStyle chart = pygal.StackedLine(fill=True, interpolate='cubic', style=LightSolarizedStyle)
-
Red Blue
from pygal.style import RedBlueStyle chart = pygal.StackedLine(fill=True, interpolate='cubic', style=RedBlueStyle)
-
Turquoise
from pygal.style import TurquoiseStyle chart = pygal.StackedLine(fill=True, interpolate='cubic', style=TurquoiseStyle)
-
-
-
-
Parametric Style
A parametric style is initiated with a default color, and other shades are generated from that color.
# 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')
There are five types of parametric styles in pygal.
-
Dark style
# 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')
-
Saturate style
from pygal.style import SaturateStyle saturate_style = SaturateStyle('#609f86') chart = pygal.StackedLine(fill=True, interpolate='cubic', style=saturate_style)
-
Rotate style
from pygal.style import RotateStyle dark_rotate_style = RotateStyle('#9e6ffe') chart = pygal.StackedLine(fill=True, interpolate='cubic', style=dark_rotate_style)
-
Lighten Style
from pygal.style import LightenStyle dark_lighten_style = LightenStyle('#004466') chart = pygal.StackedLine(fill=True, interpolate='cubic', style=dark_lighten_style)
-
Desaturate style
from pygal.style import DesaturateStyle desaturate_style = DesaturateStyle('#8322dd', step=8) chart = pygal.StackedLine(fill=True, interpolate='cubic', style=desaturate_style)
-
-
-
-
Custom Style
We will now look at how to customize a chart using the style class .
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')
Some properties you need to remember which are supported by the style class:
Properties | Description |
---|---|
plot_background | The color of the chart area background |
background | The color of the image background |
foreground | The main foregrond color |
font_family | The main font family |
label_font_family | The label font family |
value_font_family | The print_values font family |
title_font_family | The title font family |
value_font_size | The print_values font size |
tooltip_font_size | The tooltip font size |
title_font_size | The title font size |
legend_font_size | The legend font size |
opacity | The opacity of chart element |
colors | The series color list |
value_colors | The 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.