From dc086771e418d7c66a541d2831b468375c5f7090 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Fri, 11 Mar 2022 03:00:57 +0000 Subject: CTAN sync 202203110300 --- .../latex/pyluatex/example/data-visualization.tex | 137 +++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 macros/luatex/latex/pyluatex/example/data-visualization.tex (limited to 'macros/luatex/latex/pyluatex/example/data-visualization.tex') diff --git a/macros/luatex/latex/pyluatex/example/data-visualization.tex b/macros/luatex/latex/pyluatex/example/data-visualization.tex new file mode 100644 index 0000000000..3a2d20a2bd --- /dev/null +++ b/macros/luatex/latex/pyluatex/example/data-visualization.tex @@ -0,0 +1,137 @@ +%% Copyright 2021-2022 Tobias Enderle +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3c +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. + +\documentclass{article} + +\usepackage{pgfplots} +\pgfplotsset{compat=1.15} +\usepackage{pyluatex} +\usepackage{booktabs} + +\usepackage{url} +\urldef\dataurl\url{https://population.un.org/wpp/Download/Files/1_Indicators%20(Standard)/CSV_FILES/WPP2019_TotalPopulationBySex.csv} + +\begin{python} +import pandas as pd +import datetime + +def pgf_coords(x, y): + return ' '.join(f'({a},{b})' for a, b in zip(x, y)) + +file = 'population.csv' +df = pd.read_csv(file) +data = df.set_index(['Location', 'Time']).sort_index() +world_data = data.loc['World'] + +year = datetime.datetime.now().year +current_pop = world_data.loc[year].PopTotal + +diffs = world_data.PopTotal.diff() +highest_increase_year = diffs.idxmax() +highest_increase = diffs.max() / 1e3 +\end{python} + +\title{PyLuaTeX Example -- Data Visualization} +\author{Tobias Enderle} + +\begin{document} + +\maketitle + +This document demonstrates how data can be visualized flexibly in a \LaTeX{} +document with the help of the Python package \emph{pandas} and the \LaTeX{} +package \emph{pgfplots}. + +We show some statistics of the United Nations' \emph{World Population Prospects}% +\footnote{United Nations, Department of Economic and Social Affairs, Population +Division (2019). World Population Prospects 2019, Online Edition. Rev.\ 1.} in the +form of plots, tables or individual values. +The data file \texttt{\py{file}} is a subset of the file +\texttt{WPP2019\_TotalPopulationBySex.csv}\footnote{\dataurl{} (last accessed: +2021/07/04)}. + +The following plot shows the estimated world population between \py{df.Time.iloc[0]} +and \py{df.Time.iloc[-1]}. The red lines mark the current year and population. + +\begin{center} +\begin{tikzpicture} +\begin{axis}[ + width=\textwidth, + height=0.7\textwidth, + enlarge x limits=false, + ymin=0, + ylabel={Estimated world population in billions}, + xlabel={Year}, + xticklabel style={/pgf/number format/1000 sep=}, + grid=both, +] +\addplot[no marks,black,thick] coordinates {% + \py{pgf_coords(world_data.index, world_data.PopTotal / 1e6)}% +}; +\draw[red,thick] (axis cs:\py{year},0) |- (axis cs:0,\py{current_pop / 1e6}); +\end{axis} +\end{tikzpicture} +\end{center} + +The year with the highest increase of \py{round(highest_increase)} million people +was \py{highest_increase_year}. The world population is expected to reach a value +of \py{round(world_data.loc[2100].PopTotal / 1e6, 2)} billion by 2100. + +The following table shows the total as well as the male and female population at +the beginning of each decade. The values are given in thousands. +\begin{center} +\begin{python} +table_data = world_data.iloc[::10].reset_index() +table_data = table_data[['Time', 'PopTotal', 'PopMale', 'PopFemale']] +table_data.columns = ['Year', 'Total (thousands)', 'Male (thousands)', 'Female (thousands)'] +table = table_data.style.hide(axis='index').format( + formatter={ + 'Total (thousands)': '{:,.0f}', + 'Male (thousands)': '{:,.0f}', + 'Female (thousands)': '{:,.0f}' + } +).to_latex(hrules=True) +print(table) +\end{python} +\end{center} + +The plot below shows the estimated population of China and the United States +of America (USA). The numbers are given in millions. +\begin{center} +\begin{python} +marker_year = 2030 +plots = [ + ('China', data.loc['China'].PopTotal / 1e3), + ('USA', data.loc['United States of America'].PopTotal / 1e3) +] +\end{python} +\begin{tikzpicture} +\begin{axis}[ + width=\textwidth, + height=0.55\textwidth, + enlarge x limits=false, + ymin=0, + ylabel={Estimated population in millions}, + xlabel={Year}, + xticklabel style={/pgf/number format/1000 sep=}, + grid=both, +] +\pgfplotsinvokeforeach{0,1}{% + \addplot[no marks,black,thick] coordinates {% + \py{pgf_coords(plots[#1][1].index, plots[#1][1])}% + }; + \node[below] at (axis cs:\py{marker_year},\py{plots[#1][1].loc[marker_year]}) + {\py{plots[#1][0]}}; +} +\end{axis} +\end{tikzpicture} +\end{center} + +\end{document} -- cgit v1.2.3