Skip to content

Commit

Permalink
plots
Browse files Browse the repository at this point in the history
  • Loading branch information
lindemann09 committed Nov 21, 2024
1 parent c332ab9 commit 46c9a33
Show file tree
Hide file tree
Showing 6 changed files with 100 additions and 54 deletions.
2 changes: 1 addition & 1 deletion pynsn/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# pylint: disable=C0413

__author__ = "Oliver Lindemann <lindemann@cognitive-psychology.eu>"
__version__ = '1.0.8'
__version__ = '1.0.9-dev1'

from sys import version_info as _python_version_info
from ._misc import is_interactive_mode as _is_interactive_mode
Expand Down
1 change: 0 additions & 1 deletion pynsn/analysis/__init__.py

This file was deleted.

51 changes: 0 additions & 51 deletions pynsn/analysis/_collection_stats.py

This file was deleted.

3 changes: 3 additions & 0 deletions pynsn/plots/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from ._collection_stats import (property_regression,
property_difference_regression,
property_ratio_regression)
93 changes: 93 additions & 0 deletions pynsn/plots/_collection_plots.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
from math import ceil
from typing import List, Tuple, Union

import matplotlib.pyplot as plt
import pandas as pd
from scipy.stats import linregress

from .._stimulus.properties import VP, ensure_vp, VPOrList
from ..collections._coll_stim_pairs import CollectionStimulusPairs, CollectionStimuli


def property_regression(stimuli: CollectionStimuli,
dv: Union[str, VP],
iv: VPOrList,
figsize: Tuple[float, float] = (10, 8)):

if isinstance(iv, List):
iv_prop = [ensure_vp(p) for p in iv]
else:
iv_prop = [ensure_vp(iv)]
dv = ensure_vp(dv)

data = stimuli.property_dataframe()
cols = [p.name for p in iv_prop + [dv]]

return _regression_plots(data[cols], dv=dv,
ivs=iv_prop, figsize=figsize)


def property_difference_regression(stim_pairs: CollectionStimulusPairs,
dv: Union[str, VP],
iv: VPOrList,
figsize: Tuple[float, float] = (10, 8)):

if isinstance(iv, List):
iv_prop = [ensure_vp(p) for p in iv]
else:
iv_prop = [ensure_vp(iv)]
dv = ensure_vp(dv)

data = stim_pairs.property_differences(iv_prop + [dv])
return _regression_plots(data, dv=dv,
ivs=iv_prop, figsize=figsize)


def property_ratio_regression(stim_pairs: CollectionStimulusPairs,
dv: Union[str, VP],
iv: VPOrList,
figsize: Tuple[float, float] = (10, 8)):

if isinstance(iv, List):
iv_prop = [ensure_vp(p) for p in iv]
else:
iv_prop = [ensure_vp(iv)]
dv = ensure_vp(dv)

data = stim_pairs.property_ratios(iv_prop + [dv])
return _regression_plots(data, dv=dv,
ivs=iv_prop, figsize=figsize)


def _regression_plots(data: pd.DataFrame,
dv: VP,
ivs: List[VP],
figsize: Tuple[float, float] = (10, 8)):

if dv in ivs:
raise ValueError(f"Dependent variable '{dv.name}' is also"
" in list of independent variables.")
if len(ivs) == 1:
n_col = 1
n_row = 1
else:
n_col = 2
n_row = ceil(len(ivs)/2)

fig, axs = plt.subplots(n_row, n_col, figsize=figsize)
for i, p in enumerate(ivs):
_reg_plot(axs.flat[i], data, dv.name, p.name)

plt.tight_layout()
return fig


def _reg_plot(ax: plt.Axes, df: pd.DataFrame, x: str, y: str): # type: ignore
slope, intercept, r_value, _, _ = linregress(df[x], df[y])

ax.scatter(df[x], df[y])
# Add regression line
reg_line = slope * df[x] + intercept # type: ignore
ax.plot(df[x], reg_line, color='green')
ax.set_title(f"{x}, {y} (r={r_value:.2f})")
return
4 changes: 3 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,15 @@ dynamic = ["version", "description"]
requires-python = ">=3.10"
dependencies = ["numpy>=2.1.3",
"pandas>=2.2",
"scipy>=1.14",
"matplotlib>=3.9",
"shapely>=2.0",
"orjson>=3.10",
"svgwrite>=1.4",
"Pillow>=11.0"]

[project.optional-dependencies]
analysis = ["scipy>=1.14", "matplotlib>=3.9"]
analysis = []
pygame = ["pygame>=2.5"]
#expyriment = ["expyriment>=0.10"]
test = [
Expand Down

0 comments on commit 46c9a33

Please sign in to comment.