sqrtminusone.github.io/scripts/dot-stats-plot-lengths.py
2021-11-26 17:10:55 +03:00

87 lines
2.3 KiB
Python

import os
import subprocess
from datetime import datetime
import matplotlib as mpl
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
mpl.rcParams['figure.dpi'] = 125
mpl.rcParams['hatch.linewidth'] = 4.0
root_process = subprocess.run(
['git', 'rev-parse', '--show-toplevel'], stdout=subprocess.PIPE
)
ROOT = root_process.stdout.decode('utf-8')[:-1]
DATA_ROOT = os.path.join(ROOT, '_data')
PICS_ROOT = os.path.join(ROOT, 'static', 'stats')
plt.style.use(os.path.join(ROOT, 'scripts', 'palenight.mplstyle'))
def remove_zeros(data):
last = -1
result = []
for datum in data:
if last <= 0 and datum > 0:
if len(result) > 0:
result[-1] = 0
result.append(datum)
last = datum
elif last <= 0 and datum <= 0:
result.append(np.nan)
elif last > 0 and datum <= 0:
result.append(last)
else:
result.append(datum)
last = datum
return result
df = pd.read_csv(os.path.join(DATA_ROOT, 'lengths.csv'), parse_dates=['date'])
files = [c for c in df.columns if c not in ['commit', 'date']]
df = df[df[files].sum(axis=1) > 0]
df = df.drop('commit', axis=1)
df = df.sort_values('date').set_index('date')
df = df.apply(
lambda col: remove_zeros(col) if col.name not in ['commit', 'date'] else col
)
# Plot Emacs vs vim
fig, ax = plt.subplots(figsize=(12, 6))
df[['Emacs.org', 'init.vim', 'init.el']].plot(ax=ax)
ax.grid(True, alpha=0.25)
ax.set_axisbelow(True)
ax.set_title('Emacs vs neovim config size growth')
ax.set_ylabel('LoC')
ax.text(
0.075,
0.08,
f'upd. {datetime.now().strftime("%Y-%m-%d")}',
transform=fig.transFigure,
va='top',
ha='left'
)
plt.tight_layout()
fig.savefig(os.path.join(PICS_ROOT, 'emacs-vim.png'))
# Plot literate configuration files
fig, ax = plt.subplots(figsize=(12, 6))
df[['Emacs.org', 'Desktop.org', 'Mail.org', 'Guix.org',
'Console.org']].plot(ax=ax)
ax.grid(True, alpha=0.25)
ax.set_axisbelow(True)
ax.set_title('Literate configuration size growth')
ax.set_ylabel('LoC')
ax.text(
0.075,
0.08,
f'upd. {datetime.now().strftime("%Y-%m-%d")}',
transform=fig.transFigure,
va='top',
ha='left'
)
plt.tight_layout()
fig.savefig(os.path.join(PICS_ROOT, 'literate-config.png'))