diff --git a/WrightTools/data/_join.py b/WrightTools/data/_join.py
index 1f40775..56ae809 100644
--- a/WrightTools/data/_join.py
+++ b/WrightTools/data/_join.py
@@ -11,8 +11,10 @@ from ._data import Channel, Data
 
 # --- define --------------------------------------------------------------------------------------
 
+
 __all__ = ['join']
 
+
 # --- functions -----------------------------------------------------------------------------------
 
 
@@ -32,21 +34,11 @@ def join(datas, method='first', verbose=True, **kwargs):
     verbose : bool (optional)
         Toggle talkback. Default is True.
 
-    Keyword Arguments
-    -----------------
-    axis objects
-        The axes of the new data object. If not supplied, the points of the
-        new axis will be guessed from the given datas.
-
     Returns
     -------
-    data
-        A Data instance.
+    WrightTools.data.Data
+        A new Data instance.
     """
-    # TODO: a proper treatment of joining datas that have different dimensions
-    # with intellegent treatment of their constant dimensions. perhaps changing
-    # map_axis would be good for this. - Blaise 2015.10.31
-
     # copy datas so original objects are not changed
     datas = [d.copy() for d in datas]
     # get scanned dimensions
@@ -63,7 +55,6 @@ def join(datas, method='first', verbose=True, **kwargs):
                 axis_names.append(axis.name)
                 axis_units.append(axis.units)
                 axis_objects.append(axis)
-    # TODO: transpose to same dimension orders
     # convert into same units
     for data in datas:
         for axis_name, axis_unit in zip(axis_names, axis_units):
@@ -73,26 +64,11 @@ def join(datas, method='first', verbose=True, **kwargs):
     # get axis points
     axis_points = []  # list of 1D arrays
     for axis_name in axis_names:
-        if axis_name in kwargs.keys():
-            axis_points.append(kwargs[axis_name].points)
-            continue
-        all_points = np.array([])
-        step_sizes = []
+        points = np.full((0), np.nan)
         for data in datas:
-            for axis in data.axes:
-                if axis.name == axis_name:
-                    all_points = np.concatenate([all_points, axis.points])
-                    this_axis_min = np.nanmin(axis.points)
-                    this_axis_max = np.nanmax(axis.points)
-                    this_axis_number = float(axis.points.size) - 1
-                    step_size = (this_axis_max - this_axis_min) / this_axis_number
-                    step_sizes.append(step_size)
-        axis_min = np.nanmin(all_points)
-        axis_max = np.nanmax(all_points)
-        axis_step_size = min(step_sizes)
-        axis_n_points = np.ceil((axis_max - axis_min) / axis_step_size)
-        points = np.linspace(axis_min, axis_max, axis_n_points + 1)
-        axis_points.append(points)
+            index = data.axis_names.index(axis_name)
+            points = np.hstack((points, data.axes[index].points))
+        axis_points.append(np.unique(points))
     # map datas to new points
     for axis_index, axis_name in enumerate(axis_names):
         for data in datas:

[before h5] join takes set of points along each axis
currently join looks at each axis and tries to guess what the best evenly spaced points are

moving forward, join will simply take the set of all points in all data objects along each axis

interpolation will still be used for points that are not contained in any data set (within the convex hull, of course)
diff --git a/tests/data/join.py b/tests/data/join.py
index 3d77f1f..72b9bc0 100644
--- a/tests/data/join.py
+++ b/tests/data/join.py
@@ -1,8 +1,18 @@
+"""Test join."""
+
+
+# --- import --------------------------------------------------------------------------------------
+
+
 import numpy as np
 
 import WrightTools as wt
 from WrightTools import datasets
 
+
+# --- test ----------------------------------------------------------------------------------------
+
+
 def test_wm_w2_w1():
     p = datasets.PyCMDS.wm_w2_w1_000
     a = wt.data.from_PyCMDS(p)

pip install -e .
parse_log_pytest
requirements.txt
pytest
apt-get update apt-get install -y gcc
3.6
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
appdirs==1.4.4
attrs==22.2.0
cached-property==1.5.2
certifi==2021.5.30
cycler==0.11.0
h5py==3.1.0
imageio==2.15.0
importlib-metadata==4.8.3
iniconfig==1.1.1
kiwisolver==1.3.1
matplotlib==3.3.4
numpy==1.19.5
packaging==21.3
Pillow==8.4.0
pluggy==1.0.0
py==1.11.0
pyparsing==3.1.4
pytest==7.0.1
python-dateutil==2.9.0.post0
pytz==2025.2
scipy==1.5.4
six==1.17.0
tomli==1.2.3
typing_extensions==4.1.1
-e git+https://github.com/wright-group/WrightTools.git@219ad0c41c0286461e4085e6f563ca695b37e2bd#egg=WrightTools
zipp==3.6.0

name: WrightTools
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - appdirs==1.4.4
      - attrs==22.2.0
      - cached-property==1.5.2
      - cycler==0.11.0
      - h5py==3.1.0
      - imageio==2.15.0
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - kiwisolver==1.3.1
      - matplotlib==3.3.4
      - numpy==1.19.5
      - packaging==21.3
      - pillow==8.4.0
      - pluggy==1.0.0
      - py==1.11.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - scipy==1.5.4
      - six==1.17.0
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - zipp==3.6.0
prefix: /opt/conda/envs/WrightTools

tests/data/join.py::test_wm_w2_w1
WrightTools/data/_join.py
WrightTools/data/_join.py