I've been going over a few papers from the '60s, broadly in physics sub-disciplines. The image below from 1963 shows a very typical style of plot which I've come across frequently.

I'm guessing this was made by hand with some sort of template, as the letter spacing and alignment are not perfect. And I guess the curved lines were made with spline rulers?

I really like the minimalist aesthetic these plots have and was hoping to replicate the formatting for my own work. I'd be interested if anyone has any further insight on what tools were actually used to make these plots back then, so I can look them up and get more info on formatting details (fonts, spacing, etc.).

An image of a plot.

  • 11
    Regarding digital replication, you might be interesting in this guide to minimalist Tufte style ggplot2/R plots:motioninsocial.com/tufte Commented Jan 21, 2021 at 10:31
  • 4
    For fun, you can also have a look at packages that make xkcd-style plots (this is for Python, but there are also for Matlab and Mathematica). Commented Jan 21, 2021 at 10:37
  • 5
    Computer controlled plotters were being marketed in the 1960s. One of the market leaders, Calcomp, produced its first product in 1959.
    – alephzero
    Commented Jan 22, 2021 at 0:14
  • 6
    I had a girlfriend in college in the early 90's whose day job, as I understood it, was to draw tangent lines to contours on topographical maps, by hand with a ruler, at particular locations. Commented Jan 22, 2021 at 0:36
  • 3
    @RTbecard: Finding THE font used is probably a moot question, because people back then didn't think in terms of multiple fonts. If drawing by hand, you used whatever was etched into your little plastic plotting thing. If it was done on a plotter, there was one and only one "font" built into the machine, which was probably digitized by some low-level company employee. But the Hershey fonts would probably come as close as you're likely to get: en.wikipedia.org/wiki/Hershey_fonts
    – jamesqf
    Commented Jan 22, 2021 at 19:21

4 Answers 4


Those were typically made with lettering guides and French curves (I'd have liked to take a few pictures of mines, but I cannot recall where I put them: hundreds of hours at high school spent using them1), drawing with technical pens like Rapidographs. In certain cases, you could have also used dry transfer letters. As a drawing desk, a drafting machine was typically used (you can also buy tabletop ones).

In many cases, graphs and drawings were made by professional graphic designers, and that's why many old pictures look so good.

1A typical homework punishment in drawing classes for anyone who made too much noise in class was to fill an A3 sheet with text written with the smallest lettering guide.


I could find the lettering guides:

enter image description here

And while digging for the lettering guides, I could also find a graph paper that I drew when I was at high school using rapidographs and dry transfer letters, and with a tabletop drafting machine . It's a graph paper I used to plot the frequency response of amplifiers. Not exactly what you want, but just to give you an idea of what a non-expert could do with those tools.

enter image description here

  • It's time to continue the pleasant conversation about drawing good ol' times in this chat. Please recall that we can move comments to chat only once, and further comments may have to be deleted. But the chat will remain there forever. Commented Jan 24, 2021 at 18:23

This is less of an answer per se, but you mentioned you'd like to replicate the formatting for your own work. This can be done by hand if you want to, using the information in the top answer (thanks Massimo!).

However, if you're familiar with python, you can get pretty close to the original (minus the imperfections from handwriting, which admittedly do add a certain charm).

Here's my attempt -- the spline is wrong obviously, but I wasn't sure which technique was used to get the one in the original image.

enter image description here

And the code used to make this (feel free to edit for clarity/style/...):

import numpy as np

import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.ticker import MultipleLocator
from scipy import interpolate

# various formatting parameters
label_fontsize = 10
tick_fontsize = 10
linewidth = 1
major_xtick_length = 15
minor_xtick_length = 7
major_ytick_length = 7
minor_ytick_length = 0

mpl.rcParams['font.weight'] = 'normal'
mpl.rcParams['axes.linewidth'] = linewidth
mpl.rcParams['lines.linewidth'] = linewidth
mpl.rcParams['xtick.labelsize'] = tick_fontsize
mpl.rcParams['ytick.labelsize'] = tick_fontsize
mpl.rcParams['xtick.major.width'] = linewidth
mpl.rcParams['ytick.major.width'] = linewidth
mpl.rcParams['xtick.minor.width'] = linewidth
mpl.rcParams['ytick.minor.width'] = linewidth

# get data, one extra point for fitting the last spline segment
depth_meters = np.array([0, 5, 19, 33, 41, 57, 65, 150])  # x
zenith_degrees = np.array([24, 27, 25, 23, 16, 10, 5, 0])  # y

# spline plotting, 300 = number of internal points
xnew = np.linspace(depth_meters.min(), depth_meters.max(), 300)
tck = interpolate.splrep(depth_meters, zenith_degrees, s=0)
smooth = interpolate.splev(xnew, tck, der=0)

# this is how it looks on the graph, not sure if this is the real conversion
depth_attenuation = depth_meters / 5

# create figure
fig, ax1 = plt.subplots(figsize=(5,5))

# make dots
ax1.scatter(depth_meters, zenith_degrees, s=30, facecolors='none', edgecolors='k', clip_on=False)
# and smooth line
# plot as solid line between 2nd and 2nd last data point
xnew_solid = [x for x in xnew if x >= depth_meters[1] and x <= depth_meters[-2]]
smooth_solid = [s for s, x in zip(smooth, xnew) if x >= depth_meters[1] and x <= depth_meters[-2]]
ax1.plot(xnew_solid, smooth_solid, c='k')
xnew_dashed_1= [x for x in xnew if x < depth_meters[1]]
smooth_dashed_1 = [s for s, x in zip(smooth, xnew) if x < depth_meters[1]]
ax1.plot(xnew_dashed_1, smooth_dashed_1, 'k--', dashes=(10,2))
xnew_dashed_2= [x for x in xnew if x > depth_meters[-2]]
smooth_dashed_2 = [s for s, x in zip(smooth, xnew) if x > depth_meters[-2]]
ax1.plot(xnew_dashed_2, smooth_dashed_2, 'k--', dashes=(15,3))

# labels
ax1.set_xlabel('D E P T H   ( M E T E R S )', fontsize=label_fontsize, labelpad=10)
ax1.set_ylabel('Z E N I T H   A N G L E   ( D E G R E E S )', fontsize=label_fontsize)

# ticks
ax1.tick_params('x', which='both', bottom=True, top=False, direction='in', labelsize=tick_fontsize)
ax1.tick_params('y', left=True, right=True, direction='in', labelsize=tick_fontsize)
ax1.tick_params('x', which='major', length=major_xtick_length)
ax1.tick_params('x', which='minor', length=minor_xtick_length)
ax1.tick_params('y', which='major', length=major_ytick_length)
ax1.tick_params('y', which='minor', length=minor_ytick_length)

# second x axis
ax2 = ax1.twiny()
ax2.set_xlabel('D E P T H   ( A T T E N U A T I O N   L E N G T H S )', fontsize=label_fontsize, labelpad=15)
ax2.tick_params('x', which='both', bottom=False, top=True, direction='in', labelsize=tick_fontsize)
ax2.tick_params('x', which='major', length=major_xtick_length)
ax2.tick_params('x', which='minor', length=minor_xtick_length)
ax2.tick_params('y', which='major', length=major_ytick_length)
ax2.tick_params('y', which='minor', length=minor_ytick_length)

# plot limits

  • 6
    Of course, to add this charming touch of handwriting, you could always add plt.rcParams['font.family'] = 'sans-serif' plt.rcParams['font.sans-serif'] = 'Comic Sans MS'
    – smcs
    Commented Jan 22, 2021 at 11:50
  • 2
    @smcs knowyourmeme.com/photos/508189-comic-sans
    – Criggie
    Commented Jan 22, 2021 at 12:35
  • 2
    @Criggie Ha. Comic Sans has become that much of a meme that e.g. Matplotlib tutorials on how to change the font routinely choose this as an example.
    – smcs
    Commented Jan 22, 2021 at 12:57
  • 2
    @Criggie - You can always go with comicneue.com 🙂 Commented Jan 23, 2021 at 1:44
  • 1
    Just a few design suggestions: 1. Frame labels font is too thin as compared with the width of the frame lines, 2. The curve is not at the center of the graph, 3. The ticks on the horizontal axes are too big. 4. The curve crosses all circles besides one, which is inconsistent. 5. Horizontal and vertical frame labels are positioned at different distances from the horizontal, vertical axes, respectively, which is inconsistent. This suggests that python defaults are still too far from the graphical standards of the past!
    – yarchik
    Commented Jan 23, 2021 at 12:53

Just for fun, in addition to Mc Cracken answer, it's quite easier to reproduce the figure in gnuplot. I've tried some fitting to better match the original figure.

Otherwise, the set mono does almost all the job.

$data <<EOF
0   24
5   27
19  25
33  23
41  16
57  10
65  5
130 0
150 0

$datasmooth <<EOF
0   24
1   26
3   26.9
5   27

set term svg lw 2 font "Linux Biolinum O, 18"
set mono
set output "oldstyle.svg"

set xr [0:120]
set x2r [0:24]
set yr [0:30]

set xtics nomirror
set mxtics 2
set x2tics 4
set mx2tics 5

set xlabel "DEPTH (METERS)"

function(x) = (27*exp(A*25))*exp(-A*x**B)
A = 1.44e-5
B = 2.83

fit [5:150] function(x) $data via A, B

plot    $data u 1:2 pt "o" pointsize 15 notitle,\
    $datasmooth u 1:2 smooth csplines lt 2 notitle,\
    [5:65] function(x) lt 1 notitle,\
    [65:150] function(x) lt 2 notitle


EDIT: A bit better with small caps for the labels:

image small caps

  • Just curious, how did you find the function to fit? Commented Jan 24, 2021 at 12:08
  • 1
    Nothing really intelligent, I just thought it looked like an exp(-x)
    – Luc
    Commented Jan 24, 2021 at 16:54
  • 2
    Nice! Interesting to see how you have to apply fewer tweaks to gnuplot's defaults to get a similar plot Commented Jan 24, 2021 at 18:00

I'll add that there was often a photographic part of the process, with photographers specializing in such processes making a fine living. They could use high contrast films, like diazo film, made for the job, and touch up the negatives.

For graphs in particular, one could use grids in nonreproducing blue, removed in the photo stage.

Figures were submitted to journals as photographic prints, well into the early '90s.

To add to the lettering techniques, stencils were only one way to do it. There were also lettering pantographs, like shown in https://en.wikipedia.org/wiki/Technical_lettering#Mechanical_lettering, which would make it easier to get the right sized text to fit in the elaborate art work already in place. I also recall seeing a lettering machine, which looked like a big version of the old Dymo embossing label makers, but have never seen that actually used.

  • Very interesting! I never considered that post-processing could be done via photography!
    – RTbecard
    Commented Jan 25, 2021 at 9:51

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .