changeset 48:1baa6b0a7199

move duplicate code into function this changed the dimensions of the generated image slightly
author Jordi Gutiérrez Hermoso <jordigh@octave.org>
date Sun, 15 May 2016 00:20:01 -0400
parents 1b15b9a0f336
children 1676c032cde5
files talk/code/plots.py talk/img/boys-and-girls.pdf
diffstat 2 files changed, 37 insertions(+), 50 deletions(-) [+]
line wrap: on
line diff
--- a/talk/code/plots.py
+++ b/talk/code/plots.py
@@ -2,64 +2,51 @@
 import matplotlib.cbook as cbook
 import numpy as np
 
+def boxhistplot(data, fig=None, rect=None, xticks=None, colour=None,
+                bins=None, title=None):
+    data_stats = cbook.boxplot_stats(data)
+
+    left, bottom, width, height = rect
+    histheight = 0.75*height
+    boxheight = 0.25*height
+
+    # setup the figure and axes
+    bpAx = fig.add_axes([left, bottom+histheight, width, boxheight])
+    histAx = fig.add_axes([left, bottom, width, histheight])
+
+    # plot stuff
+    bpAx.bxp(data_stats, vert=False, flierprops={"marker": 'x'})
+    histAx.hist(data, bins=bins, color=colour)
+
+    # confirm that the axes line up
+    xlims = np.array([bpAx.get_xlim(), histAx.get_xlim()])
+    for ax in [bpAx, histAx]:
+        ax.set_xlim([xlims.min(), xlims.max()])
+
+    bpAx.set_xticklabels([])  # clear out overlapping xlabels
+    bpAx.set_yticks([])  # don't need that 1 tick mark
+    bpAx.set_title(title,fontsize=20)
+
+    histAx.set_xticks(xticks)
+    histAx.get_xaxis().tick_bottom()
+    bpAx.get_xaxis().tick_top()
+
 with open("../../data/men") as f:
     men = [float(x) for x in f.readlines()]
 
 with open("../../data/women") as f:
     women = [float(x) for x in f.readlines()]
 
-men_stats = cbook.boxplot_stats(men)
-women_stats = cbook.boxplot_stats(women)
-
 fig = plt.figure(figsize=(12,8))
-
-# setup the figure and axes
-bpAx = fig.add_axes([0.05, 0.8, 0.9, 0.1])   # left, bottom, width, height:
-                                            # (adjust as necessary)
-histAx = fig.add_axes([0.05, 0.55, 0.9, 0.25]) # left specs should match and
-                                            # bottom + height on this line should
-                                            # equal bottom on bpAx line
-# plot stuff
-bpAx.bxp(men_stats, vert=False, flierprops={"marker": 'x'})
-histAx.hist(men, bins=0.5 + np.arange(0,100), color=[0.3, 0.3, 1])
-
-
-# confirm that the axes line up
-xlims = np.array([bpAx.get_xlim(), histAx.get_xlim()])
-for ax in [bpAx, histAx]:
-    ax.set_xlim([xlims.min(), xlims.max()])
-
-bpAx.set_xticklabels([])  # clear out overlapping xlabels
-bpAx.set_yticks([])  # don't need that 1 tick mark
-bpAx.set_title("Ages of actors",fontsize=20)
+xticks = np.arange(5,105,5)
+bins = 0.5 + np.arange(0,100)
 
-histAx.set_xticks(np.arange(5,105,5))
-histAx.get_xaxis().tick_bottom()
-bpAx.get_xaxis().tick_top()
-
-
+boxhistplot(men, fig=fig, rect=[0.05, 0.55, 0.9, 0.35], xticks=xticks,
+            colour=[0.3, 0.3, 1],
+            bins=bins, title="Ages of actors")
 
-# setup the figure and axes
-bpAx = fig.add_axes([0.05, 0.35, 0.9, 0.1])   # left, bottom, width, height:
-                                            # (adjust as necessary)
-histAx = fig.add_axes([0.05, 0.1, 0.9, 0.25]) # left specs should match and
-                                            # bottom + height on this line should
-                                            # equal bottom on bpAx line
-# plot stuff
-bpAx.bxp(women_stats, vert=False, flierprops={"marker": 'x'})
-histAx.hist(women, bins=0.5 + np.arange(0,100), color='pink')
-
-# confirm that the axes line up
-xlims = np.array([bpAx.get_xlim(), histAx.get_xlim()])
-for ax in [bpAx, histAx]:
-    ax.set_xlim([xlims.min(), xlims.max()])
-
-bpAx.set_xticklabels([])  # clear out overlapping xlabels
-bpAx.set_yticks([])  # don't need that 1 tick mark
-bpAx.set_title("Ages of actresses", fontsize=20)
-
-histAx.set_xticks(np.arange(5,105,5))
-histAx.get_xaxis().tick_bottom()
-bpAx.get_xaxis().tick_top()
+boxhistplot(women, fig=fig, rect=[0.05, 0.1, 0.9, 0.35], xticks=xticks,
+            colour='pink',
+            bins=bins, title="Ages of actresses")
 
 plt.savefig("boys-and-girls.pdf")
index f707629dd8f31c7738886bd90cb09d7d569d7708..30851735735de76c068699be98dbee740a2d24a3
GIT binary patch
literal 17712
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