Browse Source

Grid of plots for swp2 thetas

tforest 11 months ago
parent
commit
3f174048f1
1 changed files with 74 additions and 65 deletions
  1. 74 65
      swp2.py

+ 74 - 65
swp2.py View File

216
     plt.title(title)
216
     plt.title(title)
217
     plt.savefig(title+'_b'+str(breaks)+'.pdf')
217
     plt.savefig(title+'_b'+str(breaks)+'.pdf')
218
 
218
 
219
-def plot_all_epochs_thetafolder(folder_path, mu, tgen, title = "Title", theta_scale = True):
219
+def plot_all_epochs_thetafolder(folder_path, mu, tgen, title = "Title", theta_scale = True, ax = None):
220
     #scenari = {}
220
     #scenari = {}
221
     cpt = 0
221
     cpt = 0
222
     epochs = {}
222
     epochs = {}
239
                                                                   mu = mu, relative_theta_scale = theta_scale)
239
                                                                   mu = mu, relative_theta_scale = theta_scale)
240
     print("\n*******\n"+title+"\n--------\n"+"mu="+str(mu)+"\ntgen="+str(tgen)+"\nbreaks="+str(breaks)+"\n*******\n")
240
     print("\n*******\n"+title+"\n--------\n"+"mu="+str(mu)+"\ntgen="+str(tgen)+"\nbreaks="+str(breaks)+"\n*******\n")
241
     print(cpt, "theta file(s) have been scanned.")
241
     print(cpt, "theta file(s) have been scanned.")
242
-
243
-    # intialize figure
244
     my_dpi = 300
242
     my_dpi = 300
245
-    plt.figure(figsize=(5000/my_dpi, 2800/my_dpi), dpi=my_dpi)
246
-    plt.xlim(1e-3, 1)
243
+    if ax is None:
244
+        # intialize figure
245
+        my_dpi = 300
246
+        fnt_size = 18
247
+        fig, ax1 = plt.subplots(figsize=(5000/my_dpi, 2800/my_dpi), dpi=my_dpi)
248
+    else:
249
+        fnt_size = 12
250
+        plt.rcParams['font.size'] = fnt_size
251
+        ax1 = ax[0,0]
252
+    ax1.set_xlim(1e-3, 1)
247
     #plt.ylim(0, 10)
253
     #plt.ylim(0, 10)
248
-    plt.yscale('log')
249
-    plt.xscale('log')
250
-    plt.grid(True,which="both", linestyle='--', alpha = 0.3)
254
+    ax1.set_yscale('log')
255
+    ax1.set_xscale('log')
256
+    ax1.grid(True,which="both", linestyle='--', alpha = 0.3)
251
     brkpt_lik = []
257
     brkpt_lik = []
252
     for epoch, scenari in epochs.items():
258
     for epoch, scenari in epochs.items():
253
         # sort starting by the smallest -log(Likelihood)
259
         # sort starting by the smallest -log(Likelihood)
265
             # divide by N0
271
             # divide by N0
266
             y[i] = y[i]/N0
272
             y[i] = y[i]/N0
267
             x[i] = x[i]/N0
273
             x[i] = x[i]/N0
268
-        plt.plot(x, y, 'o', linestyle = "-", alpha=0.75, lw=2, label = str(epoch)+' BrkPt | Lik='+greatest_likelihood)
274
+        ax1.plot(x, y, 'o', linestyle = "-", alpha=0.75, lw=2, label = str(epoch)+' BrkPt | Lik='+greatest_likelihood)
269
         if theta_scale:
275
         if theta_scale:
270
-            plt.xlabel("Coal. time")
271
-            plt.ylabel("Pop. size scaled by N0")
276
+            ax1.set_xlabel("Coal. time")
277
+            ax1.set_ylabel("Pop. size scaled by N0")
272
             recent_scale_lower_bound = 0.01
278
             recent_scale_lower_bound = 0.01
273
             recent_scale_upper_bound = 0.1
279
             recent_scale_upper_bound = 0.1
274
             #print(recent_scale_lower_bound, recent_scale_upper_bound)
280
             #print(recent_scale_lower_bound, recent_scale_upper_bound)
275
-            plt.axvline(x=recent_scale_lower_bound)
276
-            plt.axvline(x=recent_scale_upper_bound)
281
+            ax1.axvline(x=recent_scale_lower_bound)
282
+            ax1.axvline(x=recent_scale_upper_bound)
277
         else:
283
         else:
278
             # years
284
             # years
279
-            plt.xlabel("Time (years)")
280
-            plt.ylabel("Individuals (N)")
281
-        plt.xlim(1e-5, 1)
282
-        plt.legend(loc='upper right')
283
-        plt.title(title)
284
-        plt.savefig(title+'_b'+str(breaks)+'.pdf')
285
+            plt.set_xlabel("Time (years)")
286
+            plt.set_ylabel("Individuals (N)")
287
+        ax1.set_xlim(1e-5, 1)
288
+        ax1.legend(loc='best', fontsize = fnt_size*0.5)
289
+        ax1.set_title(title)
290
+        if ax is None:
291
+            plt.savefig(title+'_b'+str(breaks)+'.pdf')
285
     # plot likelihood against nb of breakpoints
292
     # plot likelihood against nb of breakpoints
286
     # best possible likelihood from SFS
293
     # best possible likelihood from SFS
287
     # Segregating sites
294
     # Segregating sites
299
     res = Ln
306
     res = Ln
300
     # print(res)
307
     # print(res)
301
     # basic plot likelihood
308
     # basic plot likelihood
302
-    plt.figure(figsize=(5000/my_dpi, 2800/my_dpi), dpi=my_dpi)
303
-    plt.rcParams['font.size'] = '18'
304
-    plt.plot(np.array(brkpt_lik)[:, 0], np.array(brkpt_lik)[:, 1].astype(float), 'o', linestyle = "dotted", lw=2)
309
+    if ax is None:
310
+        fig, ax2 = plt.subplots(figsize=(5000/my_dpi, 2800/my_dpi), dpi=my_dpi)
311
+        plt.rcParams['font.size'] = '18'
312
+    else:
313
+        plt.rcParams['font.size'] = fnt_size
314
+        ax2 = ax[2,0]
315
+    ax2.plot(np.array(brkpt_lik)[:, 0], np.array(brkpt_lik)[:, 1].astype(float), 'o', linestyle = "dotted", lw=2)
305
     # plt.ylim(0,100)
316
     # plt.ylim(0,100)
306
-    # plt.axhline(y=res)
307
-    plt.yscale('log')
308
-    plt.xlabel("# breakpoints", fontsize=20)
309
-    plt.ylabel("$-\log\mathcal{L}$")
310
-    #plt.legend(loc='upper right')
311
-    plt.title(title)
312
-    plt.savefig(title+'_Breakpts_Likelihood.pdf')
317
+    ax2.axhline(y=-Ln)
318
+    ax2.set_yscale('log')
319
+    ax2.set_xlabel("# breakpoints", fontsize=fnt_size)
320
+    ax2.set_ylabel("$-\log\mathcal{L}$")
321
+    #ax2.legend(loc='best', fontsize = fnt_size*0.5)
322
+    ax2.set_title(title)
323
+    if ax is None:
324
+        plt.savefig(title+'_Breakpts_Likelihood.pdf')
313
     # AIC
325
     # AIC
314
-    plt.figure(figsize=(5000/my_dpi, 2800/my_dpi), dpi=my_dpi)
315
-    plt.rcParams['font.size'] = '18'
326
+    if ax is None:
327
+        fig, ax3 = plt.subplots(figsize=(5000/my_dpi, 2800/my_dpi), dpi=my_dpi)
328
+        plt.rcParams['font.size'] = '18'
329
+    else:
330
+        ax3 = ax[2,1]
316
     AIC = 2*(len(brkpt_lik)+1)+2*np.array(brkpt_lik)[:, 1].astype(float)
331
     AIC = 2*(len(brkpt_lik)+1)+2*np.array(brkpt_lik)[:, 1].astype(float)
317
-    plt.plot(np.array(brkpt_lik)[:, 0], AIC, 'o', linestyle = "dotted", lw=2)
318
-    # plt.axhline(y=106)
319
-    plt.yscale('log')
320
-    plt.xlabel("# breakpoints", fontsize=20)
321
-    plt.ylabel("AIC")
322
-    #plt.legend(loc='upper right')
323
-    plt.title(title)
324
-    plt.savefig(title+'_Breakpts_Likelihood_AIC.pdf')
325
-
326
-def plot_test_theta(folder_path, mu, tgen, title = "Title", theta_scale = True, breaks_max = 12, ax = None):
332
+    ax3.plot(np.array(brkpt_lik)[:, 0], AIC, 'o', linestyle = "dotted", lw=2)
333
+    ax3.axhline(y=2*(len(brkpt_lik)+1)-2*Ln)
334
+    ax3.set_yscale('log')
335
+    ax3.set_xlabel("# breakpoints", fontsize=fnt_size)
336
+    ax3.set_ylabel("AIC")
337
+    #ax3.legend(loc='best', fontsize = fnt_size*0.5)
338
+    ax3.set_title(title)
339
+    if ax is None:
340
+        plt.savefig(title+'_Breakpts_Likelihood_AIC.pdf')
341
+    return ax
342
+def plot_test_theta(folder_path, mu, tgen, title = "Title", theta_scale = True, breaks_max = 10, ax = None):
327
     """
343
     """
328
     Use theta values as is to do basic plots.
344
     Use theta values as is to do basic plots.
329
     """
345
     """
341
                 epochs[k] = thetas
357
                 epochs[k] = thetas
342
     print("\n*******\n"+title+"\n--------\n"+"mu="+str(mu)+"\ntgen="+str(tgen)+"\nbreaks="+str(k)+"\n*******\n")
358
     print("\n*******\n"+title+"\n--------\n"+"mu="+str(mu)+"\ntgen="+str(tgen)+"\nbreaks="+str(k)+"\n*******\n")
343
     print(cpt, "theta file(s) have been scanned.")
359
     print(cpt, "theta file(s) have been scanned.")
344
-    # intialize figure 1
345
-    my_dpi = 300
346
-    # plt.figure(figsize=(5000/my_dpi, 2800/my_dpi), dpi=my_dpi)
347
     # multiple fig
360
     # multiple fig
348
     if ax is None:
361
     if ax is None:
362
+        # intialize figure 1
363
+        my_dpi = 300
364
+        fnt_size = 18
349
         fig, ax1 = plt.subplots(figsize=(5000/my_dpi, 2800/my_dpi), dpi=my_dpi)
365
         fig, ax1 = plt.subplots(figsize=(5000/my_dpi, 2800/my_dpi), dpi=my_dpi)
350
         # Add some extra space for the second axis at the bottom
366
         # Add some extra space for the second axis at the bottom
351
         fig.subplots_adjust(bottom=0.15)
367
         fig.subplots_adjust(bottom=0.15)
352
     else:
368
     else:
369
+        fnt_size = 12
353
         ax1 = ax[0, 1]
370
         ax1 = ax[0, 1]
354
         plt.subplots_adjust(wspace=0.3, hspace=0.3)
371
         plt.subplots_adjust(wspace=0.3, hspace=0.3)
355
 
372
 
389
     twin.xaxis.set_ticks_position("bottom")
406
     twin.xaxis.set_ticks_position("bottom")
390
     twin.xaxis.set_label_position("bottom")
407
     twin.xaxis.set_label_position("bottom")
391
     # Offset the twin axis below the host
408
     # Offset the twin axis below the host
392
-    twin.spines["bottom"].set_position(("axes", -0.15))
409
+    if ax is None:
410
+        # arrange differently the second x axis if the plot is plain
411
+        twin.spines["bottom"].set_position(("axes", -0.15))
412
+    else:
413
+        # in a combined plot, more space between the fig and the axis
414
+        twin.spines["bottom"].set_position(("axes", -0.35))
393
     #ax.legend(handles=[p0]+plots)
415
     #ax.legend(handles=[p0]+plots)
394
     ax1.set_xlabel("# breaks")
416
     ax1.set_xlabel("# breaks")
395
     # Set the x-axis locator to reduce the number of ticks to 10
417
     # Set the x-axis locator to reduce the number of ticks to 10
396
     ax1.xaxis.set_major_locator(MaxNLocator(nbins=10))
418
     ax1.xaxis.set_major_locator(MaxNLocator(nbins=10))
397
     ax1.set_ylabel("theta")
419
     ax1.set_ylabel("theta")
398
-    # twin.set_ylabel("Proportion")
399
-    plt.legend(handles=plots, loc='upper right')
420
+    twin.set_ylabel("Proportion")
421
+    ax1.legend(handles=plots, loc='best', fontsize = fnt_size*0.5)
400
     if ax is None:
422
     if ax is None:
401
         plt.savefig(title+'_raw'+str(k)+'.pdf')
423
         plt.savefig(title+'_raw'+str(k)+'.pdf')
402
     # fig 2 & 3
424
     # fig 2 & 3
439
     ax2.set_xlabel("# breaks")
461
     ax2.set_xlabel("# breaks")
440
     ax2.set_ylabel("theta")
462
     ax2.set_ylabel("theta")
441
     ax2.set_title("Test")
463
     ax2.set_title("Test")
442
-    ax2.legend(handles=lines_fig2, loc='upper right')
464
+    ax2.legend(handles=lines_fig2, loc='best', fontsize = fnt_size*0.5)
443
     if ax is None:
465
     if ax is None:
444
         plt.savefig(title+'_plot2_'+str(k)+'.pdf')
466
         plt.savefig(title+'_plot2_'+str(k)+'.pdf')
445
     ax3.set_xscale('log')
467
     ax3.set_xscale('log')
446
     ax3.set_xlabel("log()")
468
     ax3.set_xlabel("log()")
447
     ax3.set_ylabel("theta")
469
     ax3.set_ylabel("theta")
448
     ax3.set_title("Test")
470
     ax3.set_title("Test")
449
-    ax3.legend(handles=lines_fig3, loc='upper right')
471
+    ax3.legend(handles=lines_fig3, loc='best', fontsize = fnt_size*0.5)
450
     if ax is None:
472
     if ax is None:
451
         plt.savefig(title+'_plot3_'+str(k)+'_log.pdf')
473
         plt.savefig(title+'_plot3_'+str(k)+'_log.pdf')
452
     # return plots
474
     # return plots
453
     return ax
475
     return ax
454
 
476
 
455
-def save_combined_pdf(output_path):
456
-    with PdfPages(output_path) as pdf:
457
-        pdf.savefig()
458
-
459
-def save_multi_image(filename):
460
-    pp = PdfPages(filename)
461
-    fig_nums = plt.get_fignums()
462
-    figs = [plt.figure(n) for n in fig_nums]
463
-    for fig in figs:
464
-        fig.savefig(pp, format='pdf')
465
-    pp.close()
466
-
467
 def combined_plot(folder_path, mu, tgen, breaks, title = "Title", theta_scale = True):
477
 def combined_plot(folder_path, mu, tgen, breaks, title = "Title", theta_scale = True):
468
-    # plot1, plot2, plot3 = plot_all_epochs_thetafolder(folder_path, mu, tgen, title, theta_scale)
469
     my_dpi = 300
478
     my_dpi = 300
470
     # Add some extra space for the second axis at the bottom
479
     # Add some extra space for the second axis at the bottom
471
-    fig, axs = plt.subplots(2, 2, figsize=(5000/my_dpi, 2800/my_dpi), dpi=my_dpi)
472
-
480
+    fig, axs = plt.subplots(3, 2, figsize=(4500/my_dpi, 2970/my_dpi), dpi=my_dpi)
481
+    ax = plot_all_epochs_thetafolder(folder_path, mu, tgen, title, theta_scale, ax = axs)
473
     ax = plot_test_theta(folder_path, mu, tgen, title, theta_scale, breaks_max = breaks, ax = axs)
482
     ax = plot_test_theta(folder_path, mu, tgen, title, theta_scale, breaks_max = breaks, ax = axs)
474
 
483
 
475
     # Adjust layout to prevent clipping of titles
484
     # Adjust layout to prevent clipping of titles
476
     plt.tight_layout()
485
     plt.tight_layout()
477
     # Adjust absolute space between the top and bottom rows
486
     # Adjust absolute space between the top and bottom rows
478
-    plt.subplots_adjust(hspace=0.35)  # Adjust this value based on your requirement
487
+    plt.subplots_adjust(hspace=0.7)  # Adjust this value based on your requirement
479
 
488
 
480
     # Save the entire grid as a single figure
489
     # Save the entire grid as a single figure
481
     plt.savefig(title+'_combined.pdf')
490
     plt.savefig(title+'_combined.pdf')