added plotting shellscript
This commit is contained in:
		
							parent
							
								
									c520dedc58
								
							
						
					
					
						commit
						3ddec7d0b3
					
				
							
								
								
									
										1421
									
								
								chirpdetection.bib
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1421
									
								
								chirpdetection.bib
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -7,7 +7,7 @@ import matplotlib.pyplot as plt | ||||
| import matplotlib.gridspec as gr | ||||
| from scipy.signal import find_peaks | ||||
| from thunderfish.powerspectrum import spectrogram, decibel | ||||
| from sklearn.preprocessing import normalize | ||||
| # from sklearn.preprocessing import normalize | ||||
| 
 | ||||
| from modules.filters import bandpass_filter, envelope, highpass_filter | ||||
| from modules.filehandling import ConfLoader, LoadData, make_outputdir | ||||
| @ -18,7 +18,7 @@ from modules.datahandling import ( | ||||
|     purge_duplicates, | ||||
|     group_timestamps, | ||||
|     instantaneous_frequency, | ||||
|     minmaxnorm | ||||
|     minmaxnorm, | ||||
| ) | ||||
| 
 | ||||
| logger = makeLogger(__name__) | ||||
| @ -101,13 +101,9 @@ class ChirpPlotBuffer: | ||||
|         self.t0_old = self.t0 | ||||
|         self.t0 = 0 | ||||
| 
 | ||||
|         fig = plt.figure( | ||||
|             figsize=(14 * ps.cm, 18 * ps.cm) | ||||
|         ) | ||||
|         fig = plt.figure(figsize=(14 * ps.cm, 18 * ps.cm)) | ||||
| 
 | ||||
|         gs0 = gr.GridSpec( | ||||
|             3, 1, figure=fig, height_ratios=[1, 1, 1] | ||||
|         ) | ||||
|         gs0 = gr.GridSpec(3, 1, figure=fig, height_ratios=[1, 1, 1]) | ||||
|         gs1 = gs0[0].subgridspec(1, 1) | ||||
|         gs2 = gs0[1].subgridspec(3, 1, hspace=0.4) | ||||
|         gs3 = gs0[2].subgridspec(3, 1, hspace=0.4) | ||||
| @ -133,10 +129,9 @@ class ChirpPlotBuffer: | ||||
|             data_oi, | ||||
|             self.data.raw_rate, | ||||
|             self.t0 - 5, | ||||
|             [np.min(self.frequency) - 300, np.max(self.frequency) + 300] | ||||
|             [np.min(self.frequency) - 300, np.max(self.frequency) + 300], | ||||
|         ) | ||||
|         ax0.set_ylim(np.min(self.frequency) - 100, | ||||
|                      np.max(self.frequency) + 200) | ||||
|         ax0.set_ylim(np.min(self.frequency) - 100, np.max(self.frequency) + 200) | ||||
| 
 | ||||
|         for track_id in self.data.ids: | ||||
| 
 | ||||
| @ -155,11 +150,9 @@ class ChirpPlotBuffer: | ||||
|             # tmask = (t >= t0_track) & (t <= (t0_track + dt_track)) | ||||
|             t = self.data.time[self.data.idx[window_idx]] | ||||
|             if track_id == self.track_id: | ||||
|                 ax0.plot(t-self.t0_old, f, lw=lw, | ||||
|                          zorder=10, color=ps.gblue1) | ||||
|                 ax0.plot(t - self.t0_old, f, lw=lw, zorder=10, color=ps.gblue1) | ||||
|             else: | ||||
|                 ax0.plot(t-self.t0_old, f, lw=lw, | ||||
|                          zorder=10, color=ps.black) | ||||
|                 ax0.plot(t - self.t0_old, f, lw=lw, zorder=10, color=ps.black) | ||||
| 
 | ||||
|         # ax0.fill_between( | ||||
|         #     np.arange(self.t0, self.t0 + self.dt, 1 / self.data.raw_rate), | ||||
| @ -181,10 +174,12 @@ class ChirpPlotBuffer: | ||||
|         #     alpha=0.5, | ||||
|         # ) | ||||
| 
 | ||||
|         ax0.axhline(q50 - self.config.minimal_bandwidth / 2, | ||||
|                     color=ps.gblue1, lw=1, ls="dashed") | ||||
|         ax0.axhline(q50 + self.config.minimal_bandwidth / 2, | ||||
|                     color=ps.gblue1, lw=1, ls="dashed") | ||||
|         ax0.axhline( | ||||
|             q50 - self.config.minimal_bandwidth / 2, color=ps.gblue1, lw=1, ls="dashed" | ||||
|         ) | ||||
|         ax0.axhline( | ||||
|             q50 + self.config.minimal_bandwidth / 2, color=ps.gblue1, lw=1, ls="dashed" | ||||
|         ) | ||||
|         ax0.axhline(search_lower, color=ps.gblue2, lw=1, ls="dashed") | ||||
|         ax0.axhline(search_upper, color=ps.gblue2, lw=1, ls="dashed") | ||||
| 
 | ||||
| @ -197,7 +192,10 @@ class ChirpPlotBuffer: | ||||
|         if len(chirps) > 0: | ||||
|             for chirp in chirps: | ||||
|                 ax0.scatter( | ||||
|                     chirp, np.median(self.frequency), c=ps.red, marker=".", | ||||
|                     chirp, | ||||
|                     np.median(self.frequency), | ||||
|                     c=ps.red, | ||||
|                     marker=".", | ||||
|                     edgecolors=ps.black, | ||||
|                     facecolors=ps.red, | ||||
|                     zorder=10, | ||||
| @ -205,27 +203,43 @@ class ChirpPlotBuffer: | ||||
|                 ) | ||||
| 
 | ||||
|         # plot waveform of filtered signal | ||||
|         ax1.plot(self.time, self.baseline * waveform_scaler, | ||||
|                  c=ps.gray, lw=lw, alpha=0.5) | ||||
|         ax1.plot(self.time, self.baseline_envelope_unfiltered * | ||||
|                  waveform_scaler, c=ps.gblue1, lw=lw, label="baseline envelope") | ||||
|         ax1.plot( | ||||
|             self.time, self.baseline * waveform_scaler, c=ps.gray, lw=lw, alpha=0.5 | ||||
|         ) | ||||
|         ax1.plot( | ||||
|             self.time, | ||||
|             self.baseline_envelope_unfiltered * waveform_scaler, | ||||
|             c=ps.gblue1, | ||||
|             lw=lw, | ||||
|             label="baseline envelope", | ||||
|         ) | ||||
| 
 | ||||
|         # plot waveform of filtered search signal | ||||
|         ax2.plot(self.time, self.search * waveform_scaler, | ||||
|                  c=ps.gray, lw=lw, alpha=0.5) | ||||
|         ax2.plot(self.time, self.search_envelope_unfiltered * | ||||
|                  waveform_scaler, c=ps.gblue2, lw=lw, label="search envelope") | ||||
|         ax2.plot(self.time, self.search * waveform_scaler, c=ps.gray, lw=lw, alpha=0.5) | ||||
|         ax2.plot( | ||||
|             self.time, | ||||
|             self.search_envelope_unfiltered * waveform_scaler, | ||||
|             c=ps.gblue2, | ||||
|             lw=lw, | ||||
|             label="search envelope", | ||||
|         ) | ||||
| 
 | ||||
|         # plot baseline instantaneous frequency | ||||
|         ax3.plot(self.frequency_time, self.frequency, | ||||
|                  c=ps.gblue3, lw=lw, label="baseline inst. freq.") | ||||
|         ax3.plot( | ||||
|             self.frequency_time, | ||||
|             self.frequency, | ||||
|             c=ps.gblue3, | ||||
|             lw=lw, | ||||
|             label="baseline inst. freq.", | ||||
|         ) | ||||
| 
 | ||||
|         # plot filtered and rectified envelope | ||||
|         ax4.plot(self.time, self.baseline_envelope * | ||||
|                  waveform_scaler, c=ps.gblue1, lw=lw) | ||||
|         ax4.plot( | ||||
|             self.time, self.baseline_envelope * waveform_scaler, c=ps.gblue1, lw=lw | ||||
|         ) | ||||
|         ax4.scatter( | ||||
|             (self.time)[self.baseline_peaks], | ||||
|             (self.baseline_envelope*waveform_scaler)[self.baseline_peaks], | ||||
|             (self.baseline_envelope * waveform_scaler)[self.baseline_peaks], | ||||
|             edgecolors=ps.black, | ||||
|             facecolors=ps.red, | ||||
|             zorder=10, | ||||
| @ -235,11 +249,10 @@ class ChirpPlotBuffer: | ||||
|         ) | ||||
| 
 | ||||
|         # plot envelope of search signal | ||||
|         ax5.plot(self.time, self.search_envelope * | ||||
|                  waveform_scaler, c=ps.gblue2, lw=lw) | ||||
|         ax5.plot(self.time, self.search_envelope * waveform_scaler, c=ps.gblue2, lw=lw) | ||||
|         ax5.scatter( | ||||
|             (self.time)[self.search_peaks], | ||||
|             (self.search_envelope*waveform_scaler)[self.search_peaks], | ||||
|             (self.search_envelope * waveform_scaler)[self.search_peaks], | ||||
|             edgecolors=ps.black, | ||||
|             facecolors=ps.red, | ||||
|             zorder=10, | ||||
| @ -249,8 +262,7 @@ class ChirpPlotBuffer: | ||||
|         ) | ||||
| 
 | ||||
|         # plot filtered instantaneous frequency | ||||
|         ax6.plot(self.frequency_time, | ||||
|                  self.frequency_filtered, c=ps.gblue3, lw=lw) | ||||
|         ax6.plot(self.frequency_time, self.frequency_filtered, c=ps.gblue3, lw=lw) | ||||
|         ax6.scatter( | ||||
|             self.frequency_time[self.frequency_peaks], | ||||
|             self.frequency_filtered[self.frequency_peaks], | ||||
| @ -284,8 +296,7 @@ class ChirpPlotBuffer: | ||||
|         # ax7.spines.bottom.set_bounds((0, 5)) | ||||
| 
 | ||||
|         ax0.set_xlim(0, self.config.window) | ||||
|         plt.subplots_adjust(left=0.165, right=0.975, | ||||
|                             top=0.98, bottom=0.074, hspace=0.2) | ||||
|         plt.subplots_adjust(left=0.165, right=0.975, top=0.98, bottom=0.074, hspace=0.2) | ||||
|         fig.align_labels() | ||||
| 
 | ||||
|         if plot == "show": | ||||
| @ -306,7 +317,7 @@ def plot_spectrogram( | ||||
|     signal: np.ndarray, | ||||
|     samplerate: float, | ||||
|     window_start_seconds: float, | ||||
|     ylims: list[float] | ||||
|     ylims: list[float], | ||||
| ) -> np.ndarray: | ||||
|     """ | ||||
|     Plot a spectrogram of a signal. | ||||
| @ -390,9 +401,7 @@ def extract_frequency_bands( | ||||
|         q25, q75 = q50 - minimal_bandwidth / 2, q50 + minimal_bandwidth / 2 | ||||
| 
 | ||||
|     # filter baseline | ||||
|     filtered_baseline = bandpass_filter( | ||||
|         raw_data, samplerate, lowf=q25, highf=q75 | ||||
|     ) | ||||
|     filtered_baseline = bandpass_filter(raw_data, samplerate, lowf=q25, highf=q75) | ||||
| 
 | ||||
|     # filter search area | ||||
|     filtered_search_freq = bandpass_filter( | ||||
| @ -442,15 +451,13 @@ def window_median_all_track_ids( | ||||
|         window_idx = np.arange(len(data.idx))[ | ||||
|             (data.ident == track_id) | ||||
|             & (data.time[data.idx] >= window_start_seconds) | ||||
|             & ( | ||||
|                 data.time[data.idx] | ||||
|                 <= (window_start_seconds + window_duration_seconds) | ||||
|             ) | ||||
|             & (data.time[data.idx] <= (window_start_seconds + window_duration_seconds)) | ||||
|         ] | ||||
| 
 | ||||
|         if len(data.freq[window_idx]) > 0: | ||||
|             frequency_percentiles.append( | ||||
|                 np.percentile(data.freq[window_idx], [25, 50, 75])) | ||||
|                 np.percentile(data.freq[window_idx], [25, 50, 75]) | ||||
|             ) | ||||
|             track_ids.append(track_id) | ||||
| 
 | ||||
|     # convert to numpy array | ||||
| @ -477,7 +484,7 @@ def array_center(array: np.ndarray) -> float: | ||||
| 
 | ||||
|     """ | ||||
|     if len(array) % 2 == 0: | ||||
|         return np.mean(array[int(len(array) / 2) - 1:int(len(array) / 2) + 1]) | ||||
|         return np.mean(array[int(len(array) / 2) - 1 : int(len(array) / 2) + 1]) | ||||
|     else: | ||||
|         return array[int(len(array) / 2)] | ||||
| 
 | ||||
| @ -533,8 +540,7 @@ def find_searchband( | ||||
| 
 | ||||
|     # get tracks that fall into search window | ||||
|     check_track_ids = percentiles_ids[ | ||||
|         (q25 > current_median) & ( | ||||
|             q75 < search_window[-1]) | ||||
|         (q25 > current_median) & (q75 < search_window[-1]) | ||||
|     ] | ||||
| 
 | ||||
|     # iterate through theses tracks | ||||
| @ -547,8 +553,7 @@ def find_searchband( | ||||
| 
 | ||||
|             bool_lower[search_window > q25_temp - config.search_res] = False | ||||
|             bool_upper[search_window < q75_temp + config.search_res] = False | ||||
|             search_window_bool[(bool_lower == False) & | ||||
|                                (bool_upper == False)] = False | ||||
|             search_window_bool[(bool_lower == False) & (bool_upper == False)] = False | ||||
| 
 | ||||
|         # find gaps in search window | ||||
|         search_window_indices = np.arange(len(search_window)) | ||||
| @ -567,9 +572,7 @@ def find_searchband( | ||||
|         # if the first value is -1, the array starst with true, so a gap | ||||
|         if nonzeros[0] == -1: | ||||
|             stops = search_window_indices[search_window_gaps == -1] | ||||
|             starts = np.append( | ||||
|                 0, search_window_indices[search_window_gaps == 1] | ||||
|             ) | ||||
|             starts = np.append(0, search_window_indices[search_window_gaps == 1]) | ||||
| 
 | ||||
|             # if the last value is -1, the array ends with true, so a gap | ||||
|             if nonzeros[-1] == 1: | ||||
| @ -605,7 +608,7 @@ def find_searchband( | ||||
|     return config.default_search_freq | ||||
| 
 | ||||
| 
 | ||||
| def chirpdetection(datapath: str, plot: str, debug: str = 'false') -> None: | ||||
| def chirpdetection(datapath: str, plot: str, debug: str = "false") -> None: | ||||
| 
 | ||||
|     assert plot in [ | ||||
|         "save", | ||||
| @ -623,7 +626,7 @@ def chirpdetection(datapath: str, plot: str, debug: str = 'false') -> None: | ||||
|         assert plot == "show", "debug mode only runs when plot is 'show'" | ||||
| 
 | ||||
|     # load raw file | ||||
|     print('datapath', datapath) | ||||
|     print("datapath", datapath) | ||||
|     data = LoadData(datapath) | ||||
| 
 | ||||
|     # load config file | ||||
| @ -691,9 +694,7 @@ def chirpdetection(datapath: str, plot: str, debug: str = 'false') -> None: | ||||
|         ) | ||||
| 
 | ||||
|         # iterate through all fish | ||||
|         for tr, track_id in enumerate( | ||||
|             np.unique(data.ident[~np.isnan(data.ident)]) | ||||
|         ): | ||||
|         for tr, track_id in enumerate(np.unique(data.ident[~np.isnan(data.ident)])): | ||||
| 
 | ||||
|             logger.debug(f"Processing track {tr} of {len(data.ids)}") | ||||
| 
 | ||||
| @ -714,11 +715,11 @@ def chirpdetection(datapath: str, plot: str, debug: str = 'false') -> None: | ||||
|             # approximate sampling rate to compute expected durations if there | ||||
|             # is data available for this time window for this fish id | ||||
| 
 | ||||
| #             track_samplerate = np.mean(1 / np.diff(data.time)) | ||||
| #             expected_duration = ( | ||||
| #                 (window_start_seconds + window_duration_seconds) | ||||
| #                 - window_start_seconds | ||||
| #             ) * track_samplerate | ||||
|             #             track_samplerate = np.mean(1 / np.diff(data.time)) | ||||
|             #             expected_duration = ( | ||||
|             #                 (window_start_seconds + window_duration_seconds) | ||||
|             #                 - window_start_seconds | ||||
|             #             ) * track_samplerate | ||||
| 
 | ||||
|             # check if tracked data available in this window | ||||
|             if len(current_frequencies) < 3: | ||||
| @ -731,17 +732,16 @@ def chirpdetection(datapath: str, plot: str, debug: str = 'false') -> None: | ||||
|             nanchecker = np.unique(np.isnan(current_powers)) | ||||
|             if (len(nanchecker) == 1) and nanchecker[0] is True: | ||||
|                 logger.warning( | ||||
|                     f"No powers available for track {track_id} window {st}," | ||||
|                     "skipping." | ||||
|                     f"No powers available for track {track_id} window {st}," "skipping." | ||||
|                 ) | ||||
|                 continue | ||||
| 
 | ||||
|             # find the strongest electrodes for the current fish in the current | ||||
|             # window | ||||
| 
 | ||||
|             best_electrode_index = np.argsort( | ||||
|                 np.nanmean(current_powers, axis=0) | ||||
|             )[-config.number_electrodes:] | ||||
|             best_electrode_index = np.argsort(np.nanmean(current_powers, axis=0))[ | ||||
|                 -config.number_electrodes : | ||||
|             ] | ||||
| 
 | ||||
|             # find a frequency above the baseline of the current fish in which | ||||
|             # no other fish is active to search for chirps there | ||||
| @ -763,8 +763,7 @@ def chirpdetection(datapath: str, plot: str, debug: str = 'false') -> None: | ||||
|             for el, electrode_index in enumerate(best_electrode_index): | ||||
| 
 | ||||
|                 logger.debug( | ||||
|                     f"Processing electrode {el+1} of " | ||||
|                     f"{len(best_electrode_index)}" | ||||
|                     f"Processing electrode {el+1} of " f"{len(best_electrode_index)}" | ||||
|                 ) | ||||
| 
 | ||||
|                 # LOAD DATA FOR CURRENT ELECTRODE AND CURRENT FISH ------------ | ||||
| @ -773,9 +772,7 @@ def chirpdetection(datapath: str, plot: str, debug: str = 'false') -> None: | ||||
|                 current_raw_data = data.raw[ | ||||
|                     window_start_index:window_stop_index, electrode_index | ||||
|                 ] | ||||
|                 current_raw_time = raw_time[ | ||||
|                     window_start_index:window_stop_index | ||||
|                 ] | ||||
|                 current_raw_time = raw_time[window_start_index:window_stop_index] | ||||
| 
 | ||||
|                 # EXTRACT FEATURES -------------------------------------------- | ||||
| 
 | ||||
| @ -897,9 +894,7 @@ def chirpdetection(datapath: str, plot: str, debug: str = 'false') -> None: | ||||
|                     baseline_frequency_time <= no_edges_t1 | ||||
|                 ) | ||||
| 
 | ||||
|                 baseline_frequency_filtered = baseline_frequency_filtered[ | ||||
|                     no_edges | ||||
|                 ] | ||||
|                 baseline_frequency_filtered = baseline_frequency_filtered[no_edges] | ||||
|                 baseline_frequency = baseline_frequency[no_edges] | ||||
|                 baseline_frequency_time = ( | ||||
|                     baseline_frequency_time[no_edges] + window_start_seconds | ||||
| @ -934,11 +929,8 @@ def chirpdetection(datapath: str, plot: str, debug: str = 'false') -> None: | ||||
|                 # DETECT CHIRPS IN SEARCH WINDOW ------------------------------ | ||||
| 
 | ||||
|                 # get the peak timestamps from the peak indices | ||||
|                 baseline_peak_timestamps = current_raw_time[ | ||||
|                     baseline_peak_indices | ||||
|                 ] | ||||
|                 search_peak_timestamps = current_raw_time[ | ||||
|                     search_peak_indices] | ||||
|                 baseline_peak_timestamps = current_raw_time[baseline_peak_indices] | ||||
|                 search_peak_timestamps = current_raw_time[search_peak_indices] | ||||
| 
 | ||||
|                 frequency_peak_timestamps = baseline_frequency_time[ | ||||
|                     frequency_peak_indices | ||||
| @ -953,7 +945,7 @@ def chirpdetection(datapath: str, plot: str, debug: str = 'false') -> None: | ||||
|                     or len(frequency_peak_timestamps) == 0 | ||||
|                 ) | ||||
| 
 | ||||
|                 if one_feature_empty and (debug == 'false'): | ||||
|                 if one_feature_empty and (debug == "false"): | ||||
|                     continue | ||||
| 
 | ||||
|                 # group peak across feature arrays but only if they | ||||
| @ -974,18 +966,18 @@ def chirpdetection(datapath: str, plot: str, debug: str = 'false') -> None: | ||||
|                 # check it there are chirps detected after grouping, continue | ||||
|                 # with the loop if not | ||||
| 
 | ||||
|                 if (len(singleelectrode_chirps) == 0) and (debug == 'false'): | ||||
|                 if (len(singleelectrode_chirps) == 0) and (debug == "false"): | ||||
|                     continue | ||||
| 
 | ||||
|                 # append chirps from this electrode to the multilectrode list | ||||
|                 multielectrode_chirps.append(singleelectrode_chirps) | ||||
| 
 | ||||
|                 # only initialize the plotting buffer if chirps are detected | ||||
|                 chirp_detected = (el == (config.number_electrodes - 1) | ||||
|                                   & (plot in ["show", "save"]) | ||||
|                                   ) | ||||
|                 chirp_detected = el == (config.number_electrodes - 1) & ( | ||||
|                     plot in ["show", "save"] | ||||
|                 ) | ||||
| 
 | ||||
|                 if chirp_detected or (debug != 'elecrode'): | ||||
|                 if chirp_detected or (debug != "elecrode"): | ||||
| 
 | ||||
|                     logger.debug("Detected chirp, ititialize buffer ...") | ||||
| 
 | ||||
| @ -1016,9 +1008,8 @@ def chirpdetection(datapath: str, plot: str, debug: str = 'false') -> None: | ||||
|                     logger.debug("Buffer initialized!") | ||||
| 
 | ||||
|                 if debug == "electrode": | ||||
|                     logger.info(f'Plotting electrode {el} ...') | ||||
|                     buffer.plot_buffer( | ||||
|                         chirps=singleelectrode_chirps, plot=plot) | ||||
|                     logger.info(f"Plotting electrode {el} ...") | ||||
|                     buffer.plot_buffer(chirps=singleelectrode_chirps, plot=plot) | ||||
| 
 | ||||
|             logger.debug( | ||||
|                 f"Processed all electrodes for fish {track_id} for this" | ||||
| @ -1028,7 +1019,7 @@ def chirpdetection(datapath: str, plot: str, debug: str = 'false') -> None: | ||||
|             # check if there are chirps detected in multiple electrodes and | ||||
|             # continue the loop if not | ||||
| 
 | ||||
|             if (len(multielectrode_chirps) == 0) and (debug == 'false'): | ||||
|             if (len(multielectrode_chirps) == 0) and (debug == "false"): | ||||
|                 continue | ||||
| 
 | ||||
|             # validate multielectrode chirps, i.e. check if they are | ||||
| @ -1054,11 +1045,14 @@ def chirpdetection(datapath: str, plot: str, debug: str = 'false') -> None: | ||||
|             # chirps, otheswise try to delete the buffer if it exists | ||||
| 
 | ||||
|             if debug == "fish": | ||||
|                 logger.info(f'Plotting fish {track_id} ...') | ||||
|                 logger.info(f"Plotting fish {track_id} ...") | ||||
|                 buffer.plot_buffer(multielectrode_chirps_validated, plot) | ||||
| 
 | ||||
|             if ((len(multielectrode_chirps_validated) > 0) & | ||||
|                     (plot in ["show", "save"]) & (debug == 'false')): | ||||
|             if ( | ||||
|                 (len(multielectrode_chirps_validated) > 0) | ||||
|                 & (plot in ["show", "save"]) | ||||
|                 & (debug == "false") | ||||
|             ): | ||||
|                 try: | ||||
|                     buffer.plot_buffer(multielectrode_chirps_validated, plot) | ||||
|                     del buffer | ||||
| @ -1085,9 +1079,7 @@ def chirpdetection(datapath: str, plot: str, debug: str = 'false') -> None: | ||||
| 
 | ||||
|         # add flattened chirps to the list | ||||
|         multiwindow_chirps_flat.extend(current_track_chirps) | ||||
|         multiwindow_ids_flat.extend( | ||||
|             list(np.ones_like(current_track_chirps) * track_id) | ||||
|         ) | ||||
|         multiwindow_ids_flat.extend(list(np.ones_like(current_track_chirps) * track_id)) | ||||
| 
 | ||||
|     # purge duplicates, i.e. chirps that are very close to each other | ||||
|     # duplites arise due to overlapping windows | ||||
|  | ||||
| @ -16,8 +16,8 @@ def PlotStyle() -> None: | ||||
| 
 | ||||
|         # colors | ||||
|         black = "#111116" | ||||
|         white = "#e0e4f7" | ||||
|         gray = "#6c6e7d" | ||||
|         white = "#111116" | ||||
|         gray = "#111116" | ||||
|         blue = "#89b4fa" | ||||
|         sapphire = "#74c7ec" | ||||
|         sky = "#89dceb" | ||||
| @ -216,10 +216,10 @@ def PlotStyle() -> None: | ||||
|     SMALL_SIZE = 12 | ||||
|     MEDIUM_SIZE = 14 | ||||
|     BIGGER_SIZE = 16 | ||||
|     black = "#111116" | ||||
|     white = "#e0e4f7" | ||||
|     gray = "#6c6e7d" | ||||
|     dark_gray = "#2a2a32" | ||||
|     black = "#e0e4f7" | ||||
|     white = "#111116" | ||||
|     # gray = "#6c6e7d" | ||||
|     # dark_gray = "#2a2a32" | ||||
| 
 | ||||
|     # rcparams | ||||
|     plt.rc("font", size=MEDIUM_SIZE)  # controls default text sizes | ||||
| @ -250,46 +250,46 @@ def PlotStyle() -> None: | ||||
|     # plt.rcParams["font.sans-serif"] = "Helvetica Now Text" | ||||
| 
 | ||||
|     # dark mode modifications | ||||
|     plt.rcParams["boxplot.flierprops.color"] = white | ||||
|     plt.rcParams["boxplot.flierprops.markeredgecolor"] = gray | ||||
|     plt.rcParams["boxplot.boxprops.color"] = gray | ||||
|     plt.rcParams["boxplot.whiskerprops.color"] = gray | ||||
|     plt.rcParams["boxplot.capprops.color"] = gray | ||||
|     plt.rcParams["boxplot.medianprops.color"] = black | ||||
|     plt.rcParams["text.color"] = white | ||||
|     plt.rcParams["axes.facecolor"] = black  # axes background color | ||||
|     plt.rcParams["axes.edgecolor"] = white  # axes edge color | ||||
|     # plt.rcParams["axes.grid"] = True    # display grid or not | ||||
|     # plt.rcParams["axes.grid.axis"] = "y"  # which axis the grid is applied to | ||||
|     plt.rcParams["axes.labelcolor"] = white | ||||
|     plt.rcParams["axes.axisbelow"] = True  # draw axis gridlines and ticks: | ||||
|     plt.rcParams["axes.spines.left"] = True  # display axis spines | ||||
|     plt.rcParams["axes.spines.bottom"] = True | ||||
|     plt.rcParams["axes.spines.top"] = False | ||||
|     plt.rcParams["axes.spines.right"] = False | ||||
|     plt.rcParams["axes.prop_cycle"] = cycler( | ||||
|         "color", | ||||
|         [ | ||||
|             "#b4befe", | ||||
|             "#89b4fa", | ||||
|             "#74c7ec", | ||||
|             "#89dceb", | ||||
|             "#94e2d5", | ||||
|             "#a6e3a1", | ||||
|             "#f9e2af", | ||||
|             "#fab387", | ||||
|             "#eba0ac", | ||||
|             "#f38ba8", | ||||
|             "#cba6f7", | ||||
|             "#f5c2e7", | ||||
|         ], | ||||
|     ) | ||||
|     plt.rcParams["xtick.color"] = white  # color of the ticks | ||||
|     plt.rcParams["ytick.color"] = white  # color of the ticks | ||||
|     plt.rcParams["grid.color"] = white  # grid color | ||||
|     plt.rcParams["figure.facecolor"] = black  # figure face color | ||||
|     plt.rcParams["figure.edgecolor"] = black  # figure edge color | ||||
|     plt.rcParams["savefig.facecolor"] = black  # figure face color when saving | ||||
|     # plt.rcParams["boxplot.flierprops.color"] = white | ||||
|     # plt.rcParams["boxplot.flierprops.markeredgecolor"] = gray | ||||
|     # plt.rcParams["boxplot.boxprops.color"] = gray | ||||
|     # plt.rcParams["boxplot.whiskerprops.color"] = gray | ||||
|     # plt.rcParams["boxplot.capprops.color"] = gray | ||||
|     # plt.rcParams["boxplot.medianprops.color"] = black | ||||
|     # plt.rcParams["text.color"] = white | ||||
|     # plt.rcParams["axes.facecolor"] = black  # axes background color | ||||
|     # plt.rcParams["axes.edgecolor"] = white  # axes edge color | ||||
|     # # plt.rcParams["axes.grid"] = True    # display grid or not | ||||
|     # # plt.rcParams["axes.grid.axis"] = "y"  # which axis the grid is applied to | ||||
|     # plt.rcParams["axes.labelcolor"] = white | ||||
|     # plt.rcParams["axes.axisbelow"] = True  # draw axis gridlines and ticks: | ||||
|     # plt.rcParams["axes.spines.left"] = True  # display axis spines | ||||
|     # plt.rcParams["axes.spines.bottom"] = True | ||||
|     # plt.rcParams["axes.spines.top"] = False | ||||
|     # plt.rcParams["axes.spines.right"] = False | ||||
|     # plt.rcParams["axes.prop_cycle"] = cycler( | ||||
|     #     "color", | ||||
|     #     [ | ||||
|     #         "#b4befe", | ||||
|     #         "#89b4fa", | ||||
|     #         "#74c7ec", | ||||
|     #         "#89dceb", | ||||
|     #         "#94e2d5", | ||||
|     #         "#a6e3a1", | ||||
|     #         "#f9e2af", | ||||
|     #         "#fab387", | ||||
|     #         "#eba0ac", | ||||
|     #         "#f38ba8", | ||||
|     #         "#cba6f7", | ||||
|     #         "#f5c2e7", | ||||
|     #     ], | ||||
|     # ) | ||||
|     # plt.rcParams["xtick.color"] = white  # color of the ticks | ||||
|     # plt.rcParams["ytick.color"] = white  # color of the ticks | ||||
|     # plt.rcParams["grid.color"] = white  # grid color | ||||
|     # plt.rcParams["figure.facecolor"] = black  # figure face color | ||||
|     # plt.rcParams["figure.edgecolor"] = black  # figure edge color | ||||
|     # plt.rcParams["savefig.facecolor"] = black  # figure face color when saving | ||||
| 
 | ||||
|     return style | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										407
									
								
								code/modules/plotstyle_dark.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										407
									
								
								code/modules/plotstyle_dark.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,407 @@ | ||||
| import cmocean as cmo | ||||
| import matplotlib.pyplot as plt | ||||
| import numpy as np | ||||
| from cycler import cycler | ||||
| from matplotlib.colors import ListedColormap | ||||
| 
 | ||||
| 
 | ||||
| def PlotStyle() -> None: | ||||
|     class style: | ||||
| 
 | ||||
|         # lightcmap = cmocean.tools.lighten(cmocean.cm.haline, 0.8) | ||||
| 
 | ||||
|         # units | ||||
|         cm = 1 / 2.54 | ||||
|         mm = 1 / 25.4 | ||||
| 
 | ||||
|         # colors | ||||
|         black = "#111116" | ||||
|         white = "#e0e4f7" | ||||
|         gray = "#6c6e7d" | ||||
|         blue = "#89b4fa" | ||||
|         sapphire = "#74c7ec" | ||||
|         sky = "#89dceb" | ||||
|         teal = "#94e2d5" | ||||
|         green = "#a6e3a1" | ||||
|         yellow = "#f9d67f" | ||||
|         orange = "#faa472" | ||||
|         maroon = "#eb8486" | ||||
|         red = "#e0e4f7" | ||||
|         purple = "#d89bf7" | ||||
|         pink = "#f59edb" | ||||
|         lavender = "#b4befe" | ||||
|         gblue1 = "#f37588" | ||||
|         gblue2 = "#faa472" | ||||
|         gblue3 = "#f9d67f" | ||||
|         g = "#f3626c" | ||||
| 
 | ||||
|         @classmethod | ||||
|         def lims(cls, track1, track2): | ||||
|             """Helper function to get frequency y axis limits from two | ||||
|             fundamental frequency tracks. | ||||
| 
 | ||||
|             Args: | ||||
|                 track1 (array): First track | ||||
|                 track2 (array): Second track | ||||
|                 start (int): Index for first value to be plotted | ||||
|                 stop (int): Index for second value to be plotted | ||||
|                 padding (int): Padding for the upper and lower limit | ||||
| 
 | ||||
|             Returns: | ||||
|                 lower (float): lower limit | ||||
|                 upper (float): upper limit | ||||
| 
 | ||||
|             """ | ||||
|             allfunds_tmp = ( | ||||
|                 np.concatenate( | ||||
|                     [ | ||||
|                         track1, | ||||
|                         track2, | ||||
|                     ] | ||||
|                 ) | ||||
|                 .ravel() | ||||
|                 .tolist() | ||||
|             ) | ||||
|             lower = np.min(allfunds_tmp) | ||||
|             upper = np.max(allfunds_tmp) | ||||
|             return lower, upper | ||||
| 
 | ||||
|         @classmethod | ||||
|         def circled_annotation(cls, text, axis, xpos, ypos, padding=0.25): | ||||
|             axis.text( | ||||
|                 xpos, | ||||
|                 ypos, | ||||
|                 text, | ||||
|                 ha="center", | ||||
|                 va="center", | ||||
|                 zorder=1000, | ||||
|                 bbox=dict( | ||||
|                     boxstyle=f"circle, pad={padding}", fc="white", ec="black", lw=1 | ||||
|                 ), | ||||
|             ) | ||||
| 
 | ||||
|         @classmethod | ||||
|         def fade_cmap(cls, cmap): | ||||
| 
 | ||||
|             my_cmap = cmap(np.arange(cmap.N)) | ||||
|             my_cmap[:, -1] = np.linspace(0, 1, cmap.N) | ||||
|             my_cmap = ListedColormap(my_cmap) | ||||
| 
 | ||||
|             return my_cmap | ||||
| 
 | ||||
|         @classmethod | ||||
|         def hide_ax(cls, ax): | ||||
|             ax.xaxis.set_visible(False) | ||||
|             plt.setp(ax.spines.values(), visible=False) | ||||
|             ax.tick_params(left=False, labelleft=False) | ||||
|             ax.patch.set_visible(False) | ||||
| 
 | ||||
|         @classmethod | ||||
|         def hide_xax(cls, ax): | ||||
|             ax.xaxis.set_visible(False) | ||||
|             ax.spines["bottom"].set_visible(False) | ||||
| 
 | ||||
|         @classmethod | ||||
|         def hide_yax(cls, ax): | ||||
|             ax.yaxis.set_visible(False) | ||||
|             ax.spines["left"].set_visible(False) | ||||
| 
 | ||||
|         @classmethod | ||||
|         def set_boxplot_color(cls, bp, color): | ||||
|             plt.setp(bp["boxes"], color=color) | ||||
|             plt.setp(bp["whiskers"], color=white) | ||||
|             plt.setp(bp["caps"], color=white) | ||||
|             plt.setp(bp["medians"], color=black) | ||||
| 
 | ||||
|         @classmethod | ||||
|         def label_subplots(cls, labels, axes, fig): | ||||
|             for axis, label in zip(axes, labels): | ||||
|                 X = axis.get_position().x0 | ||||
|                 Y = axis.get_position().y1 | ||||
|                 fig.text(X, Y, label, weight="bold") | ||||
| 
 | ||||
|         @classmethod | ||||
|         def letter_subplots( | ||||
|             cls, axes=None, letters=None, xoffset=-0.1, yoffset=1.0, **kwargs | ||||
|         ): | ||||
|             """Add letters to the corners of subplots (panels). By default each axis is | ||||
|             given an uppercase bold letter label placed in the upper-left corner. | ||||
|             Args | ||||
|                 axes : list of pyplot ax objects. default plt.gcf().axes. | ||||
|                 letters : list of strings to use as labels, default ["A", "B", "C", ...] | ||||
|                 xoffset, yoffset : positions of each label relative to plot frame | ||||
|                 (default -0.1,1.0 = upper left margin). Can also be a list of | ||||
|                 offsets, in which case it should be the same length as the number of | ||||
|                 axes. | ||||
|                 Other keyword arguments will be passed to annotate() when panel letters | ||||
|                 are added. | ||||
|             Returns: | ||||
|                 list of strings for each label added to the axes | ||||
|             Examples: | ||||
|                 Defaults: | ||||
|                     >>> fig, axes = plt.subplots(1,3) | ||||
|                     >>> letter_subplots() # boldfaced A, B, C | ||||
| 
 | ||||
|                 Common labeling schemes inferred from the first letter: | ||||
|                     >>> fig, axes = plt.subplots(1,4) | ||||
|                     # panels labeled (a), (b), (c), (d) | ||||
|                     >>> letter_subplots(letters='(a)') | ||||
|                 Fully custom lettering: | ||||
|                     >>> fig, axes = plt.subplots(2,1) | ||||
|                     >>> letter_subplots(axes, letters=['(a.1)', '(b.2)'], fontweight='normal') | ||||
|                 Per-axis offsets: | ||||
|                     >>> fig, axes = plt.subplots(1,2) | ||||
|                     >>> letter_subplots(axes, xoffset=[-0.1, -0.15]) | ||||
| 
 | ||||
|                 Matrix of axes: | ||||
|                     >>> fig, axes = plt.subplots(2,2, sharex=True, sharey=True) | ||||
|                     # fig.axes is a list when axes is a 2x2 matrix | ||||
|                     >>> letter_subplots(fig.axes) | ||||
|             """ | ||||
| 
 | ||||
|             # get axes: | ||||
|             if axes is None: | ||||
|                 axes = plt.gcf().axes | ||||
|             # handle single axes: | ||||
|             try: | ||||
|                 iter(axes) | ||||
|             except TypeError: | ||||
|                 axes = [axes] | ||||
| 
 | ||||
|             # set up letter defaults (and corresponding fontweight): | ||||
|             fontweight = "bold" | ||||
|             ulets = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ"[: len(axes)]) | ||||
|             llets = list("abcdefghijklmnopqrstuvwxyz"[: len(axes)]) | ||||
|             if letters is None or letters == "A": | ||||
|                 letters = ulets | ||||
|             elif letters == "(a)": | ||||
|                 letters = ["({})".format(lett) for lett in llets] | ||||
|                 fontweight = "normal" | ||||
|             elif letters == "(A)": | ||||
|                 letters = ["({})".format(lett) for lett in ulets] | ||||
|                 fontweight = "normal" | ||||
|             elif letters in ("lower", "lowercase", "a"): | ||||
|                 letters = llets | ||||
| 
 | ||||
|             # make sure there are x and y offsets for each ax in axes: | ||||
|             if isinstance(xoffset, (int, float)): | ||||
|                 xoffset = [xoffset] * len(axes) | ||||
|             else: | ||||
|                 assert len(xoffset) == len(axes) | ||||
|             if isinstance(yoffset, (int, float)): | ||||
|                 yoffset = [yoffset] * len(axes) | ||||
|             else: | ||||
|                 assert len(yoffset) == len(axes) | ||||
| 
 | ||||
|             # defaults for annotate (kwargs is second so it can overwrite these defaults): | ||||
|             my_defaults = dict( | ||||
|                 fontweight=fontweight, | ||||
|                 fontsize="large", | ||||
|                 ha="center", | ||||
|                 va="center", | ||||
|                 xycoords="axes fraction", | ||||
|                 annotation_clip=False, | ||||
|             ) | ||||
|             kwargs = dict(list(my_defaults.items()) + list(kwargs.items())) | ||||
| 
 | ||||
|             list_txts = [] | ||||
|             for ax, lbl, xoff, yoff in zip(axes, letters, xoffset, yoffset): | ||||
|                 t = ax.annotate(lbl, xy=(xoff, yoff), **kwargs) | ||||
|                 list_txts.append(t) | ||||
|             return list_txts | ||||
| 
 | ||||
|         pass | ||||
| 
 | ||||
|     # rcparams text setup | ||||
|     SMALL_SIZE = 12 | ||||
|     MEDIUM_SIZE = 14 | ||||
|     BIGGER_SIZE = 16 | ||||
|     black = "#111116" | ||||
|     white = "#e0e4f7" | ||||
|     gray = "#6c6e7d" | ||||
|     dark_gray = "#2a2a32" | ||||
| 
 | ||||
|     # rcparams | ||||
|     plt.rc("font", size=MEDIUM_SIZE)  # controls default text sizes | ||||
|     plt.rc("axes", titlesize=MEDIUM_SIZE)  # fontsize of the axes title | ||||
|     plt.rc("axes", labelsize=MEDIUM_SIZE)  # fontsize of the x and y labels | ||||
|     plt.rc("xtick", labelsize=SMALL_SIZE)  # fontsize of the tick labels | ||||
|     plt.rc("ytick", labelsize=SMALL_SIZE)  # fontsize of the tick labels | ||||
|     plt.rc("legend", fontsize=SMALL_SIZE)  # legend fontsize | ||||
|     plt.rc("figure", titlesize=BIGGER_SIZE)  # fontsize of the figure title | ||||
| 
 | ||||
|     plt.rcParams["image.cmap"] = "cmo.thermal" | ||||
|     plt.rcParams["axes.xmargin"] = 0.05 | ||||
|     plt.rcParams["axes.ymargin"] = 0.1 | ||||
|     plt.rcParams["axes.titlelocation"] = "left" | ||||
|     plt.rcParams["axes.titlesize"] = BIGGER_SIZE | ||||
|     # plt.rcParams["axes.titlepad"] = -10 | ||||
|     plt.rcParams["legend.frameon"] = False | ||||
|     plt.rcParams["legend.loc"] = "best" | ||||
|     plt.rcParams["legend.borderpad"] = 0.4 | ||||
|     plt.rcParams["legend.facecolor"] = black | ||||
|     plt.rcParams["legend.edgecolor"] = black | ||||
|     plt.rcParams["legend.framealpha"] = 0.7 | ||||
|     plt.rcParams["legend.borderaxespad"] = 0.5 | ||||
|     plt.rcParams["legend.fancybox"] = False | ||||
| 
 | ||||
|     # # specify the custom font to use | ||||
|     # plt.rcParams["font.family"] = "sans-serif" | ||||
|     # plt.rcParams["font.sans-serif"] = "Helvetica Now Text" | ||||
| 
 | ||||
|     # dark mode modifications | ||||
|     plt.rcParams["boxplot.flierprops.color"] = white | ||||
|     plt.rcParams["boxplot.flierprops.markeredgecolor"] = gray | ||||
|     plt.rcParams["boxplot.boxprops.color"] = gray | ||||
|     plt.rcParams["boxplot.whiskerprops.color"] = gray | ||||
|     plt.rcParams["boxplot.capprops.color"] = gray | ||||
|     plt.rcParams["boxplot.medianprops.color"] = black | ||||
|     plt.rcParams["text.color"] = white | ||||
|     plt.rcParams["axes.facecolor"] = black  # axes background color | ||||
|     plt.rcParams["axes.edgecolor"] = white  # axes edge color | ||||
|     # plt.rcParams["axes.grid"] = True    # display grid or not | ||||
|     # plt.rcParams["axes.grid.axis"] = "y"  # which axis the grid is applied to | ||||
|     plt.rcParams["axes.labelcolor"] = white | ||||
|     plt.rcParams["axes.axisbelow"] = True  # draw axis gridlines and ticks: | ||||
|     plt.rcParams["axes.spines.left"] = True  # display axis spines | ||||
|     plt.rcParams["axes.spines.bottom"] = True | ||||
|     plt.rcParams["axes.spines.top"] = False | ||||
|     plt.rcParams["axes.spines.right"] = False | ||||
|     plt.rcParams["axes.prop_cycle"] = cycler( | ||||
|         "color", | ||||
|         [ | ||||
|             "#b4befe", | ||||
|             "#89b4fa", | ||||
|             "#74c7ec", | ||||
|             "#89dceb", | ||||
|             "#94e2d5", | ||||
|             "#a6e3a1", | ||||
|             "#f9e2af", | ||||
|             "#fab387", | ||||
|             "#eba0ac", | ||||
|             "#f38ba8", | ||||
|             "#cba6f7", | ||||
|             "#f5c2e7", | ||||
|         ], | ||||
|     ) | ||||
|     plt.rcParams["xtick.color"] = white  # color of the ticks | ||||
|     plt.rcParams["ytick.color"] = white  # color of the ticks | ||||
|     plt.rcParams["grid.color"] = white  # grid color | ||||
|     plt.rcParams["figure.facecolor"] = black  # figure face color | ||||
|     plt.rcParams["figure.edgecolor"] = black  # figure edge color | ||||
|     plt.rcParams["savefig.facecolor"] = black  # figure face color when saving | ||||
| 
 | ||||
|     return style | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
| 
 | ||||
|     s = PlotStyle() | ||||
| 
 | ||||
|     import matplotlib.cbook as cbook | ||||
|     import matplotlib.cm as cm | ||||
|     import matplotlib.pyplot as plt | ||||
|     from matplotlib.patches import PathPatch | ||||
|     from matplotlib.path import Path | ||||
| 
 | ||||
|     # Fixing random state for reproducibility | ||||
|     np.random.seed(19680801) | ||||
| 
 | ||||
|     delta = 0.025 | ||||
|     x = y = np.arange(-3.0, 3.0, delta) | ||||
|     X, Y = np.meshgrid(x, y) | ||||
|     Z1 = np.exp(-(X**2) - Y**2) | ||||
|     Z2 = np.exp(-((X - 1) ** 2) - (Y - 1) ** 2) | ||||
|     Z = (Z1 - Z2) * 2 | ||||
| 
 | ||||
|     fig1, ax = plt.subplots() | ||||
|     im = ax.imshow( | ||||
|         Z, | ||||
|         interpolation="bilinear", | ||||
|         cmap=cm.RdYlGn, | ||||
|         origin="lower", | ||||
|         extent=[-3, 3, -3, 3], | ||||
|         vmax=abs(Z).max(), | ||||
|         vmin=-abs(Z).max(), | ||||
|     ) | ||||
| 
 | ||||
|     plt.show() | ||||
| 
 | ||||
|     fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(9, 4)) | ||||
| 
 | ||||
|     # Fixing random state for reproducibility | ||||
|     np.random.seed(19680801) | ||||
| 
 | ||||
|     # generate some random test data | ||||
|     all_data = [np.random.normal(0, std, 100) for std in range(6, 10)] | ||||
| 
 | ||||
|     # plot violin plot | ||||
|     axs[0].violinplot(all_data, showmeans=False, showmedians=True) | ||||
|     axs[0].set_title("Violin plot") | ||||
| 
 | ||||
|     # plot box plot | ||||
|     axs[1].boxplot(all_data) | ||||
|     axs[1].set_title("Box plot") | ||||
| 
 | ||||
|     # adding horizontal grid lines | ||||
|     for ax in axs: | ||||
|         ax.yaxis.grid(True) | ||||
|         ax.set_xticks( | ||||
|             [y + 1 for y in range(len(all_data))], labels=["x1", "x2", "x3", "x4"] | ||||
|         ) | ||||
|         ax.set_xlabel("Four separate samples") | ||||
|         ax.set_ylabel("Observed values") | ||||
| 
 | ||||
|     plt.show() | ||||
| 
 | ||||
|     # Fixing random state for reproducibility | ||||
|     np.random.seed(19680801) | ||||
| 
 | ||||
|     # Compute pie slices | ||||
|     N = 20 | ||||
|     theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False) | ||||
|     radii = 10 * np.random.rand(N) | ||||
|     width = np.pi / 4 * np.random.rand(N) | ||||
|     colors = cmo.cm.haline(radii / 10.0) | ||||
| 
 | ||||
|     ax = plt.subplot(projection="polar") | ||||
|     ax.bar(theta, radii, width=width, bottom=0.0, color=colors, alpha=0.5) | ||||
| 
 | ||||
|     plt.show() | ||||
| 
 | ||||
|     methods = [ | ||||
|         None, | ||||
|         "none", | ||||
|         "nearest", | ||||
|         "bilinear", | ||||
|         "bicubic", | ||||
|         "spline16", | ||||
|         "spline36", | ||||
|         "hanning", | ||||
|         "hamming", | ||||
|         "hermite", | ||||
|         "kaiser", | ||||
|         "quadric", | ||||
|         "catrom", | ||||
|         "gaussian", | ||||
|         "bessel", | ||||
|         "mitchell", | ||||
|         "sinc", | ||||
|         "lanczos", | ||||
|     ] | ||||
| 
 | ||||
|     # Fixing random state for reproducibility | ||||
|     np.random.seed(19680801) | ||||
| 
 | ||||
|     grid = np.random.rand(4, 4) | ||||
| 
 | ||||
|     fig, axs = plt.subplots( | ||||
|         nrows=3, ncols=6, figsize=(9, 6), subplot_kw={"xticks": [], "yticks": []} | ||||
|     ) | ||||
| 
 | ||||
|     for ax, interp_method in zip(axs.flat, methods): | ||||
|         ax.imshow(grid, interpolation=interp_method) | ||||
|         ax.set_title(str(interp_method)) | ||||
| 
 | ||||
|     plt.tight_layout() | ||||
|     plt.show() | ||||
| @ -277,7 +277,7 @@ def main(datapath: str): | ||||
|                 scatterloser, chirps_loser, color=loser_color) | ||||
|     ax1.set_xticklabels(['Winner', 'Loser']) | ||||
| 
 | ||||
|     ax1.text(0.1, 0.95, f'n={len(chirps_winner)}', | ||||
|     ax1.text(0.1, 0.85, f'n={len(chirps_loser)}', | ||||
|              transform=ax1.transAxes, color=ps.white) | ||||
| 
 | ||||
|     for w, l in zip(chirps_winner, chirps_loser): | ||||
| @ -294,7 +294,7 @@ def main(datapath: str): | ||||
|     ax2.scatter(size_diffs_loser, size_chirps_loser, | ||||
|                 color=loser_color, label='Loser') | ||||
| 
 | ||||
|     ax2.text(0.05, 0.95, f'n={len(size_chirps_winner)}', | ||||
|     ax2.text(0.05, 0.85, f'n={len(size_chirps_loser)}', | ||||
|              transform=ax2.transAxes, color=ps.white) | ||||
| 
 | ||||
|     ax2.set_xlabel('Size difference [cm]') | ||||
| @ -303,7 +303,7 @@ def main(datapath: str): | ||||
|     ax3.scatter(freq_diffs_higher, freq_chirps_winner, color=winner_color) | ||||
|     ax3.scatter(freq_diffs_lower, freq_chirps_loser, color=loser_color) | ||||
| 
 | ||||
|     ax3.text(0.1, 0.95, f'n={len(freq_chirps_loser)}', | ||||
|     ax3.text(0.1, 0.85, f'n={len(np.asarray(freq_chirps_winner)[~np.isnan(freq_chirps_loser)])}', | ||||
|              transform=ax3.transAxes, color=ps.white) | ||||
| 
 | ||||
|     ax3.set_xlabel('EODf [Hz]') | ||||
|  | ||||
| @ -282,8 +282,8 @@ def main(dataroot): | ||||
|                 kde_time, | ||||
|                 np.percentile(loser_offsets_boot[-1], 1, axis=0), | ||||
|                 np.percentile(loser_offsets_boot[-1], 99, axis=0), | ||||
|                 color=ps.white, | ||||
|                 alpha=0.4) | ||||
|                 color='gray', | ||||
|                 alpha=0.8) | ||||
| 
 | ||||
|             ax[i].plot(kde_time, np.median(loser_offsets_boot[-1], axis=0), | ||||
|                        color=ps.black, linewidth=2) | ||||
|  | ||||
							
								
								
									
										14
									
								
								code/requirements.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								code/requirements.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| audioio==0.9.5 | ||||
| cmocean==2.0 | ||||
| cycler==0.11.0 | ||||
| ipython==8.10.0 | ||||
| matplotlib==3.7.0 | ||||
| numpy==1.23.5 | ||||
| pandas==1.5.3 | ||||
| paramiko==2.11.1 | ||||
| PyYAML==6.0 | ||||
| scikit_learn==1.2.1 | ||||
| scipy==1.10.1 | ||||
| scp==0.14.5 | ||||
| thunderfish==1.9.9 | ||||
| tqdm==4.64.1 | ||||
							
								
								
									
										10
									
								
								code/run_plots.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										10
									
								
								code/run_plots.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,10 @@ | ||||
| #!/usr/bin/env bash | ||||
| 
 | ||||
| color='\033[1;91m' | ||||
| nocolor='\033[0m' | ||||
| message='Running scripts in directory: ' | ||||
| 
 | ||||
| for py_file in $(ls plot_*); do | ||||
|     echo -e $message$color$py_file$nocolor | ||||
|     python $py_file | ||||
| done | ||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								poster_frozen/figs/algorithm.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								poster_frozen/figs/algorithm.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								poster_frozen/figs/algorithm1.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								poster_frozen/figs/algorithm1.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								poster_frozen/figs/chirps_in_chasing.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								poster_frozen/figs/chirps_in_chasing.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								poster_frozen/figs/chirps_winner_loser.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								poster_frozen/figs/chirps_winner_loser.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								poster_frozen/figs/efishlogo.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								poster_frozen/figs/efishlogo.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								poster_frozen/figs/introplot.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								poster_frozen/figs/introplot.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								poster_frozen/figs/kde.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								poster_frozen/figs/kde.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										529
									
								
								poster_frozen/figs/logo_all.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										529
									
								
								poster_frozen/figs/logo_all.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								poster_frozen/figs/timeline.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								poster_frozen/figs/timeline.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								poster_frozen/main.pdf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								poster_frozen/main.pdf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 116 KiB | 
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 40 KiB | 
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| Before Width: | Height: | Size: 84 KiB | 
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 157 KiB | 
										
											Binary file not shown.
										
									
								
							| @ -1,119 +0,0 @@ | ||||
| \documentclass[25pt, a0paper, landscape, margin=0mm, innermargin=20mm, | ||||
| blockverticalspace=2mm, colspace=20mm, subcolspace=0mm]{tikzposter} %Default values for poster format options. | ||||
| 
 | ||||
| \input{packages} | ||||
| \input{style} | ||||
| 
 | ||||
| \begin{document} | ||||
| 
 | ||||
| \renewcommand{\baselinestretch}{1} | ||||
| \title{\parbox{1900pt}{Pushing the limits of time-frequency uncertainty in the | ||||
| detection of transient communication signals in weakly electric fish}} | ||||
| \author{Sina Prause, Alexander Wendt, Patrick Weygoldt} | ||||
| \institute{Supervised by Till Raab \& Jan Benda, Neurothology Group, | ||||
| University of Tübingen} | ||||
| \usetitlestyle[]{sampletitle} | ||||
| \maketitle | ||||
| \renewcommand{\baselinestretch}{1.4} | ||||
| 
 | ||||
| \begin{columns} | ||||
| \column{0.5} | ||||
| \myblock[TranspBlock]{Introduction}{ | ||||
|     \begin{minipage}[t]{0.55\linewidth} | ||||
|         The time-frequency tradeoff makes reliable signal detecion and simultaneous | ||||
|         sender identification of freely interacting individuals impossible. | ||||
|         This profoundly limits our current understanding of chirps to experiments | ||||
|         with single - or physically separated - individuals. | ||||
|     \end{minipage} \hfill | ||||
|     \begin{minipage}[t]{0.40\linewidth} | ||||
|     \vspace{-1.5cm} | ||||
|     \begin{tikzfigure}[] | ||||
|         \label{tradeoff} | ||||
|         \includegraphics[width=\linewidth]{figs/introplot} | ||||
|     \end{tikzfigure} | ||||
|     \end{minipage} | ||||
| } | ||||
| 
 | ||||
| \myblock[TranspBlock]{A chirp detection algorithm}{ | ||||
|         \begin{tikzfigure}[] | ||||
|             \label{modulations} | ||||
|             \includegraphics[width=\linewidth]{figs/algorithm} | ||||
|         \end{tikzfigure} | ||||
| } | ||||
| 
 | ||||
| \column{0.5} | ||||
| \myblock[TranspBlock]{Chirps and diadic competitions}{ | ||||
|     \begin{minipage}[t]{0.7\linewidth} | ||||
|     \begin{tikzfigure}[] | ||||
|         \label{modulations} | ||||
|         \includegraphics[width=\linewidth]{figs/placeholder1} | ||||
|     \end{tikzfigure} | ||||
|     \end{minipage} \hfill | ||||
|     \begin{minipage}[t]{0.25\linewidth} | ||||
|         \lipsum[3][1-3] | ||||
|     \end{minipage} | ||||
| 
 | ||||
|     \begin{minipage}[t]{0.7\linewidth} | ||||
|     \begin{tikzfigure}[] | ||||
|         \label{modulations} | ||||
|         \includegraphics[width=\linewidth]{figs/placeholder1} | ||||
|     \end{tikzfigure} | ||||
|     \end{minipage} \hfill | ||||
|     \begin{minipage}[t]{0.25\linewidth} | ||||
|         \lipsum[3][1-3] | ||||
|     \end{minipage} | ||||
| 
 | ||||
|     \begin{minipage}[t]{0.7\linewidth} | ||||
|     \begin{tikzfigure}[] | ||||
|         \label{modulations} | ||||
|         \includegraphics[width=\linewidth]{figs/placeholder1} | ||||
|     \end{tikzfigure} | ||||
|     \end{minipage} \hfill | ||||
|     \begin{minipage}[t]{0.25\linewidth} | ||||
|         \lipsum[3][1-3] | ||||
|     \end{minipage} | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| \myblock[TranspBlock]{Conclusion}{ | ||||
|     \lipsum[3][1-9] | ||||
| } | ||||
| 
 | ||||
| % \column{0.3} | ||||
| % \myblock[TranspBlock]{More Results}{ | ||||
| %     \begin{tikzfigure}[] | ||||
| %         \label{results} | ||||
| %         \includegraphics[width=\linewidth]{example-image-a} | ||||
| %     \end{tikzfigure} | ||||
| 
 | ||||
| %     \begin{multicols}{2} | ||||
| %     \lipsum[5][1-8] | ||||
| %     \end{multicols} | ||||
| %     \vspace{-1cm} | ||||
| % } | ||||
| 
 | ||||
| % \myblock[TranspBlock]{Conclusion}{ | ||||
| %     \begin{itemize} | ||||
| %         \setlength\itemsep{0.5em} | ||||
| %         \item \lipsum[1][1] | ||||
| %         \item \lipsum[1][1] | ||||
| %         \item \lipsum[1][1] | ||||
| %     \end{itemize} | ||||
| %     \vspace{0.2cm} | ||||
| %     } | ||||
| \end{columns} | ||||
| 
 | ||||
| \node[ | ||||
|     above right, | ||||
|     text=white, | ||||
|     outer sep=45pt, | ||||
|     minimum width=\paperwidth, | ||||
|     align=center, | ||||
|     draw, | ||||
|     fill=boxes, | ||||
|     color=boxes, | ||||
| ] at (-0.51\paperwidth,-43.5) { | ||||
| \textcolor{text}{\normalsize Contact: \{name\}.\{surname\}@student.uni-tuebingen.de}}; | ||||
| 
 | ||||
| \end{document} | ||||
| @ -1,11 +0,0 @@ | ||||
| \usepackage[utf8]{inputenc} | ||||
| \usepackage[scaled]{helvet} | ||||
| \renewcommand\familydefault{\sfdefault} | ||||
| \usepackage[T1]{fontenc} | ||||
| \usepackage{wrapfig} | ||||
| \usepackage{setspace} | ||||
| \usepackage{multicol} | ||||
| \setlength{\columnsep}{1.5cm} | ||||
| \usepackage{xspace} | ||||
| \usepackage{tikz} | ||||
| \usepackage{lipsum} | ||||
| @ -1,119 +0,0 @@ | ||||
| \tikzposterlatexaffectionproofoff | ||||
| \usetheme{Default} | ||||
| 
 | ||||
| \definecolor{text}{HTML}{e0e4f7} | ||||
| \definecolor{background}{HTML}{111116} | ||||
| \definecolor{boxes}{HTML}{2a2a32} | ||||
| \definecolor{unired}{HTML}{a51e37} | ||||
| 
 | ||||
| \colorlet{blocktitlefgcolor}{text} | ||||
| \colorlet{backgroundcolor}{background} | ||||
| \colorlet{blocktitlebgcolor}{background} | ||||
| \colorlet{blockbodyfgcolor}{text} | ||||
| \colorlet{innerblocktitlebgcolor}{background} | ||||
| \colorlet{innerblocktitlefgcolor}{text} | ||||
| \colorlet{notefrcolor}{text} | ||||
| \colorlet{notefgcolor}{background} | ||||
| \colorlet{notebgcolor}{background} | ||||
| 
 | ||||
| % Title setup | ||||
| \settitle{ | ||||
| % Rearrange the order of the minipages to e.g. center the title between the logos | ||||
| \begin{minipage}[c]{0.6\paperwidth} | ||||
| %    \centering | ||||
|     \vspace{2.5cm}\hspace{1.5cm} | ||||
|     \color{text}{\Huge{\textbf{\@title}} \par} | ||||
|     \vspace*{2em}\hspace{1.5cm} | ||||
|     \color{text}{\LARGE \@author \par} | ||||
|     \vspace*{2em}\hspace{1.5cm} | ||||
|     \color{text}{\Large \@institute} | ||||
|     \vspace{2.5cm} | ||||
| \end{minipage} | ||||
| \begin{minipage}[c]{0.2\paperwidth} | ||||
| %    \centering | ||||
|     \vspace{1cm}\hspace{1cm} | ||||
|     \includegraphics[scale=1]{example-image-a} | ||||
| \end{minipage} | ||||
| \begin{minipage}[c]{0.2\paperwidth} | ||||
| %    \vspace{1cm}\hspace{1cm} | ||||
|     \centering | ||||
|     \includegraphics[scale=1]{example-image-a} | ||||
| \end{minipage}} | ||||
| 
 | ||||
| % definie title style with background box | ||||
| \definetitlestyle{sampletitle}{ | ||||
|     width=1189mm, | ||||
|     roundedcorners=0, | ||||
|     linewidth=0pt, | ||||
|     innersep=15pt, | ||||
|     titletotopverticalspace=0mm, | ||||
|     titletoblockverticalspace=5pt | ||||
| }{ | ||||
|     \begin{scope}[line width=\titlelinewidth, rounded corners=\titleroundedcorners] | ||||
|     \draw[fill=text, color=boxes] | ||||
|     (\titleposleft,\titleposbottom) | ||||
|     rectangle | ||||
|     (\titleposright,\titlepostop); | ||||
|     \end{scope} | ||||
| } | ||||
| 
 | ||||
| % define coustom block style for visible blocks | ||||
| \defineblockstyle{GrayBlock}{ | ||||
|     titlewidthscale=1, | ||||
|     bodywidthscale=1, | ||||
|     % titlecenter, | ||||
|     titleleft, | ||||
|     titleoffsetx=0pt, | ||||
|     titleoffsety=-30pt, | ||||
|     bodyoffsetx=0pt, | ||||
|     bodyoffsety=-40pt, | ||||
|     bodyverticalshift=0mm, | ||||
|     roundedcorners=25, | ||||
|     linewidth=1pt, | ||||
|     titleinnersep=20pt, | ||||
|     bodyinnersep=38pt | ||||
| }{ | ||||
|     \draw[rounded corners=\blockroundedcorners, inner sep=\blockbodyinnersep, | ||||
|           line width=\blocklinewidth, color=background, | ||||
|           top color=boxes, bottom color=boxes, | ||||
|           ] | ||||
|       (blockbody.south west) rectangle (blockbody.north east); % | ||||
|     \ifBlockHasTitle% | ||||
|         \draw[rounded corners=\blockroundedcorners, inner sep=\blocktitleinnersep, | ||||
|           top color=background, bottom color=background, | ||||
|           line width=2, color=background, %fill=blocktitlebgcolor | ||||
|           ] | ||||
|       (blocktitle.south west) rectangle (blocktitle.north east); % | ||||
|     \fi% | ||||
| } | ||||
| \newcommand\myblock[3][GrayBlock]{\useblockstyle{#1}\block{#2}{#3}\useblockstyle{Default}} | ||||
| 
 | ||||
| % Define blockstyle for tranparent block | ||||
| \defineblockstyle{TranspBlock}{ | ||||
|     titlewidthscale=0.99, | ||||
|     bodywidthscale=0.99, | ||||
|     titleleft, | ||||
|     titleoffsetx=15pt, | ||||
|     titleoffsety=-40pt, | ||||
|     bodyoffsetx=0pt, | ||||
|     bodyoffsety=-40pt, | ||||
|     bodyverticalshift=0mm, | ||||
|     roundedcorners=25, | ||||
|     linewidth=1pt, | ||||
|     titleinnersep=20pt, | ||||
|     bodyinnersep=38pt | ||||
| }{ | ||||
|     \draw[rounded corners=\blockroundedcorners, inner sep=\blockbodyinnersep, | ||||
|           line width=\blocklinewidth, color=background, | ||||
|           top color=background, bottom color=background, | ||||
|           ] | ||||
|       (blockbody.south west) rectangle (blockbody.north east); % | ||||
|     \ifBlockHasTitle% | ||||
|         \draw[rounded corners=\blockroundedcorners, inner sep=\blocktitleinnersep, | ||||
|           top color=background, bottom color=background, | ||||
|           line width=2, color=background, %fill=blocktitlebgcolor | ||||
|           ] | ||||
|       (blocktitle.south west) rectangle (blocktitle.north east); % | ||||
|     \fi% | ||||
| } | ||||
| \renewcommand\myblock[3][TranspBlock]{\useblockstyle{#1}\block{#2}{#3}\useblockstyle{Default}} | ||||
							
								
								
									
										148
									
								
								requirements.txt
									
									
									
									
									
								
							
							
						
						
									
										148
									
								
								requirements.txt
									
									
									
									
									
								
							| @ -1,140 +1,14 @@ | ||||
| asttokens==2.2.1 | ||||
| backcall==0.2.0 | ||||
| contourpy==1.0.6 | ||||
| cycler==0.11.0 | ||||
| decorator==5.1.1 | ||||
| executing==1.2.0 | ||||
| fonttools==4.38.0 | ||||
| ipython==8.8.0 | ||||
| jedi==0.18.2 | ||||
| kiwisolver==1.4.4 | ||||
| matplotlib==3.6.2 | ||||
| matplotlib-inline==0.1.6 | ||||
| numpy==1.24.1 | ||||
| packaging==23.0 | ||||
| pandas==1.5.2 | ||||
| parso==0.8.3 | ||||
| pexpect==4.8.0 | ||||
| pickleshare==0.7.5 | ||||
| Pillow==9.4.0 | ||||
| prompt-toolkit==3.0.36 | ||||
| ptyprocess==0.7.0 | ||||
| pure-eval==0.2.2 | ||||
| Pygments==2.14.0 | ||||
| pyparsing==3.0.9 | ||||
| python-dateutil==2.8.2 | ||||
| pytz==2022.7 | ||||
| scipy==1.10.0 | ||||
| six==1.16.0 | ||||
| sklearn==0.0.post1 | ||||
| stack-data==0.6.2 | ||||
| traitlets==5.8.0 | ||||
| wcwidth==0.2.5 | ||||
| asttokens==2.2.1 | ||||
| audioio==0.10.0 | ||||
| backcall==0.2.0 | ||||
| contourpy==1.0.6 | ||||
| cycler==0.11.0 | ||||
| decorator==5.1.1 | ||||
| executing==1.2.0 | ||||
| fonttools==4.38.0 | ||||
| ipython==8.8.0 | ||||
| jedi==0.18.2 | ||||
| kiwisolver==1.4.4 | ||||
| matplotlib==3.6.2 | ||||
| matplotlib-inline==0.1.6 | ||||
| numpy==1.24.1 | ||||
| packaging==23.0 | ||||
| pandas==1.5.2 | ||||
| parso==0.8.3 | ||||
| pexpect==4.8.0 | ||||
| pickleshare==0.7.5 | ||||
| Pillow==9.4.0 | ||||
| prompt-toolkit==3.0.36 | ||||
| ptyprocess==0.7.0 | ||||
| pure-eval==0.2.2 | ||||
| Pygments==2.14.0 | ||||
| pyparsing==3.0.9 | ||||
| python-dateutil==2.8.2 | ||||
| pytz==2022.7 | ||||
| scipy==1.10.0 | ||||
| six==1.16.0 | ||||
| sklearn==0.0.post1 | ||||
| stack-data==0.6.2 | ||||
| thunderfish==1.9.10 | ||||
| traitlets==5.8.0 | ||||
| wcwidth==0.2.5 | ||||
| appnope==0.1.3 | ||||
| asttokens==2.2.1 | ||||
| audioio==0.10.0 | ||||
| backcall==0.2.0 | ||||
| contourpy==1.0.6 | ||||
| cycler==0.11.0 | ||||
| decorator==5.1.1 | ||||
| executing==1.2.0 | ||||
| fonttools==4.38.0 | ||||
| ipython==8.8.0 | ||||
| jedi==0.18.2 | ||||
| kiwisolver==1.4.4 | ||||
| matplotlib==3.6.2 | ||||
| matplotlib-inline==0.1.6 | ||||
| numpy==1.24.1 | ||||
| packaging==23.0 | ||||
| pandas==1.5.2 | ||||
| parso==0.8.3 | ||||
| pexpect==4.8.0 | ||||
| pickleshare==0.7.5 | ||||
| Pillow==9.4.0 | ||||
| prompt-toolkit==3.0.36 | ||||
| ptyprocess==0.7.0 | ||||
| pure-eval==0.2.2 | ||||
| Pygments==2.14.0 | ||||
| pyparsing==3.0.9 | ||||
| python-dateutil==2.8.2 | ||||
| pytz==2022.7 | ||||
| scipy==1.10.0 | ||||
| six==1.16.0 | ||||
| sklearn==0.0.post1 | ||||
| stack-data==0.6.2 | ||||
| thunderfish==1.9.10 | ||||
| traitlets==5.8.0 | ||||
| wcwidth==0.2.5 | ||||
| asttokens==2.2.1 | ||||
| audioio==0.10.0 | ||||
| backcall==0.2.0 | ||||
| audioio==0.9.5 | ||||
| cmocean==2.0 | ||||
| contourpy==1.0.6 | ||||
| cycler==0.11.0 | ||||
| decorator==5.1.1 | ||||
| executing==1.2.0 | ||||
| fonttools==4.38.0 | ||||
| ipython==8.8.0 | ||||
| jedi==0.18.2 | ||||
| joblib==1.2.0 | ||||
| kiwisolver==1.4.4 | ||||
| matplotlib==3.6.2 | ||||
| matplotlib-inline==0.1.6 | ||||
| numpy==1.24.1 | ||||
| packaging==23.0 | ||||
| pandas==1.5.2 | ||||
| parso==0.8.3 | ||||
| pexpect==4.8.0 | ||||
| pickleshare==0.7.5 | ||||
| Pillow==9.4.0 | ||||
| prompt-toolkit==3.0.36 | ||||
| ptyprocess==0.7.0 | ||||
| pure-eval==0.2.2 | ||||
| Pygments==2.14.0 | ||||
| pyparsing==3.0.9 | ||||
| python-dateutil==2.8.2 | ||||
| pytz==2022.7 | ||||
| ipython==8.10.0 | ||||
| matplotlib==3.7.0 | ||||
| numpy==1.24.2 | ||||
| pandas==1.5.3 | ||||
| paramiko==2.11.1 | ||||
| PyYAML==6.0 | ||||
| scikit-learn==1.2.0 | ||||
| scipy==1.10.0 | ||||
| six==1.16.0 | ||||
| sklearn==0.0.post1 | ||||
| stack-data==0.6.2 | ||||
| threadpoolctl==3.1.0 | ||||
| thunderfish==1.9.10 | ||||
| traitlets==5.8.0 | ||||
| wcwidth==0.2.5 | ||||
| scikit_learn==1.2.1 | ||||
| scipy==1.10.1 | ||||
| scp==0.14.5 | ||||
| thunderfish==1.9.9 | ||||
| tqdm==4.64.1 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user