From: <bpe...@us...> - 2016-01-16 17:58:25
|
Revision: 4999 http://sourceforge.net/p/simupop/code/4999 Author: bpeng2000 Date: 2016-01-16 17:58:23 +0000 (Sat, 16 Jan 2016) Log Message: ----------- Finalize documentation for the addition of operator BackwardMigrator Modified Paths: -------------- trunk/doc/refManual.lyx trunk/doc/refManual.pdf trunk/doc/userGuide.lyx trunk/doc/userGuide.pdf trunk/doc/userGuide.py trunk/src/__init__.py trunk/src/simuPOP_doc.i trunk/src/utils.py Modified: trunk/doc/refManual.lyx =================================================================== --- trunk/doc/refManual.lyx 2016-01-16 17:31:00 UTC (rev 4998) +++ trunk/doc/refManual.lyx 2016-01-16 17:58:23 UTC (rev 4999) @@ -23,6 +23,7 @@ \chapter*{Front Matter\label{front}} \fi +\usepackage{listings} \renewcommand{\lstlistlistingname}{List of Examples} \renewcommand{\lstlistingname}{Example} @@ -979,6 +980,13 @@ \backslash +BackwardMigratorRef +\end_layout + +\begin_layout Plain Layout + + +\backslash SplitSubPopsRef \end_layout @@ -1638,6 +1646,13 @@ \backslash +simuPOPbackwardMigrateRef +\end_layout + +\begin_layout Plain Layout + + +\backslash simuPOPmixedMutateRef \end_layout Modified: trunk/doc/refManual.pdf =================================================================== (Binary files differ) Modified: trunk/doc/userGuide.lyx =================================================================== --- trunk/doc/userGuide.lyx 2016-01-16 17:31:00 UTC (rev 4998) +++ trunk/doc/userGuide.lyx 2016-01-16 17:58:23 UTC (rev 4999) @@ -24,6 +24,7 @@ \chapter*{Front Matter\label{front}} \fi +\usepackage{listings} \renewcommand{\lstlistlistingname}{List of Examples} \renewcommand{\lstlistingname}{Example} @@ -8960,13 +8961,9 @@ \end_inset (equal subpopulation size) so simuPOP will use -\series bold - \begin_inset Formula $B$ \end_inset - -\series default directly in this case. Also note that \begin_inset Formula $B$ @@ -8976,7 +8973,7 @@ \begin_inset Formula $S'$ \end_inset -and + and \begin_inset Formula $F$ \end_inset @@ -27172,31 +27169,12 @@ \end_layout \begin_layout Standard -This module uses either rpy or matplotlib as the underlying plotting library. - rpy is used by defaut because it is easier to use and support more plotting - options ( -\family typewriter -InfoPlotter -\family default -, -\family typewriter -BoxPlotter -\family default -, -\family typewriter -HistPlotter -\family default - and -\family typewriter -QQPlotter -\family default - are only available for rpy). - matplotlib will be used if rpy is not available, or if matplotlib is set - to be the system plotter ( -\family typewriter -simuOpt.setOptions(plotter='matplotlib') -\family default -). +simuPOP version 1.1.6 and earlier supports both rpy and matplotlib as the + underlying plotting library. + However, because of bugs in rpy2 and difficulties in supporting rpy, rpy2 + and matplotlib, rpy/rpy2 support is removed in simuPOP 1.1.7. + Please use simuPOP 1.1.6 if you are interested in using rpy2. + \end_layout \begin_layout Standard @@ -27958,270 +27936,6 @@ \end_layout -\begin_layout Subsection -Histograms, QQ plots and boxplots (operator -\family typewriter -plotter.InfoPlotter -\family default -, -\family typewriter -plotter.HistPlotter -\family default -, -\family typewriter -plotter.QQPlotter -\family default -). -\end_layout - -\begin_layout Standard -Class -\family typewriter -plotter.InfoPlotter -\family default - can be used to draw figures for information fields of individuals in one - or more subpopulations. - -\family typewriter -plotter.HistPlotter -\family default - and -\family typewriter -plotter.QQPlotter -\family default - are two special cases of this class that uses functions -\family typewriter -hist -\family default - and -\family typewriter -qqnorm -\family default - respectively. - Although an -\family typewriter -InfoPlotter -\family default - using a -\family typewriter -boxplot -\family default - function could be used, a specialized -\family typewriter -plotter.BoxPlotter -\family default - is defined so that mutliple boxplot whiskers could be drawn in the same - plot. -\end_layout - -\begin_layout Standard -Using the same evolutionary process as Example -\begin_inset CommandInset ref -LatexCommand ref -reference "ScatterPlotter" - -\end_inset - -, Example -\begin_inset CommandInset ref -LatexCommand ref -reference "HistPlotter" - -\end_inset - - uses a -\family typewriter -HistPlotter -\family default - to plot the histograms (Figure -\begin_inset CommandInset ref -LatexCommand ref -reference "fig:HistPlotter" - -\end_inset - -), a -\family typewriter -QQPlotter -\family default - to plot QQ plot (Figure -\begin_inset CommandInset ref -LatexCommand ref -reference "fig:QQPlotter" - -\end_inset - -), and a -\family typewriter -BoxPlotter -\family default - to plot the boxplots (Figure -\begin_inset CommandInset ref -LatexCommand ref -reference "fig:BoxPlotter" - -\end_inset - -) of individual ancestry values. - By defining two virtual subpopulations by sex, the -\family typewriter -HistPlotter -\family default - and -\family typewriter -QQPlotter -\family default - plots two histograms and two QQ plots, one for males and one for females. - Different colors are used for these figures. - Note that these plots use the special expression value for parameter -\family typewriter -main -\family default - so that generation number can appear in the titles. - The same technique is used in the -\family typewriter -dev_print_file -\family default - parameter of the -\family typewriter -BoxPlotter -\family default -, which overrides the default filename derived from parameter -\family typewriter -saveAs -\family default -. - -\begin_inset CommandInset include -LatexCommand lstinputlisting -filename "log/HistPlotter.log" -lstparams "caption={Use HistPlotter to plot the histogram of individual ancestries.},label={HistPlotter}" - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Float figure -wide false -sideways false -status open - -\begin_layout Plain Layout -\begin_inset Caption Standard - -\begin_layout Plain Layout -\begin_inset CommandInset label -LatexCommand label -name "fig:HistPlotter" - -\end_inset - -Histogram of individual ancestry values -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\align center -\begin_inset Graphics - filename log/HistPlotter_2_0.png - lyxscale 40 - width 80text% - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Float figure -wide false -sideways false -status open - -\begin_layout Plain Layout -\begin_inset Caption Standard - -\begin_layout Plain Layout -\begin_inset CommandInset label -LatexCommand label -name "fig:QQPlotter" - -\end_inset - -QQ plot of individual ancestry values -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\align center -\begin_inset Graphics - filename log/QQPlotter_2_0.png - lyxscale 40 - width 80text% - -\end_inset - - -\end_layout - -\end_inset - - -\begin_inset Float figure -wide false -sideways false -status open - -\begin_layout Plain Layout -\begin_inset Caption Standard - -\begin_layout Plain Layout -\begin_inset CommandInset label -LatexCommand label -name "fig:BoxPlotter" - -\end_inset - -Boxplot of individual ancestry values -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\align center -\begin_inset Graphics - filename log/Gen2.png - lyxscale 40 - width 80text% - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - \begin_layout Section Module \family typewriter @@ -28555,14 +28269,6 @@ demonstrates how to use function sampling.indexToID to prepare a pedigree and how to use sampling.DrawPedigree to plot it. -\begin_inset CommandInset include -LatexCommand lstinputlisting -filename "log/plotPedigree.log" -lstparams "caption={Prepare and plot Pedigrees},label={plotPedigree}" - -\end_inset - - \end_layout \begin_layout Standard @@ -28579,47 +28285,6 @@ it is common that one parent would have multiple spouses. \end_layout -\begin_layout Standard -\begin_inset Float figure -wide false -sideways false -status open - -\begin_layout Plain Layout -\begin_inset Caption Standard - -\begin_layout Plain Layout -\begin_inset CommandInset label -LatexCommand label -name "fig:Pedigree" - -\end_inset - -Structure of a small complete pedigree -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\align center -\begin_inset Graphics - filename log/pedigree.png - lyxscale 40 - width 60text% - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - \begin_layout Subsection Sampling affected sibpairs (class \family typewriter @@ -28684,47 +28349,6 @@ \end_layout -\begin_layout Standard -\begin_inset Float figure -wide false -sideways false -status open - -\begin_layout Plain Layout -\begin_inset Caption Standard - -\begin_layout Plain Layout -\begin_inset CommandInset label -LatexCommand label -name "fig:affectedSibpair" - -\end_inset - -Affected sibpairs drawn from a small pedigree -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\align center -\begin_inset Graphics - filename log/affectedSibpair.png - lyxscale 40 - width 60text% - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - \begin_layout Subsection Sampling nuclear families (class \family typewriter @@ -28791,47 +28415,6 @@ \end_layout -\begin_layout Standard -\begin_inset Float figure -wide false -sideways false -status open - -\begin_layout Plain Layout -\begin_inset Caption Standard - -\begin_layout Plain Layout -\begin_inset CommandInset label -LatexCommand label -name "fig:nuclearFamily" - -\end_inset - -Nuclear families drawn from a small pedigree -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\align center -\begin_inset Graphics - filename log/nuclerFamily.png - lyxscale 40 - width 60text% - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - \begin_layout Subsection Sampling three-generation families (class \family typewriter @@ -28910,47 +28493,6 @@ \end_layout -\begin_layout Standard -\begin_inset Float figure -wide false -sideways false -status open - -\begin_layout Plain Layout -\begin_inset Caption Standard - -\begin_layout Plain Layout -\begin_inset CommandInset label -LatexCommand label -name "fig:threeGenFamily" - -\end_inset - -Three generation families drawn from a small pedigree -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\align center -\begin_inset Graphics - filename log/threeGenFamily.png - lyxscale 40 - width 60text% - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - \begin_layout Subsection Sampling different types of samples (class \family typewriter @@ -29022,46 +28564,9 @@ \end_layout \begin_layout Standard -\begin_inset Float figure -wide false -sideways false -status open -\begin_layout Plain Layout -\begin_inset Caption Standard - -\begin_layout Plain Layout -\begin_inset CommandInset label -LatexCommand label -name "fig:combinedSampling" - -\end_inset - -An affected sibpair and a nuclear family drawn from a small pedigree \end_layout -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\align center -\begin_inset Graphics - filename log/combinedSampling.png - lyxscale 40 - width 60text% - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - \begin_layout Subsection Sampling from subpopulations and virtual subpopulations * \end_layout @@ -30377,23 +29882,7 @@ simuCDCV.py -h \family default . - The help message is displayed in Example -\begin_inset CommandInset ref -LatexCommand ref -reference "reichHelp" - -\end_inset - -. -\begin_inset CommandInset include -LatexCommand lstinputlisting -filename "log/simuCDCV.hlp" -lstparams "caption={Help information for the simuCDCV script},label={reichHelp}" - -\end_inset - - \end_layout \begin_layout Enumerate Modified: trunk/doc/userGuide.pdf =================================================================== (Binary files differ) Modified: trunk/doc/userGuide.py =================================================================== --- trunk/doc/userGuide.py 2016-01-16 17:31:00 UTC (rev 4998) +++ trunk/doc/userGuide.py 2016-01-16 17:58:23 UTC (rev 4999) @@ -4840,10 +4840,7 @@ traj = simulateForwardTrajectory(N=[2000, 4000], fitness=[1, 0.99, 0.98], beginGen=0, endGen=100, beginFreq=[0.2, 0.3], endFreq=[[0.1, 0.11], [0.2, 0.21]]) -# rpy syntax -#traj.plot('log/forwardTrajectory.png', plot_ylim=[0, 0.5], col_sp=['red', 'blue'], -# plot_main='Simulated Trajectory (forward-time)') -# matplotlib syntax +# traj.plot('log/forwardTrajectory.png', set_ylim_top=0.5, plot_c_sp=['r', 'b'], set_title_label='Simulated Trajectory (forward-time)') pop = sim.Population(size=[2000, 4000], loci=10, infoFields='fitness') @@ -5076,11 +5073,11 @@ ExponentialGrowthModel(r=0.01, NT=[2000, 4000]), AdmixtureModel(model=('HI', 0, 1, 0.8, 'admixed'), T=10) ]).plot('log/MultiStage.png') -#OutOfAfricaModel(10000).plot('log/OutOfAfrica.png') +OutOfAfricaModel(10000).plot('log/OutOfAfrica.png') #OutOfAfricaModel(10000, scale=10).plot('log/ScaledOutOfAfrica.png') -#SettlementOfNewWorldModel(10000).plot('log/SettlementOfNewWorld.png') +SettlementOfNewWorldModel(10000).plot('log/SettlementOfNewWorld.png') #SettlementOfNewWorldModel(10000, scale=10).plot('log/ScaledSettlementOfNewWorld.png') -#CosiModel(20000).plot('log/Cosi.png') +CosiModel(20000).plot('log/Cosi.png') #CosiModel(20000, scale=10).plot('log/ScaledCosi.png') #end_ignore #end_file @@ -5209,6 +5206,39 @@ ) #end_file +#begin_file log/varPlotter.py +#begin_ignore +import simuOpt +simuOpt.setOptions(quiet=True) +#end_ignore +import simuPOP as sim +#begin_ignore +sim.setRNG(seed=12345) +#end_ignore +from simuPOP.plotter import VarPlotter +pop = sim.Population(size=1000, loci=2) +simu = sim.Simulator(pop, rep=3) +simu.evolve( + initOps=[ + sim.InitSex(), + sim.InitGenotype(genotype=[1, 2, 2, 1]) + ], + matingScheme=sim.RandomMating(ops=sim.Recombinator(rates=0.01)), + postOps=[ + sim.Stat(LD=[0, 1]), + # + VarPlotter('LD[0][1]', step=5, update=40, saveAs='log/varplot.png', + legend=['Replicate %d' % x for x in range(3)], + set_ylabel_ylabel='LD between marker 1 and 2', + set_title_label='LD decay', + set_ylim_bottom=0, set_ylim_top=0.25, + plot_linestyle_rep=['-', ':', '-.'], + ), + ], + gen=100 +) +#end_file + #begin_file log/varPlotByDim.py #begin_ignore import simuOpt Modified: trunk/src/__init__.py =================================================================== --- trunk/src/__init__.py 2016-01-16 17:31:00 UTC (rev 4998) +++ trunk/src/__init__.py 2016-01-16 17:58:23 UTC (rev 4999) @@ -358,7 +358,7 @@ if not simuOptions['Quiet']: info = moduleInfo() - print("simuPOP Version %s : Copyright (c) 2004-2011 Bo Peng" % (__version__)) + print("simuPOP Version %s : Copyright (c) 2004-2016 Bo Peng" % (__version__)) # compile date, compiler etc are macros that are replaced during compile time. print("Revision %d (%s) for Python %s (%dbit, %d%s)" % \ (info['revision'], info['date'], info['python'], info['wordsize'], info['threads'], Modified: trunk/src/simuPOP_doc.i =================================================================== --- trunk/src/simuPOP_doc.i 2016-01-16 17:31:00 UTC (rev 4998) +++ trunk/src/simuPOP_doc.i 2016-01-16 17:58:23 UTC (rev 4999) @@ -55,6 +55,93 @@ "; +%feature("docstring") simuPOP::BackwardMigrator " + +Details: + + This operator migrates individuals between all available or + specified subpopulations, according to a backward migration + matrix. It differs from Migrator in how migration matrixes are + interpreted. Due to the limit of this model, this operator does + not support migration by information field, migration by count + (mode = BY_COUNT), migration from virtual subpopulations, + migration between different number of subpopulations, and the + creation of new subpopulation, as operator Migrator provides. In + contrast to a forward migration matrix where $m_{ij}$ is + considered the probability (proportion or count) of individuals + migrating from subpopulation i to j, elements in a reverse + migration matrix $m_{ij}$ is considered the probability + (proportion or count) of individuals migrating from subpopulation + j to i, namely the probability (proportion or count) of + individuals originats from subpopulation j. If migration is + applied by probability, the row of the migration matrix + corresponding to a destination subpopulation is intepreted as + probabilities to orignate from each source subpopulation. Each + individual's source subpopulation is assigned randomly according + to these probabilities. Note that the probability of originating + from the present subpopulation is automatically calculated so the + corresponding matrix elements are ignored. If migration is + applied by proportion, the row of the migration matrix + corresponding to a destination subpopulation is intepreted as + proportions to originate from each source subpopulation. The + number of migrants from each source subpopulation is determined + before random indidividuals are chosen to migrate. Unlike the + forward migration matrix that describes how migration should be + performed, the backward migration matrix describes the result of + migration. The underlying forward migration matrix is calculated + at each generation and is in theory not the same across + generations. This operator calculates the corresponding forward + migration matrix from backward matrix and current population size. + This process is not always feasible so an error will raise if no + valid ending population size or forward migration matrix could be + determined. Please refer to the simuPOP user's guide for an + explanation of the theory behind forward and backward migration + matrices. + +"; + +%feature("docstring") simuPOP::BackwardMigrator::BackwardMigrator " + +Usage: + + BackwardMigrator(rate=[], mode=BY_PROBABILITY, begin=0, end=-1, + step=1, at=[], reps=ALL_AVAIL, subPops=ALL_AVAIL, + infoFields=\"migrate_to\") + +Details: + + Create a BackwardMigrator that moves individuals between subPop + subpopulations randomly according to a backward migration matrix + rate. The size of the matrix should match the number of + subpopulations. Depending on the value of parameter mode, + elements in the migration matrix (rate) are interpreted as either + the probabilities to originate from source subpopulations (mode = + BY_PROBABILITY) or proportions of individuals originate from the + source (virtual) subpopulations (mode = BY_PROPORTION). Migration + by count is not supported by this operator. Please refer to + operator BaseOperator for a detailed explanation for all + parameters. + +"; + +%feature("docstring") simuPOP::BackwardMigrator::~BackwardMigrator " + +Description: + + destructor + +Usage: + + x.~BackwardMigrator() + +"; + +%feature("docstring") simuPOP::BackwardMigrator::clone "Obsolete or undocumented function." + +%feature("docstring") simuPOP::BackwardMigrator::apply "Obsolete or undocumented function." + +%feature("docstring") simuPOP::BackwardMigrator::describe "Obsolete or undocumented function." + %feature("docstring") simuPOP::BaseMutator " Details: @@ -756,7 +843,7 @@ distrubution to find the next true event. Also, for the cases of p=0.5, random bits are generated. This class maintain a two dimensional table: a vector of probabilities cross expected number - of trials p1 p2 p3 p4 p5 trial 1 trial 2 ... trial N We expect + of trials p1 p2 p3 p4 p5 trial 1 trial 2 ... trial N We expect that N is big (usually populaiton size) and p_i are small using fast bernulliTrial method for fix p, we can fill up this table very quickly column by column This class will provide easy access @@ -3320,9 +3407,9 @@ this class implements a C++ iterator class that iterate through individuals in a (sub)population. If allInds are true, the visiblility of individuals will not be checked. Note that - IndividualIterator *will* iterate through only visible - individuals, and allInds is only provided when we know in advance - that all individuals are visible. This is a way to obtain better + IndividualIteratorwill iterate through only visible individuals, + and allInds is only provided when we know in advance that all + individuals are visible. This is a way to obtain better performance in simple cases. "; @@ -4608,8 +4695,7 @@ them and assign affection status accordingly. ADDITIVE, multiplicative, and a heterogeneour multi-locus model are supported. Please refer to Neil Rish (1989) \"Linkage Strategies - for Genetically Complex Traits\" for some analysis of these - models. + for Genetically Complex Traits\" for some analysis of these models. "; @@ -5265,11 +5351,11 @@ it is applied to this population. If stopOnKeyStroke is False (default), it will always pause a population when it is applied, if this parameter is set to True, the operator will pause a - population if *any* key has been pressed. If a specific character - is set, the operator will stop when this key has been pressed. - This allows, for example, the use of several pause operators to - pause different populations. After a population has been paused, - a message will be displayed (unless prompt is set to False) and + population if any key has been pressed. If a specific character is + set, the operator will stop when this key has been pressed. This + allows, for example, the use of several pause operators to pause + different populations. After a population has been paused, a + message will be displayed (unless prompt is set to False) and tells you how to proceed. You can press 's' to stop the evolution of this population, 'S' to stop the evolution of all populations, or 'p' to enter a Python shell. The current population will be @@ -5771,9 +5857,8 @@ parameter ploidy. This operator is by default applied to individuals in the first subpopulation but you can apply it to a different or more than one (virtual) subpopulations using - parameter *subPops* (``AllAvail`` is also accepted). Please refer - to class BaseOperator for detailed descriptions of other - parameters. + parameter subPops (AllAvail is also accepted). Please refer to + class BaseOperator for detailed descriptions of other parameters. "; @@ -7035,9 +7120,9 @@ %ignore simuPOP::Population::setDict(PyObject *dict); -%ignore simuPOP::Population::varsAsString() const; +%ignore simuPOP::Population::varsAsString(bool use_pickle=false) const; -%ignore simuPOP::Population::varsFromString(const string &vars); +%ignore simuPOP::Population::varsFromString(const string &vars, bool use_pickle=false); %feature("docstring") simuPOP::Population::evaluate "Obsolete or undocumented function." @@ -8512,14 +8597,11 @@ Note: - conversion tract length is usually short, and is estimated to be - between 337 and 456 bp, with overall range between maybe 50 - 2500 - bp. This is usually not enough to convert, for example, two - adjacent markers from the HapMap dataset.There is no recombination - between sex chromosomes (Chromosomes X and Y), although - recombination is possible between pesudoautosomal regions on these - chromosomes. If such a feature is required, you will have to - simulate the pesudoautosomal regions as separate chromosomes. + There is no recombination between sex chromosomes (Chromosomes X + and Y), although recombination is possible between pesudoautosomal + regions on these chromosomes. If such a feature is required, you + will have to simulate the pesudoautosomal regions as separate + chromosomes. "; @@ -9335,14 +9417,12 @@ %ignore simuPOP::SharedVariables::asString() const; -%feature("docstring") simuPOP::SharedVariables::fromString " +%ignore simuPOP::SharedVariables::fromString(const string &vars); -Usage: +%ignore simuPOP::SharedVariables::topickle() const; - x.fromString(vars) +%ignore simuPOP::SharedVariables::frompickle(const string &vars); -"; - %ignore simuPOP::simpleStmt; %feature("docstring") simuPOP::simpleStmt::simpleStmt " @@ -11431,10 +11511,10 @@ Individuals without parents are assumed to be in the top-most ancestral generation. This is the case for individuals in the top- most ancestral generation if the file is saved by function - ``Pedigree.save()``, and for individuals who only appear as - another individual's parent, if the file is saved by operator - ``PedigreeTagger``. The order at which offsprng is specified is - not important because this function essentially creates a top-most + Pedigree.save(), and for individuals who only appear as another + individual's parent, if the file is saved by operator + PedigreeTagger. The order at which offsprng is specified is not + important because this function essentially creates a top-most ancestral generation using IDs without parents, and creates the next generation using offspring of these parents, and so on until all generations are recreated. That is to say, if you have a Modified: trunk/src/utils.py =================================================================== --- trunk/src/utils.py 2016-01-16 17:31:00 UTC (rev 4998) +++ trunk/src/utils.py 2016-01-16 17:58:23 UTC (rev 4999) @@ -831,9 +831,8 @@ self.traj[gen].append([x for x in spFreq]) def plot(self, filename=None, **kwargs): - '''Plot simulated Trajectory using ``R`` through a Python module ``rpy``, - or ``matplotlib`` if ``rpy`` is not available. The function will return - silently if module ``rpy`` and ``matplotlib`` cannot be imported. + '''Plot simulated Trajectory using ``matplotlib``. The function will + return silently if module ``matplotlib`` cannot be imported. This function will use different colors to plot trajectories at different loci. The trajectories are plotted from generation 0 to @@ -845,98 +844,16 @@ your version of R or functions of matplotlib. This function makes use of the derived keyword parameter feature of - module ``plotter``. The ``rpy`` version allows prefixes ``par``, - ``plot``, ``lines`` and ``dev_print``, and suffixes ``loc`` and ``sp``. - For example, you could use parameter ``plot_ylim`` to reset the default - value of ``ylim`` in R function ``plot``. The ``matplotlib`` version allows - prefix ``figure``, ``plot``, ``set_title``, ``set_ylim``, ``set_xlabel``, - and ``set_ylabel``, and suffixes ``loc`` and ``sp``. - ''' + module ``plotter``, with prefix ``figure``, ``plot``, ``set_title``, + ``set_ylim``, ``set_xlabel``, and ``set_ylabel``, and suffixes ``loc`` + and ``sp``. ''' plotter = simuOptions['Plotter'] - if plotter is None: - try: - import rpy - self._rpy_plot(filename, rpy2=False, **kwargs) - except ImportError: - try: - import rpy2 - self._rpy_plot(filename, rpy2=True, **kwargs) - except ImportError: - try: - import matplotlib - self._mat_plot(filename, **kwargs) - except ImportError: - sys.stderr.write('Failed to draw figure: rpy or matplotlib is not available.') - elif plotter == 'rpy': - self._rpy_plot(filename, rpy2=False, **kwargs) - elif plotter == 'rpy2': - self._rpy_plot(filename, rpy2=True, **kwargs) - else: + try: + import matplotlib self._mat_plot(filename, **kwargs) + except ImportError: + sys.stderr.write('Failed to draw figure: rpy or matplotlib is not available.') - def _rpy_plot(self, filename, rpy2, **kwargs): - import plotter - # - args = plotter.DerivedArgs( - defaultFuncs=['plot', 'lines'], - allFuncs = ['par', 'plot', 'lines', 'dev_print'], - suffixes = ['loc', 'sp'], - defaultParams = { - 'plot_ylim': [0, 1], - 'plot_ylab': 'Allele frequency', - 'plot_xlab': 'Generation' - }, - **kwargs - ) - # device - plotter.newDevice() - # - gens = self.traj.keys() - gens.sort() - plotter.r.par(**args.getArgs('par', None)) - plotter.r.plot(gens[0], 0, - **args.getArgs('plot', None, xlim=(min(gens), max(gens)), type='n')) - allLines = [] - for gen in gens: - for sp in range(len(self.traj[gen])): - if len(allLines) <= sp: - allLines.append([]) - lines = allLines[sp] - if len(lines) != len(self.traj[gen][0]): - if len(lines) != 0: - for loc, line in enumerate(lines): - # remove leading zero's - for start in range(len(line)): - if line[start] != 0: - break - if start == len(line) - 1: - continue - r.lines(x=range(beginGen - len(line) + start, gen), y=line[start:], - **args.getArgs('lines', None, sp=sp, loc=loc)) - # the first point - allLines[sp] = [[x] for x in self.traj[gen][sp]] - else: - for loc, x in enumerate(self.traj[gen][sp]): - lines[loc].append(x) - # plot the lines again - for sp, lines in enumerate(allLines): - for loc, line in enumerate(lines): - # remove leading zero's - for start in range(len(line)): - if line[start] != 0: - break - if start == len(line) - 1: - continue - beginGen = gen - len(line) + start - plotter.r.lines(x=range(beginGen, gen), y=line[start:], - **args.getArgs('lines', None, sp=sp, loc=loc)) - # - plotter.saveFigure(**args.getArgs('dev_print', None, file=filename)) - if rpy2: - plotter.r['dev.off']() - else: - plotter.r.dev_off() - def _mat_plot(self, filename, **kwargs): import matplotlib.pylab as plt import plotter This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |