#!/usr/bin/env python
# coding: utf-8
# #### New to Plotly?
# Plotly's Python library is free and open source! [Get started](https://plotly.com/python/getting-started/) by downloading the client and [reading the primer](https://plotly.com/python/getting-started/).
# You can set up Plotly to work in [online](https://plotly.com/python/getting-started/#initialization-for-online-plotting) or [offline](https://plotly.com/python/getting-started/#initialization-for-offline-plotting) mode, or in [jupyter notebooks](https://plotly.com/python/getting-started/#start-plotting-online).
# We also have a quick-reference [cheatsheet](https://images.plot.ly/plotly-documentation/images/python_cheat_sheet.pdf) (new!) to help you get started!
# #### Version Check
# Note: Animations are available in version 1.12.10+
# Run `pip install plotly --upgrade` to update your Plotly version.
# In[1]:
import plotly
plotly.__version__
# #### Make the Grid
# Our goal is to generate the contours plots of the bivariate normal distributions of mean vector (0,0), standard deviation vector (1,1), and correlation, $\rho$ , varying from `(−1, 1)`. Since we are making an online animation, we must create our grid first and upload it.
# In[2]:
import plotly.plotly as py
from plotly.grid_objs import Grid, Column
import time
import numpy as np
from scipy.stats import multivariate_normal as Nd
colorscale = [
[0.0, 'rgb(25, 23, 10)'],
[0.05, 'rgb(69, 48, 44)'],
[0.1, 'rgb(114, 52, 47)'],
[0.15, 'rgb(155, 58, 49)'],
[0.2, 'rgb(194, 70, 51)'],
[0.25, 'rgb(227, 91, 53)'],
[0.3, 'rgb(250, 120, 56)'],
[0.35, 'rgb(255, 152, 60)'],
[0.4, 'rgb(255, 188, 65)'],
[0.45, 'rgb(236, 220, 72)'],
[0.5, 'rgb(202, 243, 80)'],
[0.55, 'rgb(164, 252, 93)'],
[0.6, 'rgb(123, 245, 119)'],
[0.65, 'rgb(93, 225, 162)'],
[0.7, 'rgb(84, 196, 212)'],
[0.75, 'rgb(99, 168, 238)'],
[0.8, 'rgb(139, 146, 233)'],
[0.85, 'rgb(190, 139, 216)'],
[0.9, 'rgb(231, 152, 213)'],
[0.95, 'rgb(241, 180, 226)'],
[1.0, 'rgb(206, 221, 250)']
]
# returns V=(X,Y)~N(m, Sigma)
def bivariate_N(m=[0., 0.], stdev=[1.0, 1.0], rho=0):
cov = rho*stdev[0] * stdev[1] # covariance(X,Y)
Sigma = np.array([[stdev[0]**2, cov], [cov, stdev[1]**2]]) # covariance matrix
return Nd(mean=m, cov=Sigma) # joint distribution of (X,Y), of mean vector, m, and cov matrix, Sigma
# returns the pdf of the bivariate normal distribution
def pdf_bivariate_N(m, stdev, V):
X = np.linspace(m[0] - 3*stdev[0], m[0] + 3*stdev[0], 100)
Y = np.linspace(m[1] - 3*stdev[1], m[1] + 3*stdev[1], 100)
x, y = np.meshgrid(X, Y)
pos = np.empty(x.shape + (2, ))
pos[:, :, 0] = x; pos[:, :, 1] = y
z = V.pdf(pos)
return X, Y, z
correls=[-0.95, -0.85, -0.75, -0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.75, 0.85, 0.95]
m=[0., 0.]
stdev=[1., 1.]
V=bivariate_N()
x, y=pdf_bivariate_N(m, stdev, V)[:2]
my_columns=[Column(x, 'x'), Column(y, 'y')]
zvmax=[]
for k, rho in enumerate(correls):
V = bivariate_N(rho = rho)
z = pdf_bivariate_N(m, stdev, V)[2]
zvmax.append(np.max(z))
my_columns.append(Column(z, 'z{}'.format(k + 1)))
grid = Grid(my_columns)
py.grid_ops.upload(grid, 'norm-bivariate1'+str(time.time()), auto_open=False)
# #### Make the Figure
# Make the `Figure` which references columns from the grid we made. The `Figure` takes `Data`, `Layout` and `Frames`.
# In[3]:
data=[dict(type='heatmap',
xsrc=grid.get_column_reference('x'),
ysrc=grid.get_column_reference('y'),
zsrc=grid.get_column_reference('z1'),
zmin=0,
zmax=zvmax[6],
zsmooth='best',
colorscale=colorscale,
colorbar=dict(thickness=20, ticklen=4))]
title='Contour plot for bivariate normal distribution'+\
' N(m=[0,0], sigma=[1,1], rho in (-1, 1))'
layout = dict(title=title,
autosize=False,
height=600,
width=600,
hovermode='closest',
xaxis=dict(range=[-3, 3], autorange=False),
yaxis=dict(range=[-3, 3], autorange=False),
showlegend=False,
updatemenus=[dict(type='buttons', showactive=False,
y=1, x=-0.05, xanchor='right',
yanchor='top', pad=dict(t=0, r=10),
buttons=[dict(label='Play',
method='animate',
args=[None,
dict(frame=dict(duration=100,
redraw=True),
transition=dict(duration=0),
fromcurrent=True,
mode='immediate')])])])
frames=[dict(data=[dict(zsrc=grid.get_column_reference('z{}'.format(k + 1)),
zmax=zvmax[k])],
traces=[0],
name='frame{}'.format(k),
) for k in range(len(correls))]
fig=dict(data=data, layout=layout, frames=frames)
py.icreate_animations(fig, filename='animheatmap'+str(time.time()))
# #### Reference
# For additional information and attributes for creating heatmaps in Plotly see: https://plotly.com/python/reference/#heatmap.
# For more documentation on creating animations with Plotly, see https://plotly.com/python/#animations.
# In[2]:
from IPython.display import display, HTML
display(HTML(''))
display(HTML(''))
get_ipython().system('pip install git+https://github.com/plotly/publisher.git --upgrade')
import publisher
publisher.publish(
'heatmap.ipynb', 'python/heatmap-animation/', 'Heatmap Animation | plotly',
'How to make an animated heatmap in Python.',
title='Heatmap Animation | plotly',
name='Heatmap Animation',
language='python',
page_type='example_index', has_thumbnail='true', thumbnail='thumbnail/heatmap_animation.gif',
ipynb= '~notebook_demo/131',
display_as='animations', order=4)
# In[ ]: