"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Copyright (c) 2017-2018 Spotify AB\n",
"#\n",
"# Licensed under the Apache License, Version 2.0 (the \"License\");\n",
"# you may not use this file except in compliance with the License.\n",
"# You may obtain a copy of the License at\n",
"#\n",
"# http://www.apache.org/licenses/LICENSE-2.0\n",
"#\n",
"# Unless required by applicable law or agreed to in writing, software\n",
"# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
"# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
"# See the License for the specific language governing permissions and\n",
"# limitations under the License.\n",
"import chartify\n",
"import pandas as pd\n",
"\n",
"def print_public_methods(obj):\n",
" print('Methods:')\n",
" print('\\n'.join([x for x in dir(obj) if not x.startswith('_')]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Chart object\n",
"- Run the cell below to instantiate a chart and assign to a variable"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ch = chartify.Chart()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- Use .show() to render the chart."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ch.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- Note that the chart is blank at this point.\n",
"- The default labels provide directions for how to override their values."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Adding chart labels\n",
"- __Your turn__: Add labels to the following chart. Look at the default values for instruction.\n",
"- Title\n",
"- Subtitle\n",
"- Source\n",
"- X label\n",
"- Y label"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ch = chartify.Chart()\n",
"# Add code here to overwrite the labels\n",
"\n",
"\n",
"ch.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Getting help\n",
"- From within a jupyter notebook you can see the available attributes of the chart object by pressing \"tab\"\n",
"- Select the space just after the \".\" character below and hit tab."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ch = chartify.Chart()\n",
"ch."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- You can also use \"?\" to pull up documentation for objects and methods.\n",
"- Run the cell below to pull up the chartify.Chart documentation"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"chartify.Chart?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- This can also be accomplished by pressing \"shift + tab\".\n",
"- Press \"shift + tab\" twice to see the expanded documentation.\n",
"- Try it with the next cell."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"chartify.Chart"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Callouts\n",
"- The chart object has a callout object (ch.callout) that contains methods for adding callouts to the chart.\n",
"- Callouts can be used to add text, lines, or shaded areas to annotate parts of your chart.\n",
"- __Your Turn:__ Fill in the code below to add a text callout that says \"hi\" at coordinate (10, 10)\n",
"- Look up the documentation for ch.callout.text if you need help"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ch = chartify.Chart()\n",
"ch.callout.text(# Fill in the code here)\n",
" \n",
"ch.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- Use tab below to see what callouts are available."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ch.callout."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- You should see this list of callouts:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# List of available callouts:\n",
"print_public_methods(ch.callout)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Axes\n",
"- The axes object contains methods for setting or getting axis properties."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Avaiable axes methods:\n",
"print_public_methods(ch.axes)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- __Your turn__: modify the chart below so the xaxis range goes from 0 to 100"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ch = chartify.Chart()\n",
"ch.callout.text('hi', 10, 10)\n",
"# Add code here to modify the xrange to (0, 100)\n",
"ch.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Method chaining\n",
"- Chart methods can be chained by wrapping the statments in parentheses. See the example below:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"(chartify.Chart(blank_labels=True)\n",
" .callout.text('hi', 10, 10)\n",
" .axes.set_xaxis_range(0, 100)\n",
" .show()\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Plotting"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Input data format\n",
"Chartify expects the input data to be:\n",
"- Tidy (Each variable has its own column, each row corresponds to an observation)\n",
"- In the columns of a Pandas DataFrame.\n",
"\n",
"Below we'll explore some examples of valid and invalid input data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- Run this cell to generate an example dataset"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data = chartify.examples.example_data()\n",
"data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pivoted data: INVALID\n",
"- Pivoted data is not Tidy (note the `country` dimension has an observation in each column)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pivoted_data = pd.pivot_table(data, columns='country', values='quantity', index='fruit', aggfunc='sum')\n",
"pivoted_data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Melting pivoted data: VALID\n",
"- You can use pandas.melt to convert pivoted data into the tidy data format.\n",
"- The output of SQL queries with `groupby` produces output in tidy format."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"value_columns = pivoted_data.columns\n",
"\n",
"melted_data = pd.melt(pivoted_data.reset_index(), # Need to reset the index to put \"fruit\" into a column.\n",
" id_vars='fruit',\n",
" value_vars=value_columns)\n",
"melted_data.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pandas series: INVALID\n",
"- Data in a pandas Series must be converted to a DataFrame for use with Chartify."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data.groupby(['country'])['quantity'].sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pandas index: INVALID\n",
"- The output below is a pandas DataFrame, but the country dimension is in the Index."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data.groupby(['country'])[['quantity']].sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pandas DataFrame: VALID\n",
"- The code below produces a valid pandas DataFrame for use with Chartify.\n",
"- Notice how the country dimension is now in a column."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"chart_data = data.groupby(['country'])['quantity'].sum().reset_index()\n",
"chart_data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Axis types\n",
"- Specify the x_axis_type and y_axis_type parameters when instantiating the chart object.\n",
"- Both are set to `linear` by default.\n",
"- Look at the chart object documentation to see the list of available options for x_axis_type and y_axis_type"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"chartify.Chart?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- __The Chart axis types influence the plots that are available__\n",
"- Look at how the plot methods change based on the axis types:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ch = chartify.Chart(x_axis_type='datetime',\n",
" y_axis_type='linear')\n",
"# List of available callouts:\n",
"print_public_methods(ch.plot)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ch = chartify.Chart(x_axis_type='categorical',\n",
" y_axis_type='linear')\n",
"# List of available plots:\n",
"print_public_methods(ch.plot)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- __Your turn__: Create a chart with 'density' y and 'linear' x axis types. What type of plots are available?"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ch = chartify.Chart(# Your code goes here)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Vertical Bar plot\n",
"- __Your turn__: Create a bar plot based on the dataframe below."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"bar_data = (data.groupby('country')[['quantity']].sum()\n",
" .reset_index()\n",
" )\n",
"bar_data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Implement the bar plot here.\n",
"# Set the appropriate x_axis_type otherwise the bar method won't be available.\n",
"# Look at the bar documentation to figure out how to pass in the parameters.\n",
"# If you get stuck move on to the next section for hints.\n",
"ch = chartify.Chart(# Your code goes here)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Examples\n",
"- Chartify includes many examples. They're a good starting point if you're trying to create a chart that you're unfamiliar with."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# List of available examples\n",
"print_public_methods(chartify.examples)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- Run the appropriate method to see examples and the corresponding code that generates the example."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"chartify.examples.plot_bar()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Bar plot - Horizontal vs. Vertical\n",
"- Copy your bar plot here, but make it horizantal instead of vertical. Look to the example above if you get stuck."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Grouped bar plot\n",
"- __Your Turn__: Create a grouped bar plot with the data below."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"grouped_bar_data = (data.groupby(['country', 'fruit'])[['quantity']].sum()\n",
" .reset_index()\n",
" )\n",
"grouped_bar_data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Implement the grouped bar plot here.\n",
"# Look at the example for help if you get stuck.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# show('html') vs. show('png')\n",
"- Chartify charts can be rendered as either \"HTML\" or \"PNG\" (HTML is the default)\n",
"- HTML output:\n",
" - Is faster and good for iteration.\n",
" - Can be saved as an image by screenshotting, or by clicking the icon on the top right.\n",
" - Will _NOT_ show up in Jupyter notebooks when uploaded to GHE.\n",
"- PNG output:\n",
" - Is slower and better for the finished product.\n",
" - Can be copy and pasted directly from the jupyter notebook (Right click on the image)\n",
" - Will show up in Jupyter notebooks when uploaded to GHE.\n",
"- See the difference by running the two cells below"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"(chartify.Chart(blank_labels=True)\n",
".set_title(\"HTML output\")\n",
".set_subtitle(\"Faster, but will not show up in GHE\")\n",
".show()\n",
")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"(chartify.Chart(blank_labels=True)\n",
".set_title(\"PNG output\")\n",
".set_subtitle(\"Slower, but will show up in GHE. Right click to copy + paste.\")\n",
".show('png')\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Color palette types\n",
"- Chartify includes 4 different color palette types: `categorical`, `accent`, `sequential`, `diverging`.\n",
"- Note the differences in the examples below"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"chartify.examples.style_color_palette_categorical()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"chartify.examples.style_color_palette_accent()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"chartify.examples.style_color_palette_diverging()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"chartify.examples.style_color_palette_sequential()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Color palettes\n",
"- Chartify includes a set of pre-defined color palettes:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"chartify.color_palettes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- Use .show() to see the colors associated with each:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"chartify.color_palettes.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- Assign the color palettes with `.set_color_palette`"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ch = chartify.Chart(x_axis_type='categorical',\n",
" blank_labels=True)\n",
"ch.style.set_color_palette('categorical', 'Dark2')\n",
"ch.plot.bar(data_frame=grouped_bar_data,\n",
" categorical_columns=['fruit', 'country'],\n",
" numeric_column='quantity',\n",
" color_column='fruit')\n",
"ch.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- Color palette objects include methods for manipulation. See the examples below:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dark2 = chartify.color_palettes['Dark2']\n",
"dark2.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- Sort"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sorted_dark2 = dark2.sort_by_hue()\n",
"sorted_dark2.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- Expand"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dark2.expand_palette(20).show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- Shift"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"shifted_dark2 = dark2.shift_palette('white', percent=20)\n",
"shifted_dark2.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"- Assign the shifted color palette to a chart:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ch = chartify.Chart(x_axis_type='categorical',\n",
" blank_labels=True)\n",
"ch.style.set_color_palette('categorical', shifted_dark2)\n",
"ch.plot.bar(data_frame=grouped_bar_data,\n",
" categorical_columns=['fruit', 'country'],\n",
" numeric_column='quantity',\n",
" color_column='fruit')\n",
"ch.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Layouts\n",
"- Chartify layouts are tailored toward use in slides.\n",
"- Notice how the output changes for each of the slide layout options below:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"layout_options = ['slide_100%', 'slide_75%', 'slide_50%', 'slide_25%']\n",
"for option in layout_options:\n",
" ch = chartify.Chart(layout=option, blank_labels=True, x_axis_type='categorical')\n",
" ch.set_title('Layout: {}'.format(option))\n",
" ch.plot.bar(data_frame=grouped_bar_data,\n",
" categorical_columns=['fruit', 'country'],\n",
" numeric_column='quantity',\n",
" color_column='fruit')\n",
"\n",
" ch.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Advanced usage with Bokeh\n",
"- Chartify is built on top of another visualization package called [Bokeh](http://bokeh.pydata.org/en/latest/)\n",
"- The example below shows how you can access the Bokeh [figure](https://bokeh.pydata.org/en/latest/docs/reference/plotting.html#bokeh.plotting.figure.Figure) from a Chartify chart object."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ch = chartify.Chart(blank_labels=True, x_axis_type='categorical')\n",
"ch.plot.bar(data_frame=grouped_bar_data,\n",
" categorical_columns=['fruit', 'country'],\n",
" numeric_column='quantity',\n",
" color_column='fruit')\n",
"ch.figure"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- The following example shows how you can modify attributes not exposed in Chartify by accessing the Bokeh figure. See [Bokeh](http://bokeh.pydata.org/en/latest/) documentation for more details."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ch.figure.xaxis.axis_label_text_font_size = '30pt'\n",
"ch.figure.xaxis.axis_label_text_color = 'red'\n",
"ch.figure.height = 400\n",
"ch.axes.set_xaxis_label('A large xaxis label')\n",
"ch.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.8.13"
},
"toc": {
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"toc_cell": true,
"toc_position": {
"height": "608px",
"left": "0px",
"right": "1176px",
"top": "111px",
"width": "212px"
},
"toc_section_display": "block",
"toc_window_display": true
}
},
"nbformat": 4,
"nbformat_minor": 4
}