diff --git a/aopy/visualization/base.py b/aopy/visualization/base.py index f4473246..b5121c08 100644 --- a/aopy/visualization/base.py +++ b/aopy/visualization/base.py @@ -1129,6 +1129,42 @@ def plot_circles(circle_positions, circle_radius, circle_color='b', bounds=None, ax.set_aspect('equal', adjustable='box') if bounds is not None: set_bounds(bounds, ax) +def plot_colored_targets(target_locations, target_radius, colors=None, bounds=(-10,10,-10,10), alpha=0.2): + """Plot circular targets at specified locations with different colors. + + Args: + target_locations (np.ndarray): Array of target coordinates, shape (n_targets, 2) + target_radius (float): Radius of the circular targets + colors (list, optional): List of colors for targets. If None, generates new color palette + bounds (tuple): Plot bounds as (xmin, xmax, ymin, ymax). Defaults to (-10,10,-10,10) + alpha (float): Transparency of targets. Defaults to 0.2 + + Returns: + None + + Example: + .. code-block:: python + + locs = np.array([[0,0], [5,5]]) + plot_colored_targets(locs, 1.0) + + #Tips: You could specify a different color for center target by defining a color palette like this + colors = ['gainsboro'] + list(sns.color_palette(n_colors=len(locs)-1)) + plot_colored_targets(locs, 1.0, colors) + + .. image:: _images/plot_colored_targets.png + """ + if colors is None: + colors = sns.color_palette(n_colors=len(target_locations)) + for i, target_loc in enumerate(target_locations): + plot_circles( + [target_loc], + target_radius, + circle_color=colors[i], + bounds=bounds, + alpha=alpha + ) + sns.despine() def plot_trajectories(trajectories, bounds=None, ax=None, **kwargs): ''' diff --git a/docs/source/_images/angles_magnitudes.png b/docs/source/_images/angles_magnitudes.png index 3faeacfc..dfd2cc42 100644 Binary files a/docs/source/_images/angles_magnitudes.png and b/docs/source/_images/angles_magnitudes.png differ diff --git a/docs/source/_images/angles_simple.png b/docs/source/_images/angles_simple.png index 4a039940..753f7d66 100644 Binary files a/docs/source/_images/angles_simple.png and b/docs/source/_images/angles_simple.png differ diff --git a/docs/source/_images/annotated_spatial_drive_map_stim.png b/docs/source/_images/annotated_spatial_drive_map_stim.png index 9178864a..1c1f2471 100644 Binary files a/docs/source/_images/annotated_spatial_drive_map_stim.png and b/docs/source/_images/annotated_spatial_drive_map_stim.png differ diff --git a/docs/source/_images/annotated_stim_drive_data.png b/docs/source/_images/annotated_stim_drive_data.png index 123028ca..6cbc7aa3 100644 Binary files a/docs/source/_images/annotated_stim_drive_data.png and b/docs/source/_images/annotated_stim_drive_data.png differ diff --git a/docs/source/_images/boxplot_example.png b/docs/source/_images/boxplot_example.png index 6b70ebc0..c5679ab8 100644 Binary files a/docs/source/_images/boxplot_example.png and b/docs/source/_images/boxplot_example.png differ diff --git a/docs/source/_images/boxplot_example_nonrectangular.png b/docs/source/_images/boxplot_example_nonrectangular.png index eeb9859b..01807e8f 100644 Binary files a/docs/source/_images/boxplot_example_nonrectangular.png and b/docs/source/_images/boxplot_example_nonrectangular.png differ diff --git a/docs/source/_images/circular_histograms.png b/docs/source/_images/circular_histograms.png index b41fc74d..5730839d 100644 Binary files a/docs/source/_images/circular_histograms.png and b/docs/source/_images/circular_histograms.png differ diff --git a/docs/source/_images/color_gradient_example.png b/docs/source/_images/color_gradient_example.png index 6528a245..ebc84c5f 100644 Binary files a/docs/source/_images/color_gradient_example.png and b/docs/source/_images/color_gradient_example.png differ diff --git a/docs/source/_images/color_targets.png b/docs/source/_images/color_targets.png index 3f709365..1edf3ea3 100644 Binary files a/docs/source/_images/color_targets.png and b/docs/source/_images/color_targets.png differ diff --git a/docs/source/_images/color_targets_3D.png b/docs/source/_images/color_targets_3D.png index 030bfde3..0a418e38 100644 Binary files a/docs/source/_images/color_targets_3D.png and b/docs/source/_images/color_targets_3D.png differ diff --git a/docs/source/_images/color_trajectories_segmented.png b/docs/source/_images/color_trajectories_segmented.png index 4eec48d2..810bd95f 100644 Binary files a/docs/source/_images/color_trajectories_segmented.png and b/docs/source/_images/color_trajectories_segmented.png differ diff --git a/docs/source/_images/color_trajectories_simple.png b/docs/source/_images/color_trajectories_simple.png index c35606eb..374c7b7a 100644 Binary files a/docs/source/_images/color_trajectories_simple.png and b/docs/source/_images/color_trajectories_simple.png differ diff --git a/docs/source/_images/condition_tuning.png b/docs/source/_images/condition_tuning.png index 84361e22..63a32b79 100644 Binary files a/docs/source/_images/condition_tuning.png and b/docs/source/_images/condition_tuning.png differ diff --git a/docs/source/_images/corr_over_dist.png b/docs/source/_images/corr_over_dist.png index dcdb6a37..2ae0dacd 100644 Binary files a/docs/source/_images/corr_over_dist.png and b/docs/source/_images/corr_over_dist.png differ diff --git a/docs/source/_images/corr_over_entries.png b/docs/source/_images/corr_over_entries.png index a0ce9916..6700fa4c 100644 Binary files a/docs/source/_images/corr_over_entries.png and b/docs/source/_images/corr_over_entries.png differ diff --git a/docs/source/_images/decoder_weights.png b/docs/source/_images/decoder_weights.png index ea58d14c..518d6f67 100644 Binary files a/docs/source/_images/decoder_weights.png and b/docs/source/_images/decoder_weights.png differ diff --git a/docs/source/_images/decoder_weights_emg.png b/docs/source/_images/decoder_weights_emg.png index 89cd61c2..d4c5684a 100644 Binary files a/docs/source/_images/decoder_weights_emg.png and b/docs/source/_images/decoder_weights_emg.png differ diff --git a/docs/source/_images/direction_tuning.png b/docs/source/_images/direction_tuning.png index d66fa4ca..6eb960df 100644 Binary files a/docs/source/_images/direction_tuning.png and b/docs/source/_images/direction_tuning.png differ diff --git a/docs/source/_images/direction_tuning_polar.png b/docs/source/_images/direction_tuning_polar.png index 79d9e408..9ac68e6c 100644 Binary files a/docs/source/_images/direction_tuning_polar.png and b/docs/source/_images/direction_tuning_polar.png differ diff --git a/docs/source/_images/ecog244_opto32.png b/docs/source/_images/ecog244_opto32.png index bf0a2005..2337a5ce 100644 Binary files a/docs/source/_images/ecog244_opto32.png and b/docs/source/_images/ecog244_opto32.png differ diff --git a/docs/source/_images/ecog244_opto32_theta90.png b/docs/source/_images/ecog244_opto32_theta90.png index bcfd38a4..386d14cc 100644 Binary files a/docs/source/_images/ecog244_opto32_theta90.png and b/docs/source/_images/ecog244_opto32_theta90.png differ diff --git a/docs/source/_images/emg64_gr08mm1305.png b/docs/source/_images/emg64_gr08mm1305.png index b2591243..7da2ef74 100644 Binary files a/docs/source/_images/emg64_gr08mm1305.png and b/docs/source/_images/emg64_gr08mm1305.png differ diff --git a/docs/source/_images/eye_calibration.png b/docs/source/_images/eye_calibration.png index 5e7b3b80..2a58521c 100644 Binary files a/docs/source/_images/eye_calibration.png and b/docs/source/_images/eye_calibration.png differ diff --git a/docs/source/_images/gradient_trajectories.png b/docs/source/_images/gradient_trajectories.png index d43134f0..90a4b914 100644 Binary files a/docs/source/_images/gradient_trajectories.png and b/docs/source/_images/gradient_trajectories.png differ diff --git a/docs/source/_images/gradient_trajectories_3d.png b/docs/source/_images/gradient_trajectories_3d.png index e850601f..23d6f0cc 100644 Binary files a/docs/source/_images/gradient_trajectories_3d.png and b/docs/source/_images/gradient_trajectories_3d.png differ diff --git a/docs/source/_images/image_by_time.png b/docs/source/_images/image_by_time.png index a8bb9914..bae760bc 100644 Binary files a/docs/source/_images/image_by_time.png and b/docs/source/_images/image_by_time.png differ diff --git a/docs/source/_images/labeled_subplots.png b/docs/source/_images/labeled_subplots.png index 46c5d95b..553279cc 100644 Binary files a/docs/source/_images/labeled_subplots.png and b/docs/source/_images/labeled_subplots.png differ diff --git a/docs/source/_images/overlay_sulci_affi.png b/docs/source/_images/overlay_sulci_affi.png index a5ad586d..1afb7374 100644 Binary files a/docs/source/_images/overlay_sulci_affi.png and b/docs/source/_images/overlay_sulci_affi.png differ diff --git a/docs/source/_images/overlay_sulci_beignet.png b/docs/source/_images/overlay_sulci_beignet.png index 5a81eca8..4c9805e7 100644 Binary files a/docs/source/_images/overlay_sulci_beignet.png and b/docs/source/_images/overlay_sulci_beignet.png differ diff --git a/docs/source/_images/place_Opto32_subplots.png b/docs/source/_images/place_Opto32_subplots.png index b0a2d245..660ec2b2 100644 Binary files a/docs/source/_images/place_Opto32_subplots.png and b/docs/source/_images/place_Opto32_subplots.png differ diff --git a/docs/source/_images/place_subplots_1.png b/docs/source/_images/place_subplots_1.png index 77917f3b..b6a8f374 100644 Binary files a/docs/source/_images/place_subplots_1.png and b/docs/source/_images/place_subplots_1.png differ diff --git a/docs/source/_images/place_subplots_2.png b/docs/source/_images/place_subplots_2.png index 6bd42cc4..4b4c9539 100644 Binary files a/docs/source/_images/place_subplots_2.png and b/docs/source/_images/place_subplots_2.png differ diff --git a/docs/source/_images/plot_colored_targets.png b/docs/source/_images/plot_colored_targets.png new file mode 100644 index 00000000..328db29d Binary files /dev/null and b/docs/source/_images/plot_colored_targets.png differ diff --git a/docs/source/_images/plot_plane_example.png b/docs/source/_images/plot_plane_example.png index 40bae94e..ac344f75 100644 Binary files a/docs/source/_images/plot_plane_example.png and b/docs/source/_images/plot_plane_example.png differ diff --git a/docs/source/_images/plot_sphere_example.png b/docs/source/_images/plot_sphere_example.png index b6e9eb9e..94d6e31a 100644 Binary files a/docs/source/_images/plot_sphere_example.png and b/docs/source/_images/plot_sphere_example.png differ diff --git a/docs/source/_images/posmap.png b/docs/source/_images/posmap.png index ff6331bc..e96a8f28 100644 Binary files a/docs/source/_images/posmap.png and b/docs/source/_images/posmap.png differ diff --git a/docs/source/_images/posmap_alphamap.png b/docs/source/_images/posmap_alphamap.png index 5c6e677c..40ebacfd 100644 Binary files a/docs/source/_images/posmap_alphamap.png and b/docs/source/_images/posmap_alphamap.png differ diff --git a/docs/source/_images/posmap_calcmap.png b/docs/source/_images/posmap_calcmap.png index f823be6e..6fb0e687 100644 Binary files a/docs/source/_images/posmap_calcmap.png and b/docs/source/_images/posmap_calcmap.png differ diff --git a/docs/source/_images/posmap_calcmap_interp.png b/docs/source/_images/posmap_calcmap_interp.png index bf444e36..b8dd3063 100644 Binary files a/docs/source/_images/posmap_calcmap_interp.png and b/docs/source/_images/posmap_calcmap_interp.png differ diff --git a/docs/source/_images/reset_plot_color.png b/docs/source/_images/reset_plot_color.png index 7fae1776..572a3110 100644 Binary files a/docs/source/_images/reset_plot_color.png and b/docs/source/_images/reset_plot_color.png differ diff --git a/docs/source/_images/scalebar_example.png b/docs/source/_images/scalebar_example.png index 10ccb56b..97260cbb 100644 Binary files a/docs/source/_images/scalebar_example.png and b/docs/source/_images/scalebar_example.png differ diff --git a/docs/source/_images/sessions_by_date.png b/docs/source/_images/sessions_by_date.png index 02fe7034..45711b35 100644 Binary files a/docs/source/_images/sessions_by_date.png and b/docs/source/_images/sessions_by_date.png differ diff --git a/docs/source/_images/sessions_by_trial.png b/docs/source/_images/sessions_by_trial.png index 9d445084..c8f98394 100644 Binary files a/docs/source/_images/sessions_by_trial.png and b/docs/source/_images/sessions_by_trial.png differ diff --git a/docs/source/_images/spatial_drive_maps_1_4.png b/docs/source/_images/spatial_drive_maps_1_4.png index 6790796c..57689cb3 100644 Binary files a/docs/source/_images/spatial_drive_maps_1_4.png and b/docs/source/_images/spatial_drive_maps_1_4.png differ diff --git a/docs/source/_images/spatial_drive_maps_2_2.png b/docs/source/_images/spatial_drive_maps_2_2.png index 8c067635..56db7572 100644 Binary files a/docs/source/_images/spatial_drive_maps_2_2.png and b/docs/source/_images/spatial_drive_maps_2_2.png differ diff --git a/docs/source/_images/spatial_drive_maps_2_2_single_cbar.png b/docs/source/_images/spatial_drive_maps_2_2_single_cbar.png index a3f3342d..e204d640 100644 Binary files a/docs/source/_images/spatial_drive_maps_2_2_single_cbar.png and b/docs/source/_images/spatial_drive_maps_2_2_single_cbar.png differ diff --git a/docs/source/_images/tf_map_grid.png b/docs/source/_images/tf_map_grid.png index a0835285..ee37f5e5 100644 Binary files a/docs/source/_images/tf_map_grid.png and b/docs/source/_images/tf_map_grid.png differ diff --git a/docs/source/_images/tfr_cwt_50_200.png b/docs/source/_images/tfr_cwt_50_200.png index 2f3d1d90..bddf51da 100644 Binary files a/docs/source/_images/tfr_cwt_50_200.png and b/docs/source/_images/tfr_cwt_50_200.png differ diff --git a/docs/source/_images/timeseries_gradient.png b/docs/source/_images/timeseries_gradient.png index a2d106e5..509b0285 100644 Binary files a/docs/source/_images/timeseries_gradient.png and b/docs/source/_images/timeseries_gradient.png differ diff --git a/docs/source/_images/tuning_curves_plot.png b/docs/source/_images/tuning_curves_plot.png index 4ddc94ae..b419db7c 100644 Binary files a/docs/source/_images/tuning_curves_plot.png and b/docs/source/_images/tuning_curves_plot.png differ diff --git a/tests/test_visualization.py b/tests/test_visualization.py index ab6e0599..2bd61b84 100644 --- a/tests/test_visualization.py +++ b/tests/test_visualization.py @@ -597,6 +597,27 @@ def test_plot_circles(self): plot_circles(target_position, target_radius, target_color, (-2, 2, -2, 2, -2, 2), ax=ax) savefig(write_dir, filename) + def test_plot_colored_targets(self): + + target_locations = np.array([[0,0], [5,5]]) + target_radius = 1.0 + plt.figure() + plot_colored_targets(target_locations, target_radius) + savefig(write_dir, 'colored_targets.png') + + # Test with colors + colors = ['red', 'blue'] + plt.figure() + plot_colored_targets(target_locations, target_radius, colors) + savefig(write_dir, 'colored_targets_colors.png') + + # Test with bounds + bounds = (-10, 10, -10, 10) + plt.figure() + plot_colored_targets(target_locations, target_radius, bounds=bounds) + savefig(write_dir, 'colored_targets_bounds.png') + + def test_color_targets_3D(self): from mpl_toolkits.mplot3d import Axes3D import seaborn as sns