codexcauchy-additivity-rectangles.py
cauchy-additivity-rectangles.py
"""Illustrate Cauchy additivity with original exact rectangle and grid examples."""
from fractions import Fraction
from pathlib import Path
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
def main():
plt.rcParams.update({"font.size": 12, "figure.facecolor": "white"})
fig, (ax, grid) = plt.subplots(1, 2, figsize=(10, 4.6), dpi=120,
gridspec_kw={"width_ratios": [1.2, 1]})
fig.suptitle(r"Addition preserved by $f(x)=3x$", fontsize=19, y=0.96)
x, y = Fraction(2, 3), Fraction(5, 6)
colors = ["#dcecf7", "#ffead5"]
for start, width, color in [(0, x, colors[0]), (x, y, colors[1])]:
ax.add_patch(Rectangle((float(start), 0), float(width), 3,
facecolor=color, edgecolor="#243746", linewidth=2))
for i in range(1, 9):
ax.plot([i / 6, i / 6], [0, 3], color="#7e8c95", alpha=0.45, lw=0.8)
for j in [1, 2]:
ax.plot([0, 1.5], [j, j], color="#7e8c95", alpha=0.45, lw=0.8)
ax.text(float(x / 2), 1.5, r"$3x=2$", ha="center", fontsize=17,
bbox={"facecolor": colors[0], "edgecolor": "none", "pad": 3})
ax.text(float(x + y / 2), 1.5, r"$3y=5/2$", ha="center", fontsize=17,
bbox={"facecolor": colors[1], "edgecolor": "none", "pad": 3})
for left, right, label in [(0, float(x), r"$x=2/3$"),
(float(x), 1.5, r"$y=5/6$")]:
ax.annotate("", (left, -0.22), (right, -0.22),
arrowprops={"arrowstyle": "|-|", "color": "#243746"})
ax.text((left + right) / 2, -0.46, label, ha="center")
ax.text(-0.12, 1.5, "height 3", rotation=90, va="center", ha="center")
ax.text(0.75, 3.3, r"$3(x+y)=9/2=2+5/2$", ha="center", fontsize=15)
ax.text(0.75, -0.95, "Each small cell has area 1/6.", ha="center", fontsize=11)
ax.set(xlim=(-0.3, 1.7), ylim=(-1.1, 3.65))
ax.set_axis_off()
xs = [Fraction(-2, 3), Fraction(0), Fraction(2, 3)]
ys = [Fraction(-1, 6), Fraction(0), Fraction(5, 6)]
values = [[str(3 * (a + b)) for b in ys] for a in xs]
grid.set_axis_off()
grid.set_title(r"Exact grid: every cell is $f(x+y)$", fontsize=13, pad=18)
table = grid.table(cellText=values, rowLabels=[str(a) for a in xs],
colLabels=[str(b) for b in ys], cellLoc="center",
rowLoc="center", bbox=[0.12, 0.33, 0.86, 0.52])
table.auto_set_font_size(False)
table.set_fontsize(13)
for (row, col), cell in table.get_celld().items():
cell.set_edgecolor("#8294a0")
if row == 0:
cell.set_facecolor(colors[1])
elif col == -1:
cell.set_facecolor(colors[0])
table[3, 2].set_facecolor("#d9ecd9")
grid.text(0.57, 0.96, r"column input $y$", ha="center", transform=grid.transAxes)
grid.text(0.03, 0.9, r"$x$", ha="center", transform=grid.transAxes)
grid.text(0.54, 0.18, r"$f(x+y)=3(x+y)=3x+3y$", ha="center",
transform=grid.transAxes, fontsize=13)
grid.text(0.54, 0.07, "Negative inputs obey the same rule.", ha="center",
transform=grid.transAxes, fontsize=11)
fig.subplots_adjust(left=0.05, right=0.97, top=0.79, bottom=0.07, wspace=0.3)
fig.savefig(Path.cwd() / (Path(__file__).stem + ".png"), facecolor="white")
plt.close(fig)
if __name__ == "__main__":
main()