Matplotlib Tutorial: Life Expectancy & Genocide

Background

In this tutorial, I’m creating a horrifying data visualization about how life expectancy at birth changed in Bangladesh, Rwanda, and Cambodia during their genocides. I’m using data from the World Bank open data platform, which you should check out.

If you like this tutorial and visualization, make sure to sign up for my free newsletter, The Data Sensei.


Step 1: Imports

We don’t need anything special for this tutorial

<span>import</span> <span>pandas</span> <span>as</span> <span>pd</span>
<span>import</span> <span>seaborn</span> <span>as</span> <span>sns</span>
<span>import</span> <span>matplotlib.pyplot</span> <span>as</span> <span>plt</span>
<span>from</span> <span>matplotlib.patches</span> <span>import</span> <span>Rectangle</span>
<span>from</span> <span>matplotlib.lines</span> <span>import</span> <span>Line2D</span>
<span>import</span> <span>pandas</span> <span>as</span> <span>pd</span>
<span>import</span> <span>seaborn</span> <span>as</span> <span>sns</span>
<span>import</span> <span>matplotlib.pyplot</span> <span>as</span> <span>plt</span>

<span>from</span> <span>matplotlib.patches</span> <span>import</span> <span>Rectangle</span>
<span>from</span> <span>matplotlib.lines</span> <span>import</span> <span>Line2D</span>
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt from matplotlib.patches import Rectangle from matplotlib.lines import Line2D

Enter fullscreen mode Exit fullscreen mode


Step 2: Styling

I always use Seaborn to create a style that suits the data. You can’t use cheerful colors when you design a plot with data like what we have in this tutorial. Since I still want a bright chart, I only use grayscale colors.

<span>font_family</span> <span>=</span> <span>"</span><span>DejaVu Serif</span><span>"</span>
<span>background_color</span> <span>=</span> <span>"</span><span>#e5e5e5</span><span>"</span>
<span>light_gray</span> <span>=</span> <span>"</span><span>#858585</span><span>"</span>
<span>dark_gray</span> <span>=</span> <span>"</span><span>#454545</span><span>"</span>
<span>text_color</span> <span>=</span> <span>"</span><span>#000000</span><span>"</span>
<span>sns</span><span>.</span><span>set_style</span><span>({</span>
<span>"</span><span>axes.facecolor</span><span>"</span><span>:</span> <span>background_color</span> <span>+</span> <span>"</span><span>00</span><span>"</span><span>,</span>
<span>"</span><span>figure.facecolor</span><span>"</span><span>:</span> <span>background_color</span><span>,</span>
<span>"</span><span>axes.edgecolor</span><span>"</span><span>:</span> <span>text_color</span><span>,</span>
<span>"</span><span>axes.grid</span><span>"</span><span>:</span> <span>True</span><span>,</span>
<span>"</span><span>axes.axisbelow</span><span>"</span><span>:</span> <span>True</span><span>,</span>
<span>"</span><span>grid.color</span><span>"</span><span>:</span> <span>light_gray</span><span>,</span>
<span>"</span><span>text.color</span><span>"</span><span>:</span> <span>text_color</span><span>,</span>
<span>"</span><span>font.family</span><span>"</span><span>:</span> <span>font_family</span><span>,</span>
<span>"</span><span>xtick.color</span><span>"</span><span>:</span> <span>text_color</span><span>,</span>
<span>"</span><span>ytick.color</span><span>"</span><span>:</span> <span>text_color</span><span>,</span>
<span>"</span><span>xtick.bottom</span><span>"</span><span>:</span> <span>False</span><span>,</span>
<span>"</span><span>xtick.top</span><span>"</span><span>:</span> <span>False</span><span>,</span>
<span>"</span><span>ytick.left</span><span>"</span><span>:</span> <span>False</span><span>,</span>
<span>"</span><span>ytick.right</span><span>"</span><span>:</span> <span>False</span><span>,</span>
<span>"</span><span>axes.spines.left</span><span>"</span><span>:</span> <span>False</span><span>,</span>
<span>"</span><span>axes.spines.bottom</span><span>"</span><span>:</span> <span>False</span><span>,</span>
<span>"</span><span>axes.spines.right</span><span>"</span><span>:</span> <span>False</span><span>,</span>
<span>"</span><span>axes.spines.top</span><span>"</span><span>:</span> <span>False</span><span>,</span>
<span>})</span>
<span>font_family</span> <span>=</span> <span>"</span><span>DejaVu Serif</span><span>"</span>
<span>background_color</span> <span>=</span> <span>"</span><span>#e5e5e5</span><span>"</span>
<span>light_gray</span> <span>=</span> <span>"</span><span>#858585</span><span>"</span>
<span>dark_gray</span> <span>=</span> <span>"</span><span>#454545</span><span>"</span>
<span>text_color</span> <span>=</span> <span>"</span><span>#000000</span><span>"</span>

<span>sns</span><span>.</span><span>set_style</span><span>({</span>
    <span>"</span><span>axes.facecolor</span><span>"</span><span>:</span> <span>background_color</span> <span>+</span> <span>"</span><span>00</span><span>"</span><span>,</span>
    <span>"</span><span>figure.facecolor</span><span>"</span><span>:</span> <span>background_color</span><span>,</span>
    <span>"</span><span>axes.edgecolor</span><span>"</span><span>:</span> <span>text_color</span><span>,</span>
    <span>"</span><span>axes.grid</span><span>"</span><span>:</span> <span>True</span><span>,</span>
    <span>"</span><span>axes.axisbelow</span><span>"</span><span>:</span> <span>True</span><span>,</span>
    <span>"</span><span>grid.color</span><span>"</span><span>:</span> <span>light_gray</span><span>,</span>
    <span>"</span><span>text.color</span><span>"</span><span>:</span> <span>text_color</span><span>,</span>
    <span>"</span><span>font.family</span><span>"</span><span>:</span> <span>font_family</span><span>,</span>

    <span>"</span><span>xtick.color</span><span>"</span><span>:</span> <span>text_color</span><span>,</span>
    <span>"</span><span>ytick.color</span><span>"</span><span>:</span> <span>text_color</span><span>,</span>
    <span>"</span><span>xtick.bottom</span><span>"</span><span>:</span> <span>False</span><span>,</span>
    <span>"</span><span>xtick.top</span><span>"</span><span>:</span> <span>False</span><span>,</span>
    <span>"</span><span>ytick.left</span><span>"</span><span>:</span> <span>False</span><span>,</span>
    <span>"</span><span>ytick.right</span><span>"</span><span>:</span> <span>False</span><span>,</span>

    <span>"</span><span>axes.spines.left</span><span>"</span><span>:</span> <span>False</span><span>,</span>
    <span>"</span><span>axes.spines.bottom</span><span>"</span><span>:</span> <span>False</span><span>,</span>
    <span>"</span><span>axes.spines.right</span><span>"</span><span>:</span> <span>False</span><span>,</span>
    <span>"</span><span>axes.spines.top</span><span>"</span><span>:</span> <span>False</span><span>,</span>
<span>})</span>
font_family = "DejaVu Serif" background_color = "#e5e5e5" light_gray = "#858585" dark_gray = "#454545" text_color = "#000000" sns.set_style({ "axes.facecolor": background_color + "00", "figure.facecolor": background_color, "axes.edgecolor": text_color, "axes.grid": True, "axes.axisbelow": True, "grid.color": light_gray, "text.color": text_color, "font.family": font_family, "xtick.color": text_color, "ytick.color": text_color, "xtick.bottom": False, "xtick.top": False, "ytick.left": False, "ytick.right": False, "axes.spines.left": False, "axes.spines.bottom": False, "axes.spines.right": False, "axes.spines.top": False, })

Enter fullscreen mode Exit fullscreen mode


Step 3: Helper functions

When I create plots, I always create reusable functions, but in this tutorial, I only have one. It’s a really simple data visualization, so I don’t need more.

<span>def</span> <span>color</span><span>(</span><span>v</span><span>,</span> <span>threshold</span><span>=</span><span>38</span><span>):</span>
<span>return</span> <span>light_gray</span> <span>if</span> <span>v</span> <span>></span> <span>threshold</span> <span>else</span> <span>dark_gray</span>
<span>def</span> <span>color</span><span>(</span><span>v</span><span>,</span> <span>threshold</span><span>=</span><span>38</span><span>):</span>
    <span>return</span> <span>light_gray</span> <span>if</span> <span>v</span> <span>></span> <span>threshold</span> <span>else</span> <span>dark_gray</span>
def color(v, threshold=38): return light_gray if v > threshold else dark_gray

Enter fullscreen mode Exit fullscreen mode


Step 4: Shared styles

Defining shared styles you reuse in several places outside the main functions is a good idea. It’s always annoying when you have to change things like color and font sizes in multiple locations, and it’s easy to introduce a design bug that you don’t find in time.

<span>BAR_STYLE</span> <span>=</span> <span>{</span><span>"</span><span>width</span><span>"</span><span>:</span> <span>1</span><span>,</span> <span>"</span><span>edgecolor</span><span>"</span><span>:</span> <span>text_color</span><span>}</span>
<span>LINE_STYLE</span> <span>=</span> <span>{</span><span>"</span><span>zorder</span><span>"</span><span>:</span> <span>-</span><span>10</span><span>,</span> <span>"</span><span>color</span><span>"</span><span>:</span> <span>dark_gray</span><span>,</span> <span>"</span><span>linewidth</span><span>"</span><span>:</span> <span>2</span><span>}</span>
<span>YEAR_STYLE</span> <span>=</span> <span>{</span><span>"</span><span>va</span><span>"</span><span>:</span> <span>"</span><span>center</span><span>"</span><span>,</span> <span>"</span><span>fontsize</span><span>"</span><span>:</span> <span>28</span><span>,</span> <span>"</span><span>fontfamily</span><span>"</span><span>:</span> <span>"</span><span>PT Serif Caption</span><span>"</span><span>}</span>
<span>INFO_STYLE</span> <span>=</span> <span>{</span><span>"</span><span>ha</span><span>"</span><span>:</span> <span>"</span><span>left</span><span>"</span><span>,</span> <span>"</span><span>va</span><span>"</span><span>:</span> <span>"</span><span>top</span><span>"</span><span>,</span> <span>"</span><span>fontsize</span><span>"</span><span>:</span> <span>24</span><span>,</span> <span>"</span><span>linespacing</span><span>"</span><span>:</span> <span>1.8</span><span>,</span> <span>"</span><span>color</span><span>"</span><span>:</span> <span>dark_gray</span><span>}</span>
<span>BAR_STYLE</span> <span>=</span> <span>{</span><span>"</span><span>width</span><span>"</span><span>:</span> <span>1</span><span>,</span> <span>"</span><span>edgecolor</span><span>"</span><span>:</span> <span>text_color</span><span>}</span>
<span>LINE_STYLE</span> <span>=</span> <span>{</span><span>"</span><span>zorder</span><span>"</span><span>:</span> <span>-</span><span>10</span><span>,</span> <span>"</span><span>color</span><span>"</span><span>:</span> <span>dark_gray</span><span>,</span> <span>"</span><span>linewidth</span><span>"</span><span>:</span> <span>2</span><span>}</span>
<span>YEAR_STYLE</span> <span>=</span> <span>{</span><span>"</span><span>va</span><span>"</span><span>:</span> <span>"</span><span>center</span><span>"</span><span>,</span> <span>"</span><span>fontsize</span><span>"</span><span>:</span> <span>28</span><span>,</span> <span>"</span><span>fontfamily</span><span>"</span><span>:</span> <span>"</span><span>PT Serif Caption</span><span>"</span><span>}</span>
<span>INFO_STYLE</span> <span>=</span> <span>{</span><span>"</span><span>ha</span><span>"</span><span>:</span> <span>"</span><span>left</span><span>"</span><span>,</span> <span>"</span><span>va</span><span>"</span><span>:</span> <span>"</span><span>top</span><span>"</span><span>,</span> <span>"</span><span>fontsize</span><span>"</span><span>:</span> <span>24</span><span>,</span> <span>"</span><span>linespacing</span><span>"</span><span>:</span> <span>1.8</span><span>,</span> <span>"</span><span>color</span><span>"</span><span>:</span> <span>dark_gray</span><span>}</span>
BAR_STYLE = {"width": 1, "edgecolor": text_color} LINE_STYLE = {"zorder": -10, "color": dark_gray, "linewidth": 2} YEAR_STYLE = {"va": "center", "fontsize": 28, "fontfamily": "PT Serif Caption"} INFO_STYLE = {"ha": "left", "va": "top", "fontsize": 24, "linespacing": 1.8, "color": dark_gray}

Enter fullscreen mode Exit fullscreen mode


Step 5: Loading data

I have created a preprocessed dataset so that you can focus on the Matplotlib code. The CSV has four columns, one for each country and the year of the values. The values represent life expectancy at birth, which means how long someone born that year can expect to live. As you will see, that value changes drastically over time.

<span>data</span> <span>=</span> <span>pd</span><span>.</span><span>read_csv</span><span>(</span>
<span>"</span><span>https://raw.githubusercontent.com/oscarleoo/matplotlib-tutorial-data/main/life_expectancy_genocide.csv</span><span>"</span>
<span>)</span>
<span>data</span> <span>=</span> <span>pd</span><span>.</span><span>read_csv</span><span>(</span>
    <span>"</span><span>https://raw.githubusercontent.com/oscarleoo/matplotlib-tutorial-data/main/life_expectancy_genocide.csv</span><span>"</span>
<span>)</span>
data = pd.read_csv( "https://raw.githubusercontent.com/oscarleoo/matplotlib-tutorial-data/main/life_expectancy_genocide.csv" )

Enter fullscreen mode Exit fullscreen mode


Step 6: Data visualization

Now, it’s time to create the actual chart. It’s a straightforward chart where I use Rectangle to draw the bars, and everything else basically adds information using lines and text. I’m using Rectangle instead of something like seaborn.barplot() because it gives me more control, and I don’t need subplots. With subplots, I find it more difficult to add custom styles.

There are some hard-coded values to decide the text position, but I’ve found that it’s faster than trying to automate the placement. All charts require some custom design to get the right feel.

<span>fig</span> <span>=</span> <span>plt</span><span>.</span><span>figure</span><span>(</span><span>figsize</span><span>=</span><span>(</span><span>30</span><span>,</span> <span>30</span><span>))</span>
<span>ax</span> <span>=</span> <span>fig</span><span>.</span><span>add_subplot</span><span>()</span>
<span>ax</span><span>.</span><span>set</span><span>(</span><span>ylim</span><span>=</span><span>(</span><span>-</span><span>68</span><span>,</span> <span>3.7</span><span>*</span><span>100</span><span>),</span> <span>xlim</span><span>=</span><span>(</span><span>-</span><span>2</span><span>,</span> <span>63</span><span>))</span>
<span># Add bars </span><span>for</span> <span>i</span><span>,</span> <span>row</span> <span>in</span> <span>data</span><span>.</span><span>iterrows</span><span>():</span>
<span>ax</span><span>.</span><span>add_artist</span><span>(</span><span>Rectangle</span><span>((</span><span>i</span><span>-</span><span>0.5</span><span>,</span> <span>200</span><span>),</span> <span>height</span><span>=</span><span>row</span><span>.</span><span>rwanda</span><span>,</span> <span>facecolor</span><span>=</span><span>color</span><span>(</span><span>row</span><span>.</span><span>rwanda</span><span>),</span> <span>**</span><span>BAR_STYLE</span><span>))</span>
<span>ax</span><span>.</span><span>add_artist</span><span>(</span><span>Rectangle</span><span>((</span><span>i</span><span>-</span><span>0.5</span><span>,</span> <span>100</span><span>),</span> <span>height</span><span>=</span><span>row</span><span>.</span><span>cambodia</span><span>,</span> <span>facecolor</span><span>=</span><span>color</span><span>(</span><span>row</span><span>.</span><span>cambodia</span><span>),</span> <span>**</span><span>BAR_STYLE</span><span>))</span>
<span>ax</span><span>.</span><span>add_artist</span><span>(</span><span>Rectangle</span><span>((</span><span>i</span><span>-</span><span>0.5</span><span>,</span> <span>0</span><span>),</span> <span>height</span><span>=</span><span>row</span><span>.</span><span>bangladesh</span><span>,</span> <span>facecolor</span><span>=</span><span>color</span><span>(</span><span>row</span><span>.</span><span>bangladesh</span><span>),</span> <span>**</span><span>BAR_STYLE</span><span>))</span>
<span># Add country names </span><span>ax</span><span>.</span><span>annotate</span><span>(</span><span>"</span><span>Rwanda</span><span>"</span><span>,</span> <span>(</span><span>-</span><span>0.5</span><span>,</span> <span>265</span><span>),</span> <span>ha</span><span>=</span><span>"</span><span>left</span><span>"</span><span>,</span> <span>va</span><span>=</span><span>"</span><span>bottom</span><span>"</span><span>,</span> <span>fontsize</span><span>=</span><span>48</span><span>)</span>
<span>ax</span><span>.</span><span>annotate</span><span>(</span><span>"</span><span>Cambodia</span><span>"</span><span>,</span> <span>(</span><span>-</span><span>0.5</span><span>,</span> <span>165</span><span>),</span> <span>ha</span><span>=</span><span>"</span><span>left</span><span>"</span><span>,</span> <span>va</span><span>=</span><span>"</span><span>bottom</span><span>"</span><span>,</span> <span>fontsize</span><span>=</span><span>48</span><span>)</span>
<span>ax</span><span>.</span><span>annotate</span><span>(</span><span>"</span><span>Bangladesh</span><span>"</span><span>,</span> <span>(</span><span>-</span><span>0.5</span><span>,</span> <span>65</span><span>),</span> <span>ha</span><span>=</span><span>"</span><span>left</span><span>"</span><span>,</span> <span>va</span><span>=</span><span>"</span><span>bottom</span><span>"</span><span>,</span> <span>fontsize</span><span>=</span><span>48</span><span>)</span>
<span># Tick formatting </span><span>ax</span><span>.</span><span>tick_params</span><span>(</span><span>labelsize</span><span>=</span><span>28</span><span>,</span> <span>pad</span><span>=</span><span>16</span><span>)</span>
<span>ax</span><span>.</span><span>set_xticks</span><span>([])</span>
<span>ax</span><span>.</span><span>set_yticks</span><span>(</span>
<span>ticks</span> <span>=</span> <span>[</span><span>0</span><span>,</span> <span>20</span><span>,</span> <span>40</span><span>,</span> <span>60</span><span>,</span> <span>100</span><span>,</span> <span>120</span><span>,</span> <span>140</span><span>,</span> <span>160</span><span>,</span> <span>200</span><span>,</span> <span>220</span><span>,</span> <span>240</span><span>,</span> <span>260</span><span>],</span>
<span>labels</span> <span>=</span> <span>[</span><span>"</span><span>0</span><span>"</span><span>,</span> <span>"</span><span>20</span><span>"</span><span>,</span> <span>"</span><span>40</span><span>"</span><span>,</span> <span>"</span><span>60</span><span>"</span><span>,</span> <span>"</span><span>0</span><span>"</span><span>,</span> <span>"</span><span>20</span><span>"</span><span>,</span> <span>"</span><span>40</span><span>"</span><span>,</span> <span>"</span><span>60</span><span>"</span><span>,</span> <span>"</span><span>0</span><span>"</span><span>,</span> <span>"</span><span>20</span><span>"</span><span>,</span> <span>"</span><span>40</span><span>"</span><span>,</span> <span>"</span><span>60</span><span>"</span><span>]</span>
<span>)</span>
<span># Add lines </span><span>ax</span><span>.</span><span>add_artist</span><span>(</span><span>Line2D</span><span>([</span><span>11</span><span>,</span> <span>11</span><span>,</span> <span>7</span><span>],</span> <span>[</span><span>0</span><span>,</span> <span>-</span><span>20</span><span>,</span> <span>-</span><span>20</span><span>],</span> <span>**</span><span>LINE_STYLE</span><span>))</span>
<span>ax</span><span>.</span><span>add_artist</span><span>(</span><span>Line2D</span><span>([</span><span>16.5</span><span>,</span> <span>16.5</span><span>,</span> <span>21</span><span>],</span> <span>[</span><span>100</span><span>,</span> <span>-</span><span>20</span><span>,</span> <span>-</span><span>20</span><span>],</span> <span>**</span><span>LINE_STYLE</span><span>))</span>
<span>ax</span><span>.</span><span>add_artist</span><span>(</span><span>Line2D</span><span>([</span><span>34</span><span>,</span> <span>34</span><span>,</span> <span>42</span><span>],</span> <span>[</span><span>200</span><span>,</span> <span>-</span><span>20</span><span>,</span> <span>-</span><span>20</span><span>],</span> <span>**</span><span>LINE_STYLE</span><span>))</span>
<span># Bangladesh info </span><span>ax</span><span>.</span><span>annotate</span><span>(</span><span>"</span><span>1971</span><span>"</span><span>,</span> <span>(</span><span>6.5</span><span>,</span> <span>-</span><span>20</span><span>),</span> <span>ha</span><span>=</span><span>"</span><span>right</span><span>"</span><span>,</span> <span>**</span><span>YEAR_STYLE</span><span>)</span>
<span>ax</span><span>.</span><span>annotate</span><span>(</span>
<span>"</span><span>Ethnic cleansing of</span><span>\n</span><span>"</span>
<span>"</span><span>Bengalis in East Pakistan during</span><span>\n</span><span>"</span>
<span>"</span><span>the Bangladesh Liberation War.</span><span>"</span><span>,</span> <span>(</span><span>3.8</span><span>,</span> <span>-</span><span>28</span><span>),</span> <span>**</span><span>INFO_STYLE</span>
<span>)</span>
<span># Cambodia info </span><span>ax</span><span>.</span><span>annotate</span><span>(</span><span>"</span><span>1975-1978</span><span>"</span><span>,</span> <span>(</span><span>21.5</span><span>,</span> <span>-</span><span>20</span><span>),</span> <span>ha</span><span>=</span><span>"</span><span>left</span><span>"</span><span>,</span> <span>**</span><span>YEAR_STYLE</span><span>)</span>
<span>ax</span><span>.</span><span>annotate</span><span>(</span>
<span>"</span><span>Systematic killing of Cambodian</span><span>\n</span><span>"</span>
<span>"</span><span>citizens by the Khmer Rouge under</span><span>\n</span><span>"</span>
<span>"</span><span>the leadership of Pol Pot.</span><span>"</span><span>,</span> <span>(</span><span>21.6</span><span>,</span> <span>-</span><span>28</span><span>),</span> <span>**</span><span>INFO_STYLE</span>
<span>)</span>
<span># Rwanda info </span><span>ax</span><span>.</span><span>annotate</span><span>(</span><span>"</span><span>1994</span><span>"</span><span>,</span> <span>(</span><span>42.5</span><span>,</span> <span>-</span><span>20</span><span>),</span> <span>ha</span><span>=</span><span>"</span><span>left</span><span>"</span><span>,</span> <span>**</span><span>YEAR_STYLE</span><span>)</span>
<span>ax</span><span>.</span><span>annotate</span><span>(</span>
<span>"</span><span>Hutu militias slaughter</span><span>\n</span><span>"</span>
<span>"</span><span>the Tutsi population</span><span>\n</span><span>"</span>
<span>"</span><span>in Rwanda</span><span>"</span><span>,</span> <span>(</span><span>42.6</span><span>,</span> <span>-</span><span>28</span><span>),</span> <span>**</span><span>INFO_STYLE</span>
<span>)</span>
<span># Title and source </span><span>title</span> <span>=</span> <span>"</span><span>Life Expectancy at Birth During Genocides</span><span>"</span>
<span>ax</span><span>.</span><span>annotate</span><span>(</span><span>title</span><span>,</span> <span>(</span><span>-</span><span>0.5</span><span>,</span> <span>320</span><span>),</span> <span>ha</span><span>=</span><span>"</span><span>left</span><span>"</span><span>,</span> <span>va</span><span>=</span><span>"</span><span>bottom</span><span>"</span><span>,</span> <span>fontsize</span><span>=</span><span>64</span><span>)</span>
<span>ax</span><span>.</span><span>annotate</span><span>(</span><span>"</span><span>Source: World Development Indicators</span><span>"</span><span>,</span> <span>(</span><span>-</span><span>0.5</span><span>,</span> <span>343</span><span>),</span> <span>ha</span><span>=</span><span>"</span><span>left</span><span>"</span><span>,</span> <span>va</span><span>=</span><span>"</span><span>bottom</span><span>"</span><span>,</span> <span>fontsize</span><span>=</span><span>32</span><span>,</span> <span>color</span><span>=</span><span>dark_gray</span><span>)</span>
<span>plt</span><span>.</span><span>show</span><span>()</span>
<span>fig</span> <span>=</span> <span>plt</span><span>.</span><span>figure</span><span>(</span><span>figsize</span><span>=</span><span>(</span><span>30</span><span>,</span> <span>30</span><span>))</span>
<span>ax</span> <span>=</span> <span>fig</span><span>.</span><span>add_subplot</span><span>()</span>
<span>ax</span><span>.</span><span>set</span><span>(</span><span>ylim</span><span>=</span><span>(</span><span>-</span><span>68</span><span>,</span> <span>3.7</span><span>*</span><span>100</span><span>),</span> <span>xlim</span><span>=</span><span>(</span><span>-</span><span>2</span><span>,</span> <span>63</span><span>))</span>

<span># Add bars </span><span>for</span> <span>i</span><span>,</span> <span>row</span> <span>in</span> <span>data</span><span>.</span><span>iterrows</span><span>():</span>
    <span>ax</span><span>.</span><span>add_artist</span><span>(</span><span>Rectangle</span><span>((</span><span>i</span><span>-</span><span>0.5</span><span>,</span> <span>200</span><span>),</span> <span>height</span><span>=</span><span>row</span><span>.</span><span>rwanda</span><span>,</span> <span>facecolor</span><span>=</span><span>color</span><span>(</span><span>row</span><span>.</span><span>rwanda</span><span>),</span> <span>**</span><span>BAR_STYLE</span><span>))</span>
    <span>ax</span><span>.</span><span>add_artist</span><span>(</span><span>Rectangle</span><span>((</span><span>i</span><span>-</span><span>0.5</span><span>,</span> <span>100</span><span>),</span> <span>height</span><span>=</span><span>row</span><span>.</span><span>cambodia</span><span>,</span> <span>facecolor</span><span>=</span><span>color</span><span>(</span><span>row</span><span>.</span><span>cambodia</span><span>),</span> <span>**</span><span>BAR_STYLE</span><span>))</span>
    <span>ax</span><span>.</span><span>add_artist</span><span>(</span><span>Rectangle</span><span>((</span><span>i</span><span>-</span><span>0.5</span><span>,</span> <span>0</span><span>),</span> <span>height</span><span>=</span><span>row</span><span>.</span><span>bangladesh</span><span>,</span> <span>facecolor</span><span>=</span><span>color</span><span>(</span><span>row</span><span>.</span><span>bangladesh</span><span>),</span> <span>**</span><span>BAR_STYLE</span><span>))</span>

<span># Add country names </span><span>ax</span><span>.</span><span>annotate</span><span>(</span><span>"</span><span>Rwanda</span><span>"</span><span>,</span> <span>(</span><span>-</span><span>0.5</span><span>,</span> <span>265</span><span>),</span> <span>ha</span><span>=</span><span>"</span><span>left</span><span>"</span><span>,</span> <span>va</span><span>=</span><span>"</span><span>bottom</span><span>"</span><span>,</span> <span>fontsize</span><span>=</span><span>48</span><span>)</span>
<span>ax</span><span>.</span><span>annotate</span><span>(</span><span>"</span><span>Cambodia</span><span>"</span><span>,</span> <span>(</span><span>-</span><span>0.5</span><span>,</span> <span>165</span><span>),</span> <span>ha</span><span>=</span><span>"</span><span>left</span><span>"</span><span>,</span> <span>va</span><span>=</span><span>"</span><span>bottom</span><span>"</span><span>,</span> <span>fontsize</span><span>=</span><span>48</span><span>)</span>
<span>ax</span><span>.</span><span>annotate</span><span>(</span><span>"</span><span>Bangladesh</span><span>"</span><span>,</span> <span>(</span><span>-</span><span>0.5</span><span>,</span> <span>65</span><span>),</span> <span>ha</span><span>=</span><span>"</span><span>left</span><span>"</span><span>,</span> <span>va</span><span>=</span><span>"</span><span>bottom</span><span>"</span><span>,</span> <span>fontsize</span><span>=</span><span>48</span><span>)</span>

<span># Tick formatting </span><span>ax</span><span>.</span><span>tick_params</span><span>(</span><span>labelsize</span><span>=</span><span>28</span><span>,</span> <span>pad</span><span>=</span><span>16</span><span>)</span>
<span>ax</span><span>.</span><span>set_xticks</span><span>([])</span>
<span>ax</span><span>.</span><span>set_yticks</span><span>(</span>
    <span>ticks</span> <span>=</span> <span>[</span><span>0</span><span>,</span> <span>20</span><span>,</span> <span>40</span><span>,</span> <span>60</span><span>,</span> <span>100</span><span>,</span> <span>120</span><span>,</span> <span>140</span><span>,</span> <span>160</span><span>,</span> <span>200</span><span>,</span> <span>220</span><span>,</span> <span>240</span><span>,</span> <span>260</span><span>],</span>
    <span>labels</span> <span>=</span> <span>[</span><span>"</span><span>0</span><span>"</span><span>,</span> <span>"</span><span>20</span><span>"</span><span>,</span> <span>"</span><span>40</span><span>"</span><span>,</span> <span>"</span><span>60</span><span>"</span><span>,</span> <span>"</span><span>0</span><span>"</span><span>,</span> <span>"</span><span>20</span><span>"</span><span>,</span> <span>"</span><span>40</span><span>"</span><span>,</span> <span>"</span><span>60</span><span>"</span><span>,</span> <span>"</span><span>0</span><span>"</span><span>,</span> <span>"</span><span>20</span><span>"</span><span>,</span> <span>"</span><span>40</span><span>"</span><span>,</span> <span>"</span><span>60</span><span>"</span><span>]</span>
<span>)</span>

<span># Add lines </span><span>ax</span><span>.</span><span>add_artist</span><span>(</span><span>Line2D</span><span>([</span><span>11</span><span>,</span> <span>11</span><span>,</span> <span>7</span><span>],</span> <span>[</span><span>0</span><span>,</span> <span>-</span><span>20</span><span>,</span> <span>-</span><span>20</span><span>],</span> <span>**</span><span>LINE_STYLE</span><span>))</span>
<span>ax</span><span>.</span><span>add_artist</span><span>(</span><span>Line2D</span><span>([</span><span>16.5</span><span>,</span> <span>16.5</span><span>,</span> <span>21</span><span>],</span> <span>[</span><span>100</span><span>,</span> <span>-</span><span>20</span><span>,</span> <span>-</span><span>20</span><span>],</span> <span>**</span><span>LINE_STYLE</span><span>))</span>
<span>ax</span><span>.</span><span>add_artist</span><span>(</span><span>Line2D</span><span>([</span><span>34</span><span>,</span> <span>34</span><span>,</span> <span>42</span><span>],</span> <span>[</span><span>200</span><span>,</span> <span>-</span><span>20</span><span>,</span> <span>-</span><span>20</span><span>],</span> <span>**</span><span>LINE_STYLE</span><span>))</span>

<span># Bangladesh info </span><span>ax</span><span>.</span><span>annotate</span><span>(</span><span>"</span><span>1971</span><span>"</span><span>,</span> <span>(</span><span>6.5</span><span>,</span> <span>-</span><span>20</span><span>),</span> <span>ha</span><span>=</span><span>"</span><span>right</span><span>"</span><span>,</span> <span>**</span><span>YEAR_STYLE</span><span>)</span>
<span>ax</span><span>.</span><span>annotate</span><span>(</span>
    <span>"</span><span>Ethnic cleansing of</span><span>\n</span><span>"</span>
    <span>"</span><span>Bengalis in East Pakistan during</span><span>\n</span><span>"</span>
    <span>"</span><span>the Bangladesh Liberation War.</span><span>"</span><span>,</span> <span>(</span><span>3.8</span><span>,</span> <span>-</span><span>28</span><span>),</span> <span>**</span><span>INFO_STYLE</span>
<span>)</span>

<span># Cambodia info </span><span>ax</span><span>.</span><span>annotate</span><span>(</span><span>"</span><span>1975-1978</span><span>"</span><span>,</span> <span>(</span><span>21.5</span><span>,</span> <span>-</span><span>20</span><span>),</span> <span>ha</span><span>=</span><span>"</span><span>left</span><span>"</span><span>,</span> <span>**</span><span>YEAR_STYLE</span><span>)</span>
<span>ax</span><span>.</span><span>annotate</span><span>(</span>
    <span>"</span><span>Systematic killing of Cambodian</span><span>\n</span><span>"</span>
    <span>"</span><span>citizens by the Khmer Rouge under</span><span>\n</span><span>"</span>
    <span>"</span><span>the leadership of Pol Pot.</span><span>"</span><span>,</span> <span>(</span><span>21.6</span><span>,</span> <span>-</span><span>28</span><span>),</span> <span>**</span><span>INFO_STYLE</span>
<span>)</span>

<span># Rwanda info </span><span>ax</span><span>.</span><span>annotate</span><span>(</span><span>"</span><span>1994</span><span>"</span><span>,</span> <span>(</span><span>42.5</span><span>,</span> <span>-</span><span>20</span><span>),</span> <span>ha</span><span>=</span><span>"</span><span>left</span><span>"</span><span>,</span> <span>**</span><span>YEAR_STYLE</span><span>)</span>
<span>ax</span><span>.</span><span>annotate</span><span>(</span>
    <span>"</span><span>Hutu militias slaughter</span><span>\n</span><span>"</span>
    <span>"</span><span>the Tutsi population</span><span>\n</span><span>"</span>
    <span>"</span><span>in Rwanda</span><span>"</span><span>,</span> <span>(</span><span>42.6</span><span>,</span> <span>-</span><span>28</span><span>),</span> <span>**</span><span>INFO_STYLE</span>
<span>)</span>

<span># Title and source </span><span>title</span> <span>=</span> <span>"</span><span>Life Expectancy at Birth During Genocides</span><span>"</span>
<span>ax</span><span>.</span><span>annotate</span><span>(</span><span>title</span><span>,</span> <span>(</span><span>-</span><span>0.5</span><span>,</span> <span>320</span><span>),</span> <span>ha</span><span>=</span><span>"</span><span>left</span><span>"</span><span>,</span> <span>va</span><span>=</span><span>"</span><span>bottom</span><span>"</span><span>,</span> <span>fontsize</span><span>=</span><span>64</span><span>)</span>
<span>ax</span><span>.</span><span>annotate</span><span>(</span><span>"</span><span>Source: World Development Indicators</span><span>"</span><span>,</span> <span>(</span><span>-</span><span>0.5</span><span>,</span> <span>343</span><span>),</span> <span>ha</span><span>=</span><span>"</span><span>left</span><span>"</span><span>,</span> <span>va</span><span>=</span><span>"</span><span>bottom</span><span>"</span><span>,</span> <span>fontsize</span><span>=</span><span>32</span><span>,</span> <span>color</span><span>=</span><span>dark_gray</span><span>)</span>

<span>plt</span><span>.</span><span>show</span><span>()</span>
fig = plt.figure(figsize=(30, 30)) ax = fig.add_subplot() ax.set(ylim=(-68, 3.7*100), xlim=(-2, 63)) # Add bars for i, row in data.iterrows(): ax.add_artist(Rectangle((i-0.5, 200), height=row.rwanda, facecolor=color(row.rwanda), **BAR_STYLE)) ax.add_artist(Rectangle((i-0.5, 100), height=row.cambodia, facecolor=color(row.cambodia), **BAR_STYLE)) ax.add_artist(Rectangle((i-0.5, 0), height=row.bangladesh, facecolor=color(row.bangladesh), **BAR_STYLE)) # Add country names ax.annotate("Rwanda", (-0.5, 265), ha="left", va="bottom", fontsize=48) ax.annotate("Cambodia", (-0.5, 165), ha="left", va="bottom", fontsize=48) ax.annotate("Bangladesh", (-0.5, 65), ha="left", va="bottom", fontsize=48) # Tick formatting ax.tick_params(labelsize=28, pad=16) ax.set_xticks([]) ax.set_yticks( ticks = [0, 20, 40, 60, 100, 120, 140, 160, 200, 220, 240, 260], labels = ["0", "20", "40", "60", "0", "20", "40", "60", "0", "20", "40", "60"] ) # Add lines ax.add_artist(Line2D([11, 11, 7], [0, -20, -20], **LINE_STYLE)) ax.add_artist(Line2D([16.5, 16.5, 21], [100, -20, -20], **LINE_STYLE)) ax.add_artist(Line2D([34, 34, 42], [200, -20, -20], **LINE_STYLE)) # Bangladesh info ax.annotate("1971", (6.5, -20), ha="right", **YEAR_STYLE) ax.annotate( "Ethnic cleansing of\n" "Bengalis in East Pakistan during\n" "the Bangladesh Liberation War.", (3.8, -28), **INFO_STYLE ) # Cambodia info ax.annotate("1975-1978", (21.5, -20), ha="left", **YEAR_STYLE) ax.annotate( "Systematic killing of Cambodian\n" "citizens by the Khmer Rouge under\n" "the leadership of Pol Pot.", (21.6, -28), **INFO_STYLE ) # Rwanda info ax.annotate("1994", (42.5, -20), ha="left", **YEAR_STYLE) ax.annotate( "Hutu militias slaughter\n" "the Tutsi population\n" "in Rwanda", (42.6, -28), **INFO_STYLE ) # Title and source title = "Life Expectancy at Birth During Genocides" ax.annotate(title, (-0.5, 320), ha="left", va="bottom", fontsize=64) ax.annotate("Source: World Development Indicators", (-0.5, 343), ha="left", va="bottom", fontsize=32, color=dark_gray) plt.show()

Enter fullscreen mode Exit fullscreen mode

When you run this code, you get the following visualization.


Conclusion

Above, you see the final data visualization. It might not look beautiful at first glance, but remember that we have a sad message that we must keep in mind when creating the design. I’m happy that the chart doesn’t contain little information but is easy to understand immediately. I think the color scheme is good, and the entire data visualization gives a sober newspaper feel.

原文链接:Matplotlib Tutorial: Life Expectancy & Genocide

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
The worst sort of indolence is being given a choice, yet taking no initiative to change.
我们人生中最大的懒惰,就是当我们明知自己拥有作出选择的能力,却不去主动改变而是放任它的生活态度
评论 抢沙发

请登录后发表评论

    暂无评论内容