Mercurial > hg > medcouple
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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