# HG changeset patch # User Jordi GutiƩrrez Hermoso # Date 1463286001 14400 # Node ID 1baa6b0a71990e4e7f5b2c667dcf01edd9d3b43d # Parent 1b15b9a0f33670309e59276eecffc4817a7631d3 move duplicate code into function this changed the dimensions of the generated image slightly diff --git a/talk/code/plots.py b/talk/code/plots.py --- 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") diff --git a/talk/img/boys-and-girls.pdf b/talk/img/boys-and-girls.pdf index f707629dd8f31c7738886bd90cb09d7d569d7708..30851735735de76c068699be98dbee740a2d24a3 GIT binary patch literal 17712 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