from hdx.utilities.easy_logging import setup_logging
from hdx.api.configuration import Configuration
from hdx.data.dataset import Dataset
import pandas as pd
Day 19: Smooth
This time, I’ll plot the World Food Programme Prices data. First, we get data from the ’‘’Global WFP Food Prices’’ dataset from the HDX API. and remove the first row which contains tags.
# setup
setup_logging()
Configuration.create(= "prod",
hdx_site ="@gnoblet_30DayChartChallenge",
user_agent= True)
hdx_read_only
= Dataset.read_from_hdx("global-wfp-food-prices")
dataset = dataset.get_resource()['url']
url
# get csv from url
= pd.read_csv(url, dtype = str)
df
# remove first row
= df.iloc[1:] df
2025-06-18 15:41:53.844 | INFO | hdx.api.configuration:__init__:88 - No HDX base configuration parameter. Using default base configuration file: /opt/hostedtoolcache/Python/3.10.18/x64/lib/python3.10/site-packages/hdx/api/hdx_base_configuration.yaml. 2025-06-18 15:41:53.845 | INFO | hdx.api.configuration:__init__:91 - Loading HDX base configuration from: /opt/hostedtoolcache/Python/3.10.18/x64/lib/python3.10/site-packages/hdx/api/hdx_base_configuration.yaml 2025-06-18 15:41:53.860 | INFO | hdx.api.configuration:__init__:122 - No HDX configuration parameter and no configuration file at default path: /home/runner/.hdx_configuration.yaml. 2025-06-18 15:41:53.861 | INFO | hdx.api.configuration:__init__:202 - Read only access to HDX: True
Let’s keep only Sub-Saharan countries in the West African region (using XOF, recorded as such in the dataset). Let’s also focus on the local prices for rice.
# keep only Sub-Saharan countries curreency being set to XOF
= df[df['currency'] == 'XOF']
df
# keep only local prices for rice
= df[df['commodity_id'] == '71'] df
There is some needed data wrangling now since there are different units, and in particular where the unit is 1KG, only KG is written in column ‘unit’.
# split at the first space
= df['unit'].str.split(' ', n = 1, expand=True)
splits
# If the first part is not numeric, move it to the second part and set the first to '0'
= ~splits[0].str.isnumeric()
mask_text_only 1] = splits.loc[mask_text_only, 0]
splits.loc[mask_text_only, 0] = '1'
splits.loc[mask_text_only,
# Fill NaN in the second part with None or ''
1] = splits[1].fillna('')
splits[
# Assign columns
'div'] = splits[0].astype(int)
df['unit_only'] = splits[1]
df[
# price as double
'price'] = df['price'].astype(float)
df[
# case_when
# if unit_only is KG, divide price by div
# if unit_only is marmite, divide price by 2.5 (FAO: marmite is 2.5kg, seems to be in Haiti only, can be removed eventually since HTI is not XOF)
'price_kg'] = df.apply(lambda x: x['price'] / x['div'] if x['unit_only'] == 'KG' else x['price'] / 2.5, axis=1) df[
Now, before I move on to plot, I want to get the median price by country and date, and get neat country names. For this, I need to convert the date column to datetime, summarize and get unique median price by countryiso3 and date, and add country names from a wonderful iso dictionary.
'date'] = pd.to_datetime(df['date'])
df[= df.sort_values('date')
df
# summarize and get unique median price by countryiso3 and date
= df.groupby(['countryiso3', 'date'])['price_kg'].median().reset_index() df
# add country names from iso dictionary
= {
iso 'BEN': 'Benin',
'BFA': 'Burkina Faso',
'CIV': 'Ivory Coast',
'GNB': 'Guinea-Bissau',
'MLI': 'Mali',
'NER': 'Niger',
'SEN': 'Senegal'
}
'country_name'] = df['countryiso3'].map(iso) df[
On to the plot! Using seaborn
now we will plot time series of prices using small multiples by country. Let’s load the packages needed and set up the theme.
# load libraries
import seaborn as sns
import matplotlib.dates as mdates
import textwrap
import matplotlib.pyplot as plt
# set up a theme
sns.set_theme(= 'whitegrid',
style = 'Carlito',
font = {
rc "grid.linewidth": 0.3,
'figure.figsize':(9,6)
} )
There are only seven countries in this dataset. I add dummy rows to be able to plot empty countries first that will leave space for the plot title on the basis of a 3-column row. There may very well be more elegant solutions but I couldn’t find any.
The plot follows this structure: - use sns.relplot to plot each year’s time series in its own facet; - loop through each facet to add all countries except the dummy ones.
# add dummy rows to plot emoty countries first
= pd.DataFrame({
dummy_rows 'date': [df['date'].min(), df['date'].min()],
'price_kg': [None, None],
'country_name': ['cty1', 'cty2']
})= pd.concat([dummy_rows, df], ignore_index=True)
df2
# plot each year's time series in its own facet
= sns.relplot(
g = df2,
data = "date",
x = "price_kg",
y = "country_name",
col = "country_name",
hue = "line",
kind = "Set2",
palette = 4,
linewidth = 5,
zorder = 3,
col_wrap = 2,
height = 1.5,
aspect = False,
legend = ['cty1', 'cty2'] + sorted(df['country_name'].unique())
col_order
)# loop through each facet
for country_name, ax in g.axes_dict.items():
if country_name in ['cty1', 'cty2']:
# Hide axes for dummy facets
'off')
ax.axis(else:
# Your normal plotting code
.05, .93, country_name, transform = ax.transAxes)
ax.text(
sns.lineplot(= df2[df2['country_name'] != country_name],
data = "date",
x = "price_kg",
y = "country_name",
units = None,
estimator = "black",
color = 0.2,
linewidth = ax
ax )
/tmp/ipykernel_9625/3260248810.py:7: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation. 2025-06-18 15:41:57.746 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:57.752 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:57.753 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:57.755 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:57.756 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:57.757 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:57.776 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:57.781 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:57.809 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:57.837 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:57.865 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:57.893 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:57.921 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:57.948 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:57.978 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.331 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.333 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.335 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.448 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.450 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.451 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.452 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.453 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.455 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.456 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.461 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.844 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.846 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.857 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.882 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.884 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.885 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.906 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.908 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.911 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.913 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.914 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.916 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.939 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.940 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.941 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.952 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.960 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.961 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.963 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.964 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.965 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.967 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.968 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.975 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.980 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.981 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:58.983 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.000 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.002 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.003 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.005 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.006 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.008 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.009 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.016 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.019 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.020 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.023 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.026 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.027 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.028 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.045 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.047 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.048 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.050 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.051 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.053 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.054 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.062 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.067 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.068 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.069 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.083 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.084 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.085 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.087 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.088 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.090 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.100 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.112 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.124 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.136 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.149 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.160 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.173 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.179 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.180 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.181 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.182 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.184 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.185 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.186 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.191 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.194 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.210 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.224 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.241 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.255 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.270 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.459 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.460 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.461 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.463 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.464 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.465 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.467 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.478 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.479 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.490 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.503 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.504 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.506 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.517 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.529 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.530 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.533 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.536 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.537 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.538 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.549 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.562 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.564 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.565 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.571 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.572 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.574 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.575 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.576 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.577 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.578 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.583 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.586 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.591 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.593 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.594 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.596 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.597 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.599 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.600 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.607 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.612 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.613 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.615 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.628 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.634 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.635 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.637 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.638 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.640 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.641 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.642 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.649 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.652 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.653 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.656 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.659 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.660 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.661 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.674 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.680 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.681 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.683 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.684 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.686 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.687 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.688 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.695 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.700 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.702 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.703 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found.
Now that I got the base plot, I can add some nice touches. First, I want to set the x-axis to show only years, remove titles and set the y-axis label to XOF.
# format x-axis to show only years
for ax in g.axes.flatten():
ax.xaxis.set_major_locator(mdates.YearLocator())'%Y'))
ax.xaxis.set_major_formatter(mdates.DateFormatter(for label in ax.get_xticklabels():
0)
label.set_rotation('center')
label.set_horizontalalignment(# Enable grid only for major ticks (years)
='major', axis='x', linestyle='-', linewidth=0.2)
ax.grid(which
# tweak the supporting aspects of the plot
"")
g.set_titles("", "XOF") g.set_axis_labels(
Second, it’s time to set titles, caption, etc.
# some layout style aka titles and caption
= sns.color_palette("Set2")
palette = palette[0]
title_color = "How smooth are changes in local rice prices in Western Sub-Saharan Africa?"
title = "The graph displays median prices of local rice for 7 sub-saharan countries from 2022 to today, where XOF is the main currency."
subtitle = "Data: HDX - WFP Food Prices | Viz: @gnoblet"
caption # wrap characters and then add text
= "\n".join(textwrap.wrap(title, width = 35))
title_w = "\n".join(textwrap.wrap(subtitle, width = 50))
subtitle_w 0.05, 0.9, title_w, fontsize = 20, color = title_color, wrap = True)
plt.figtext(0.05, 0.75, subtitle_w, fontsize = 16, color = 'black', wrap = True)
plt.figtext(0.05, 0.70, caption, fontsize = 12, color = 'black', wrap = True) plt.figtext(
Text(0.05, 0.7, 'Data: HDX - WFP Food Prices | Viz: @gnoblet')
2025-06-18 15:41:59.831 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.837 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.838 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.839 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.840 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.842 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.843 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.844 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.845 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.846 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.847 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.849 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.850 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.852 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.856 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.861 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.862 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.863 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.865 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.866 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.868 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.869 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.871 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.872 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.873 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.874 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.876 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.877 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.878 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.880 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.881 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.882 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.883 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.884 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.885 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.887 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.889 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.891 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.892 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.893 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.895 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.896 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.897 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.899 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.900 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.902 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.903 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found.
<Figure size 864x576 with 0 Axes>
Now, we eventually would like to save this plot.
# save plot
'day_19.png', dpi = 300, bbox_inches = 'tight')
g.figure.savefig(
plt.show()# close plot
plt.close()
2025-06-18 15:41:59.923 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.925 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.930 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.931 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.932 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.935 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.937 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.945 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.952 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.960 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:41:59.968 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.031 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.032 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.034 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.039 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.040 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.041 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.043 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.044 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.047 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.048 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.050 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.052 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.060 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.061 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.070 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.071 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.077 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.079 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.082 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.084 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.085 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.093 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found. 2025-06-18 15:42:00.095 | WARNING | matplotlib.font_manager:_find_fonts_by_props:1431 - findfont: Font family 'Carlito' not found.
Final Plot
Notes
This visualization shows the evolution of local rice prices across seven West African countries that use XOF as their currency.
Data source: World Food Programme Food Prices dataset (via Humanitarian Data Exchange API)
Tools used: - hdx (for accessing the Humanitarian Data Exchange API) - pandas (for data manipulation) - seaborn (for visualization) - matplotlib (for plot customization)
The visualization employs small multiples (faceted plots) to compare price trends across countries while maintaining context with faint background lines showing other countries’ trends. The analysis addresses data quality issues by standardizing units (converting to price per kg) and calculating median prices by country and date to smooth inconsistencies in the original data.