Print

41 of 100: Dot plot in matplotlib

At the beginning of the year I challenged myself to create all 100 visualizations using python and matplotlib from the 1 dataset,100 visualizations project and I am sharing with you the code for all the visualizations.

Note: Data Viz Project is copyright Ferdio and available under a Creative Commons Attribution – Non Commercial – No Derivatives 4.0 International license. I asked Ferdio and they told me they used a Design tool to create all the plots.

Collaborate

There are a ton of improvements that can be made on the code, so let me know in the comments any improvements you make and I will update the post accordingly!

This is the original viz that we are trying to recreate in matplotlib:

Import the packages

We will need the following packages:

import matplotlib.pyplot as plt
import pandas as pd

Generate the data

We could actually go from numpy to matplotlib, but most data projects use pandas to transform the data, so I am using a pandas dataframe as the starting point.


color_dict = {"Norway": "#2B314D", "Denmark": "#A54836", "Sweden": "#5375D4", }

xy_ticklabel_color, xy_label_color,  ='#101628',"#101628", 

data = {
    "year": [2004, 2022, 2004, 2022, 2004, 2022],
    "countries" : [ "Denmark", "Denmark", "Norway", "Norway","Sweden", "Sweden",],
    "sites": [4,10,5,8,13,15]
}
df= pd.DataFrame(data)
indexyearcountriessites
02004Sweden13
12022Sweden15
22004Denmark4
32022Denmark10
42004Norway5
52022Norway8

We need to create the country codes, colors and then sort the data.

df['ctry_code'] = df.countries.astype(str).str[:2].astype(str).str.upper()
df = df.sort_values([ 'countries'], ascending=True ).reset_index(drop=True)
#map the colors of a dict to a dataframe
df['color']= df.countries.map(color_dict)
indexyearcountriessitesctry_codecolor
02004Denmark4DE#A54836
12022Denmark10DE#A54836
22004Norway5NO#2B314D
32022Norway8NO#2B314D
42004Sweden13SW#5375D4
52022Sweden15SW#5375D4

Define the variables

nr_years = df.year.unique() 
colors = df.color

Plot the chart

fig, axes = plt.subplots(ncols = df.year.nunique(), nrows = 1, figsize=(6,5),sharex=True, sharey=True, facecolor = "#FFFFFF", zorder= 1)
fig.tight_layout(pad=6.0)

for yr, ax  in zip(nr_years, axes.ravel()):

    temp_df = df[df.year ==yr]
    x = temp_df.ctry_code
    y = temp_df.sites
    for value, color, count in zip(x, colors, y):
        ax.plot([value]*count, list(range(count)), 'co', ms=10, linestyle='', cfig, axes = plt.subplots(ncols = df.year.nunique(), nrows = 1, figsize=(6,5),sharex=True, sharey=True, facecolor = "#FFFFFF", zorder= 1)
fig.tight_layout(pad=6.0)

for yr, ax  in zip(nr_years, axes.ravel()):

    temp_df = df[df.year ==yr]
    x = temp_df.ctry_code
    y = temp_df.sites
    for value, color, count in zip(x, colors[1::2], y):
        ax.plot([value]*count, list(range(count)), 'o', ms=10, linestyle='', color=color)
   
  
    ax.set_yticklabels([])
    ax.tick_params(axis='both', which='both',labelsize=12,length=0,color= xy_ticklabel_color,  pad =13)
    ax.spines[['top', 'left','bottom', 'right']].set_visible(False)
    ax.set_xlabel(yr,color = xy_label_color, size = 14, weight="bold")
    ax.xaxis.set_label_coords(0.5, -0.2)
  

The result:

41 of 100: Dot plot in matplotlib
Was this helpful?

Reader Interactions

Leave a Reply

Your email address will not be published. Required fields are marked *

Table of Contents