diff --git a/docs/sources/CHANGELOG.md b/docs/sources/CHANGELOG.md
index 9e1973cb8..fae9ab06a 100755
--- a/docs/sources/CHANGELOG.md
+++ b/docs/sources/CHANGELOG.md
@@ -23,7 +23,7 @@ The CHANGELOG for the current development version is available at
- The `bias_variance_decomp` function now supports Keras estimators. ([#725](https://github.com/rasbt/mlxtend/pull/725) via [@hanzigs](https://github.com/hanzigs))
- Adds new `mlxtend.classifier.OneRClassifier` (One Rule Classfier) class, a simple rule-based classifier that is often used as a performance baseline or simple interpretable model. ([#726](https://github.com/rasbt/mlxtend/pull/726)
- Adds new `create_counterfactual` method for creating counterfactuals to explain model predictions. ([#740](https://github.com/rasbt/mlxtend/pull/740))
-
+- Adds new `scatter_hist` method for generating scattered histogram. ([#596](https://github.com/rasbt/mlxtend/issues/596))
##### Changes
diff --git a/docs/sources/user_guide/plotting/scatter_hist.ipynb b/docs/sources/user_guide/plotting/scatter_hist.ipynb
new file mode 100644
index 000000000..95fa1cdd3
--- /dev/null
+++ b/docs/sources/user_guide/plotting/scatter_hist.ipynb
@@ -0,0 +1,285 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Scatter Histogram"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "A function to quickly produce a scatter histogram plot."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "> A function to quickly produce a scatter histogram plot."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Overview"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### References\n",
+ "\n",
+ "- https://matplotlib.org/gallery/lines_bars_and_markers/scatter_hist.html"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Example 1 - Scatter Plot and Histograms from Pandas DataFrames"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " sepal length [cm] | \n",
+ " sepal width [cm] | \n",
+ " petal length [cm] | \n",
+ " petal width [cm] | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 5.1 | \n",
+ " 3.5 | \n",
+ " 1.4 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 4.9 | \n",
+ " 3.0 | \n",
+ " 1.4 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 4.7 | \n",
+ " 3.2 | \n",
+ " 1.3 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 4.6 | \n",
+ " 3.1 | \n",
+ " 1.5 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 5.0 | \n",
+ " 3.6 | \n",
+ " 1.4 | \n",
+ " 0.2 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " sepal length [cm] sepal width [cm] petal length [cm] petal width [cm]\n",
+ "0 5.1 3.5 1.4 0.2\n",
+ "1 4.9 3.0 1.4 0.2\n",
+ "2 4.7 3.2 1.3 0.2\n",
+ "3 4.6 3.1 1.5 0.2\n",
+ "4 5.0 3.6 1.4 0.2"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from mlxtend.data import iris_data\n",
+ "from mlxtend.plotting import scatter_hist\n",
+ "import pandas as pd\n",
+ "X, y = iris_data()\n",
+ "df = pd.DataFrame(X)\n",
+ "df.columns = ['sepal length [cm]', 'sepal width [cm]', 'petal length [cm]', 'petal width [cm]']\n",
+ "df.head(5)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "from mlxtend.plotting import scatter_hist\n",
+ "\n",
+ "fig=scatter_hist(\"sepal length [cm]\", \"sepal width [cm]\", df)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Plotting the data of two variables with bivariate and univariate graphs. The `x` and `y` values are simply the column names of the DataFrame that we want to plot."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Example 2 - Category Scatter from NumPy Arrays"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[5.1, 3.5, 1.4, 0.2],\n",
+ " [4.9, 3. , 1.4, 0.2],\n",
+ " [4.7, 3.2, 1.3, 0.2],\n",
+ " [4.6, 3.1, 1.5, 0.2],\n",
+ " [5. , 3.6, 1.4, 0.2]])"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from mlxtend.data import iris_data\n",
+ "from mlxtend.plotting import scatter_hist\n",
+ "import pandas as pd\n",
+ "X, y = iris_data()\n",
+ "X[:5]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now, pretending that the first column represents the labels, and the second and third column represent the `x` and `y` values, respectively."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "fig= scatter_hist(0, 1, X)"
+ ]
+ }
+ ],
+ "metadata": {
+ "anaconda-cloud": {},
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.9"
+ },
+ "toc": {
+ "nav_menu": {},
+ "number_sections": true,
+ "sideBar": true,
+ "skip_h1_title": false,
+ "title_cell": "Table of Contents",
+ "title_sidebar": "Contents",
+ "toc_cell": false,
+ "toc_position": {},
+ "toc_section_display": true,
+ "toc_window_display": false
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/docs/sources/user_guide/plotting/scatter_hist_files/scatter_hist_dataframe.png b/docs/sources/user_guide/plotting/scatter_hist_files/scatter_hist_dataframe.png
new file mode 100644
index 000000000..84b8ede8c
Binary files /dev/null and b/docs/sources/user_guide/plotting/scatter_hist_files/scatter_hist_dataframe.png differ
diff --git a/docs/sources/user_guide/plotting/scatter_hist_files/scatter_hist_numpyarray.png b/docs/sources/user_guide/plotting/scatter_hist_files/scatter_hist_numpyarray.png
new file mode 100644
index 000000000..906415581
Binary files /dev/null and b/docs/sources/user_guide/plotting/scatter_hist_files/scatter_hist_numpyarray.png differ
diff --git a/mlxtend/plotting/__init__.py b/mlxtend/plotting/__init__.py
index 200f2b9b5..d07d36a5a 100644
--- a/mlxtend/plotting/__init__.py
+++ b/mlxtend/plotting/__init__.py
@@ -19,8 +19,7 @@
from .ecdf import ecdf
from .scatterplotmatrix import scatterplotmatrix
from .pca_correlation_graph import plot_pca_correlation_graph
-
-
+from .scatter_hist import scatter_hist
__all__ = ["plot_learning_curves",
"plot_decision_regions",
"plot_confusion_matrix",
@@ -34,4 +33,5 @@
"checkerboard_plot",
"ecdf",
"scatterplotmatrix",
- "plot_pca_correlation_graph"]
+ "plot_pca_correlation_graph",
+ "scatter_hist"]
diff --git a/mlxtend/plotting/scatter_hist.py b/mlxtend/plotting/scatter_hist.py
new file mode 100644
index 000000000..0829d2cf8
--- /dev/null
+++ b/mlxtend/plotting/scatter_hist.py
@@ -0,0 +1,71 @@
+# Sebastian Raschka 2014-2020
+# mlxtend Machine Learning Library Extensions
+# Author: Sebastian Raschka
+#
+# License: BSD 3 clause
+import pandas as pd
+import numpy as np
+import matplotlib.pyplot as plt
+
+
+def scatter_hist(x, y, data):
+ """
+ Scatter plot and individual feature histograms along axes.
+
+ Parameters
+ ----------
+ x : str or int
+ DataFrame column name of the x-axis values or
+ integer for the numpy ndarray column index.
+ y : str or int
+ DataFrame column name of the y-axis values or
+ integer for the numpy ndarray column index
+ data : Pandas DataFrame object or NumPy ndarray.
+
+ Returns
+ ---------
+ plot : matplotlib pyplot figure object
+
+ """
+ left, width = 0.1, 0.65
+ bottom, height = 0.1, 0.65
+ spacing = 0.001
+ rect_scatter = [left, bottom, width, height]
+ rect_histx = [left, bottom + height + spacing, width, 0.2]
+ rect_histy = [left + width + spacing, bottom, 0.2, height]
+
+ if isinstance(data, pd.DataFrame):
+ for i in (x, y):
+ assert (isinstance(i, str))
+ frame = True
+ xlabel = x
+ ylabel = y
+ x = data[x]
+ y = data[y]
+
+ elif isinstance(data, np.ndarray):
+ for i in (x, y):
+ assert (isinstance(i, int))
+ frame = False
+ x = data[:, x]
+ y = data[:, y]
+
+ else:
+ raise ValueError('df must be pandas.DataFrame or numpy.ndarray object')
+
+ fig = plt.figure(figsize=(5, 5))
+ ax = fig.add_axes(rect_scatter)
+ if frame:
+ ax.set_xlabel(xlabel)
+ ax.set_ylabel(ylabel)
+
+ ax_histx = fig.add_axes(rect_histx, sharex=ax)
+ ax_histy = fig.add_axes(rect_histy, sharey=ax)
+ ax_histx.tick_params(axis="x", labelbottom=False)
+ ax_histy.tick_params(axis="y", labelleft=False)
+ ax_histx.axis("off")
+ ax_histy.axis("off")
+ ax_histx.hist(x, edgecolor='white', bins='auto')
+ ax_histy.hist(y, edgecolor='white', orientation='horizontal', bins='auto')
+ plot = ax.scatter(x, y)
+ return plot
diff --git a/mlxtend/plotting/tests/test_scatter_hist.py b/mlxtend/plotting/tests/test_scatter_hist.py
new file mode 100644
index 000000000..dd7f917bb
--- /dev/null
+++ b/mlxtend/plotting/tests/test_scatter_hist.py
@@ -0,0 +1,31 @@
+from mlxtend.data import iris_data
+from mlxtend.plotting import scatter_hist
+import pandas as pd
+import pytest
+
+X, y = iris_data()
+df = pd.DataFrame(X)
+df.columns = (['sepal length [cm]',
+ 'sepal width [cm]',
+ 'petal length [cm]',
+ 'petal width [cm]'])
+
+
+def test_pass_data_as_dataframe():
+ scatter_hist("sepal length [cm]", "sepal width [cm]", df)
+
+
+def test_pass_data_as_numpy_array():
+ scatter_hist(0, 1, X)
+
+
+def test_incorrect_x_or_y_data_as_dataframe():
+ with pytest.raises(AssertionError) as execinfo:
+ scatter_hist(0, "sepal width [cm]", df)
+ assert execinfo.value.message == 'Assertion failed'
+
+
+def test_incorrect_x_or_y_data_as_numpy_array():
+ with pytest.raises(AssertionError) as execinfo:
+ scatter_hist("sepal length [cm]", 1, X)
+ assert execinfo.value.message == 'Assertion failed'