Skip to content

Instantly share code, notes, and snippets.

@velikodniy
Last active November 29, 2019 12:35
Show Gist options
  • Save velikodniy/7bab6f236b45a70361506186a1120fbf to your computer and use it in GitHub Desktop.
Save velikodniy/7bab6f236b45a70361506186a1120fbf to your computer and use it in GitHub Desktop.
assocplot from R implemented in Python
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"inputHidden": false,
"outputHidden": false
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"inputHidden": false,
"outputHidden": false
},
"outputs": [],
"source": [
"def assocplot(x, rownames, colnames, col=['k', 'r'], space=0.3):\n",
" if x.ndim != 2:\n",
" raise ValueError('\"x\" must be a 2-d contingency table')\n",
" if (x < 0).any() or np.isnan(x).any():\n",
" raise ValueError('all entries of \"x\" must be nonnegative and finite')\n",
" if len(col) != 2:\n",
" raise ValueError('incorrect \"col\": must be length 2') \n",
" if len(rownames) != x.shape[0]:\n",
" raise ValueError('the length of \"rownames\" must be equal to the number of rows')\n",
" if len(colnames) != x.shape[1]:\n",
" raise ValueError('the length of \"colnames\" must be equal to the number of columns')\n",
" \n",
" n = x.sum() \n",
" if n == 0:\n",
" raise ValueError('at least one entry of \"x\" must be positive')\n",
" \n",
" f = x[:, ::-1]\n",
" colnames = colnames[::-1]\n",
" \n",
" e2 = f.sum(axis=1, keepdims=True) @ f.sum(axis=0, keepdims=True) / n\n",
" e = np.sqrt(e2)\n",
" d = (f - e2) / e\n",
" \n",
" x_w = e.max(axis=1)\n",
" y_h = d.max(axis=0) - d.min(axis=0)\n",
"\n",
" x_delta = x_w.mean() * space\n",
" y_delta = y_h.mean() * space\n",
" \n",
" x_r = (x_w + x_delta).cumsum()\n",
" x_m = np.convolve(x_r, [0.5, 0.5], 'same')\n",
" \n",
" y_u = (y_h + y_delta).cumsum()\n",
" y_m = y_u - np.maximum(d, 0).max(axis=0) - y_delta / 2\n",
" \n",
" xs, ys = np.meshgrid(x_m, y_m)\n",
"\n",
" ax = plt.gca()\n",
" \n",
" ax.set_xlim(0, x_w.sum() + x.shape[0] * x_delta)\n",
" ax.set_ylim(0, y_h.sum() + x.shape[1] * y_delta)\n",
" \n",
" ax.set_xticks(x_m)\n",
" ax.set_xticklabels(rownames)\n",
" \n",
" ax.set_yticks(y_m)\n",
" ax.set_yticklabels(colnames)\n",
" ax.grid(True, axis='y')\n",
" \n",
" for x, w, y, h in zip(xs.flatten(), e.T.flatten(), ys.flatten(), d.T.flatten()):\n",
" color = col[int(h < 0)]\n",
" ax.add_patch(plt.Rectangle((x - w / 2, y), w, h, color=color, alpha=0.6))"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"df = pd.DataFrame(\n",
" [[ 68, 20, 15, 5],\n",
" [119, 84, 54, 29],\n",
" [ 26, 17, 14, 14],\n",
" [ 7, 94, 10, 16]],\n",
" index=['Black', 'Brown', 'Red', 'Blond'],\n",
" columns=['Brown', 'Blue', 'Hazel', 'Green'])"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Brown</th>\n",
" <th>Blue</th>\n",
" <th>Hazel</th>\n",
" <th>Green</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Black</th>\n",
" <td>68</td>\n",
" <td>20</td>\n",
" <td>15</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Brown</th>\n",
" <td>119</td>\n",
" <td>84</td>\n",
" <td>54</td>\n",
" <td>29</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Red</th>\n",
" <td>26</td>\n",
" <td>17</td>\n",
" <td>14</td>\n",
" <td>14</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Blond</th>\n",
" <td>7</td>\n",
" <td>94</td>\n",
" <td>10</td>\n",
" <td>16</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Brown Blue Hazel Green\n",
"Black 68 20 15 5\n",
"Brown 119 84 54 29\n",
"Red 26 17 14 14\n",
"Blond 7 94 10 16"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x432 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(8, 6))\n",
"plt.title('Relation between hair and eye color')\n",
"plt.xlabel('Hair')\n",
"plt.ylabel('Eye')\n",
"assocplot(df.values, df.index, df.columns)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernel_info": {
"name": "python3"
},
"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.4"
},
"nteract": {
"version": "0.15.0"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment