From 188ace033e35697981a8e6ebc127f2ac23840835 Mon Sep 17 00:00:00 2001 From: kdorr Date: Wed, 15 Aug 2018 16:16:56 -0500 Subject: [PATCH 1/3] Add altair to mpl bar --- _posts/altair-to-mpl-bar.md | 90 ++++++++++++++++++++++++++++ _posts/pics/altair-to-mpl-bar_0.png | Bin 0 -> 6795 bytes _posts/pics/altair-to-mpl-bar_1.png | Bin 0 -> 6071 bytes 3 files changed, 90 insertions(+) create mode 100644 _posts/altair-to-mpl-bar.md create mode 100644 _posts/pics/altair-to-mpl-bar_0.png create mode 100644 _posts/pics/altair-to-mpl-bar_1.png diff --git a/_posts/altair-to-mpl-bar.md b/_posts/altair-to-mpl-bar.md new file mode 100644 index 0000000..7b1059d --- /dev/null +++ b/_posts/altair-to-mpl-bar.md @@ -0,0 +1,90 @@ +--- +layout: post +title: "Making a Bar Chart" +date: 2018-08-15 16:00:00 -0500 +author: "Kimberly Orr and Nabarun Pal" +categories: user-guide +tags: "intro about bar" +excerpt_separator: +--- + +# Making a Bar Chart +At the time of writing, mpl-altair does not support bar charts, so this post will show how to create a bar chart in Altair, Matplotlib, and how mpl-altair _should_ implement bar chart conversion in the future. + +We'll work with the following long-form DataFrame for this example: +```python +import pandas as pd +df = pd.DataFrame({ + 'group': ['1', '1', '2', '2', '3', '3', '4', '4', '5', '5'], + 'variable': ['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b'], + 'scores': [20, 25, 35, 32, 30, 34, 35, 20, 27, 25] +}) +``` + +## Altair +For this dataset, specifying the color will automatically stack the bar charts. +```python +import altair as alt +alt.Chart(df).mark_bar().encode( + x='group', + y='scores', + color='variable' +) +``` +![png](pics/altair-to-mpl-bar_0.png) + +## Matplotlib +This is a little more complicated in Matplotlib. Since Matplotlib is procedural, we have to manually tell Matplotlib to stack the bars. Also notice that we are calling a new function now (`ax.bar()`) to get a bar plot. + +To stack the bars, we have to create new subset dataframes and then plot each one separately (specifying that bottom of one plot should be the top of another `bottom=a_scores`). One way to do this is to subset via indexing (option 1). Another way to do this is to use the `df.groupby()` function (option 2). +```python +import matplotlib.pyplot as plt +``` +```python +# Option 1 +fig, ax = plt.subplots() +groups = df['group'].unique() +a_scores = df[df['variable']=='a']['scores'] +b_scores = df[df['variable']=='b']['scores'] +ax.bar(groups, a_scores, label='a') +ax.bar(groups, b_scores, bottom=a_scores, label='b') +ax.set_xlabel('groups') +ax.set_ylabel('scores') +ax.legend() +plt.grid() +plt.show() +``` +```python +# Option 2 +fig, ax = plt.subplots() + +(_, a), (_, b) = df.groupby('variable') +ax.bar(a['group'], a['scores'], label='a') +ax.bar(b['group'], b['scores'], bottom=a['scores'], label='b') +ax.set_xlabel('groups') +ax.set_ylabel('scores') +ax.legend() +plt.grid() +plt.show() +``` +Both produce: + +![png](pics/altair-to-mpl-bar_1.png) + + +## mpl-altair +At the time of writing, mpl-altair doesn't support bar charts. + +If mpl-altair supported bar charts, this is how an Altair chart would get rendered in mpl-altair: +```python +import altair as alt +import matplotlib.pyplot as plt +import mplaltair +chart = alt.Chart(df).mark_bar().encode( + x='group', + y='scores', + color='variable' +) +fig, ax = mplaltair.convert(chart) +plt.show() +``` \ No newline at end of file diff --git a/_posts/pics/altair-to-mpl-bar_0.png b/_posts/pics/altair-to-mpl-bar_0.png new file mode 100644 index 0000000000000000000000000000000000000000..ff906dbfa5c004a2c4d5c255241534f3e1f27059 GIT binary patch literal 6795 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 XAdQ~5^c;A}1cF-Fovl4{CFS1$6U;Z! literal 0 HcmV?d00001 diff --git a/_posts/pics/altair-to-mpl-bar_1.png b/_posts/pics/altair-to-mpl-bar_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e36e7b3fcc399510197197c1c31998d774e40f50 GIT binary patch literal 6071 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 literal 0 HcmV?d00001 From 78b028d04b79833904b0f12b8277966e561d57d0 Mon Sep 17 00:00:00 2001 From: korr Date: Mon, 20 Aug 2018 18:45:48 -0500 Subject: [PATCH 2/3] Matplotlib fixes --- _posts/altair-to-mpl-bar.md | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/_posts/altair-to-mpl-bar.md b/_posts/altair-to-mpl-bar.md index 7b1059d..065a8ad 100644 --- a/_posts/altair-to-mpl-bar.md +++ b/_posts/altair-to-mpl-bar.md @@ -2,7 +2,7 @@ layout: post title: "Making a Bar Chart" date: 2018-08-15 16:00:00 -0500 -author: "Kimberly Orr and Nabarun Pal" +author: "Kimberly Orr", "Nabarun Pal" categories: user-guide tags: "intro about bar" excerpt_separator: @@ -36,31 +36,21 @@ alt.Chart(df).mark_bar().encode( ## Matplotlib This is a little more complicated in Matplotlib. Since Matplotlib is procedural, we have to manually tell Matplotlib to stack the bars. Also notice that we are calling a new function now (`ax.bar()`) to get a bar plot. -To stack the bars, we have to create new subset dataframes and then plot each one separately (specifying that bottom of one plot should be the top of another `bottom=a_scores`). One way to do this is to subset via indexing (option 1). Another way to do this is to use the `df.groupby()` function (option 2). +To stack group b on top of group a, we have to use the `bottom` kwarg to tell Matplotlib where we want the bottom of each bar to be. A clean way to do this is to create an array that keeps track of the bottoms of the bars. + +So, in this example, we first plot group a with bottom initialized to zeros (so that each bar starts at zero). After we plot group b, we update bottom to contain group a's scores. Then, we plot group b with the updated bottom array. + ```python import matplotlib.pyplot as plt ``` ```python -# Option 1 -fig, ax = plt.subplots() -groups = df['group'].unique() -a_scores = df[df['variable']=='a']['scores'] -b_scores = df[df['variable']=='b']['scores'] -ax.bar(groups, a_scores, label='a') -ax.bar(groups, b_scores, bottom=a_scores, label='b') -ax.set_xlabel('groups') -ax.set_ylabel('scores') -ax.legend() -plt.grid() -plt.show() -``` -```python -# Option 2 fig, ax = plt.subplots() -(_, a), (_, b) = df.groupby('variable') -ax.bar(a['group'], a['scores'], label='a') -ax.bar(b['group'], b['scores'], bottom=a['scores'], label='b') +bottom = np.zeros(len(df['group'].unique())) # initialize to zeros so the bottom of group a is zero +for label, scores in df.groupby('variable'): + ax.bar(scores['group'], scores['scores'], bottom=bottom, label=label) + bottom += scores['scores'] # set bottom to be the top of the current group + ax.set_xlabel('groups') ax.set_ylabel('scores') ax.legend() From 5ea18cd38a9d80a534160b4a186d8321c54b8094 Mon Sep 17 00:00:00 2001 From: korr Date: Mon, 20 Aug 2018 18:47:09 -0500 Subject: [PATCH 3/3] Update file name to follow Jekyll convention --- _posts/{altair-to-mpl-bar.md => 2018-08-15-altair-to-mpl-bar.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename _posts/{altair-to-mpl-bar.md => 2018-08-15-altair-to-mpl-bar.md} (100%) diff --git a/_posts/altair-to-mpl-bar.md b/_posts/2018-08-15-altair-to-mpl-bar.md similarity index 100% rename from _posts/altair-to-mpl-bar.md rename to _posts/2018-08-15-altair-to-mpl-bar.md