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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
sepal length [cm]sepal width [cm]petal length [cm]petal width [cm]
05.13.51.40.2
14.93.01.40.2
24.73.21.30.2
34.63.11.50.2
45.03.61.40.2
\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'