FTify

Published: 2020-10-27

This theme imitates the colors and layout of a newspaper to create pleasant figures.

(Updated: 2020-10-28. The new version exists as a Gist.)

import numpy as np

import matplotlib.pyplot as plt

from cycler import cycler

import matplotlib.patheffects as path_effects


np.random.seed(1)

n,m = 200,6

x = np.arange(n)

y = np.cumsum(np.random.randn(m,n)*0.1,axis = 1)


ft_background = "#FFF1E5"

ft_democratblue = "#0F56B5"

ft_republicanred = "#EF4647"

ft_pink = "#E95D8C"

ft_darkred = "#7D062E"

ft_darkblue = "#065296"

ft_blue = "#2591CE"

ft_lightblue = "#72D9E7"

ft_greenish = "#A2BC5D"

ft_maybegrey = "#716962"

ft_golden = "#B89E17"


smallfont = 26

largefont = 32

linewidth = 5


plt.rcParams['figure.facecolor'] = ft_background

plt.rcParams['axes.facecolor']= ft_background

plt.rcParams['text.color']= ft_maybegrey

plt.rcParams['xtick.color']= ft_maybegrey

plt.rcParams['ytick.color']= ft_maybegrey

plt.rcParams['axes.labelcolor']= ft_maybegrey


plt.rcParams["axes.grid.axis"] ="y"

plt.rcParams["axes.grid"] = True

plt.rcParams['axes.spines.left'] = False

plt.rcParams['axes.spines.right'] = False

plt.rcParams['axes.spines.top'] = False

plt.rcParams['axes.spines.bottom'] = True

plt.rcParams['figure.figsize'] = (20,12)


plt.rcParams['axes.titlesize'] = largefont

plt.rcParams['font.size'] = smallfont

plt.rcParams['xtick.labelsize'] = smallfont

plt.rcParams['ytick.labelsize'] = smallfont

plt.rcParams['axes.labelsize'] = smallfont

plt.rcParams['ytick.labelsize'] = smallfont

plt.rcParams['xtick.major.size'] = 10

plt.rcParams['xtick.major.pad'] = 10

plt.rcParams['ytick.major.size'] = 0

plt.rcParams['ytick.major.pad'] = 10



plt.rcParams['lines.linewidth'] = linewidth

plt.rc('axes', prop_cycle=(cycler('color', [ft_darkblue, ft_blue, ft_lightblue, ft_pink, ft_darkred, ft_greenish])))


fig, ax = plt.subplots(constrained_layout = True)

for i in range(m):

ax.plot(x,y[i,:], lw = linewidth+1, c="w") # White outline of line

p = ax.plot(x,y[i,:])

color = p[-1].get_color() # Match text color with line color

text = ax.text(x[-1]+1,y[i,-1]*1.05, f" Category {i+1}",fontsize = smallfont, va ="center", color = color)

text.set_path_effects([path_effects.Stroke(linewidth=1, foreground='white'), path_effects.Normal()]) # White outline of text

ax.set_ylim(-3,3)



left = -0.06

ax.text(left, 1.18,'The main title',

ha='left',va='center', transform = ax.transAxes,

fontsize = largefont,color ="k")


ax.text(left, 1.1,'And this is a smaller title',

ha='left',va='center', transform = ax.transAxes)


ax.text(left,-0.15,"Here is a footnote.",

ha='left',va='center', transform = ax.transAxes)


ax.set_xlabel("This is the x-label")

ax.set_ylabel("This is the y-label")


plt.savefig("sampleplot.png",dpi = 100)fig, ax = plt.subplots(constrained_layout = True)

for i in range(m):

ax.plot(x,y[i,:], lw = linewidth+1, c="w") # White outline of line

p = ax.plot(x,y[i,:])

color = p[-1].get_color() # Match text color with line color

text = ax.text(x[-1]+1,y[i,-1]*1.05, f" Category {i+1}",fontsize = smallfont, va ="center", color = color)

text.set_path_effects([path_effects.Stroke(linewidth=1, foreground='white'), path_effects.Normal()]) # White outline of text

ax.set_ylim(-3,3)



left = -0.06

ax.text(left, 1.18,'The main title',

ha='left',va='center', transform = ax.transAxes,

fontsize = largefont,color ="k")


ax.text(left, 1.1,'And this is a smaller title',

ha='left',va='center', transform = ax.transAxes)


ax.text(left,-0.15,"Here is a footnote.",

ha='left',va='center', transform = ax.transAxes)


ax.set_xlabel("This is the x-label")

ax.set_ylabel("This is the y-label")


plt.savefig("sampleplot.png",dpi = 100)

The resulting output is shown below.