{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Análise da actividade parlamentar das XIV Legislatura: Dezembro de 2020"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Introdução"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Este bloco de notas é uma actualização ao trabalho inicial que pode ser acedido pelos atalhos acima e que descreve de forma detalhada todas as opções, com visibilidade de todo o código, explicação dos algoritmos utilizados e todo o processo de tratamento e exploração de dados; cobre toda a legistlatura até ao fim de 2020, cobrindo assim a votação do Orçamento de Estado - a versão inicial foi feita antes dessas votações.**\n",
"\n",
"O posicionamento absoluto e relativo dos vários partidos políticos no Parlamento português tem sido motivo de interesse redobrado nos últimos anos. A eleição de deputados de partidos sem anterior presença parlamentar tem alimentado o debate cujas implicações ideológicas foram vísiveis de forma bastante prática na problemática em torno da escolha de lugares: partidos desagradados com o lugar atribuído (“Iniciativa Liberal Descontente Com Lugar Atribuído a Deputado No Parlamento - TSF” 2020), dificuldades gerais em termos de arrumação dos deputados (Renascença 2019), questões de ordem mais ou menos prática em torno de acessos (Almeida 2019), enfim, várias dimensões para uma questão que acaba por revelar a importância simbólica do posicionamento absoluto e relativo de cada partido no hemiciclo.\n",
"\n",
"Esta questão não é particularmente nova (Lourenço 2020), colocando-se em maior ou em menor grau com a entrada de novos partidos e a consequente necessidade de tomada de posição por parte do recém-chegado partido e a harmonização (possível) com os restantes, sendo que a sua posterior actividade parlamentar (nas suas diversas vertentes) poderá ou não alinhar-se com a sua auto-identificação (reflectida ou não nos lugares no hemiciclo).\n",
"\n",
"O ponto de partida para esta análise foi precisamente tentar descobrir se exclusivamente com base na actividade parlamentar, e em concreto no registo de votações, é possível estabelecer relações de proximidade e distância que permitam um agrupamento que não dependa de classificações a priori, e se sim, de que forma estes agrupamentos confirmam ou divergem da percepção existente?\n",
"\n",
"A utilização de dados abertos disponibilizados pelo Parlamento torna esta análise substancialmente mais simples, embora não sem a necessidade de tratamento e validação dos dados; de um ponto de vista prático este bloco de notas demonstra como aceder e transformar os dados de uma forma que pode ser útil para outras análises. No cenário nacional referência para a iniciativa http://hemiciclo.pt que, em linha com iniciativas europeias semelhantes, fornecesse um interface para um maior escrutinio da actividade parlamentar e um conjunto alargado de indicadores directos e indirectos do maior interesse (Sapage 2020). O presente trabalho tem alguns pontos de contacto com esta iniciativa, dentro dos limites que o seu objectivo pedagógico estabelece.\n",
"\n",
"A combinação de dados abertos com um bloco de notas Jupyter permite que o leitor tenha visibilidade dos vários passos e transformações (Randles et al. 2017), o que pode por vezes apresentar uma excessiva complexidade para quem não tenha familiaridade com programação; tentámos obviar esta limitação através da descrição das várias acções de forma a que se possa seguir a lógica e fruir dos resultados. Esta transparência assume uma dimensão adicional tendo em conta a temática que nos proposmos analisar, embora seja importante de forma tranversal (sobre a importância da repetibilidade, rastreabilidade, acesso e o papel de blocos Jupyter no contexto de open science ver, entre outros, exemplos em ecologia (Powers and Hampton 2019) astronomia (Wofford et al. 2019)).\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Metodologia"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Com base nos dados disponibilizados pela Assembleia da República em formato XML [DadosAbertos] são criadas _dataframes_ (tabelas de duas dimensões) com base na selecção de informação relativa aos padrões de votação de cada partido (e/ou deputados não-inscritos).\n",
"\n",
"São fundamentalmente feitas as seguintes análises:\n",
"\n",
"1. Vista geral das votações de cada partido, visualizado através de um _heatmap_\n",
"2. Matriz de distância entre todos os partidos e dendograma\n",
"3. Identificação de grupos (_spectral clustering_) e visualização das distâncias num espaço cartesiano (_multidimensional scaling_)\n",
"\n",
"\n",
"O tratamento prévio dos dados em formato XML é feito de forma a seleccionar as votações de cada partido (ou deputado não inscrito); este processo tem alguma complexidade que se prende com o próprio processo de votação parlamentar, com múltiplas sessões e votações, pelo que foram \n",
"\n",
"De forma acessória são também feitas algumas análises adicionais, já mais removidas do objectivo central de determinação do distânciamento mas que complementam o quadro geral do que é possível."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Obtenção e tratamento dos dados\n",
"\n",
"Esta fase é fundamental para toda a restante análise: é onde obtemos os dados e os transformamos em informação num formato que pode ser facilmente manipulado."
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [],
"source": [
"!pip3 install --user -q itables matplotlib pandas bs4 html5lib lxml seaborn sklearn pixiedust\n",
"\n",
"%matplotlib inline\n",
"\n",
"from itables import show\n",
"import itables.options as opt\n",
"\n",
"opt.maxColumns=100\n",
"opt.maxRows=2000\n",
"opt.lengthMenu = [10, 20, 50, 100, 200, 500]\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Obtenção do ficheiro e conversão para dataframe"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"from urllib.request import urlopen\n",
"import xml.etree.ElementTree as ET\n",
"\n",
"ini_url = 'http://app.parlamento.pt/webutils/docs/doc.xml?path=6148523063446f764c324679626d56304c3239775a57356b595852684c3052685a47397a51574a6c636e52766379394a626d6c6a6157463061585a68637939595356596c4d6a424d5a57647063327868644856795953394a626d6c6a6157463061585a686331684a566935346257773d&fich=IniciativasXIV.xml&Inline=true'\n",
"ini_tree = ET.parse(urlopen(ini_url))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"from bs4 import BeautifulSoup\n",
"import re\n",
"\n",
"## Iteract through the existing dict\n",
"def party_from_votes (votes):\n",
" \"\"\"\n",
" Determines the position of a party based on the majority position by summing all the individual votes.\n",
" Argument is a dictionary returned by parse_voting()\n",
" Returns a dictionary with the majority position of each party\n",
" \"\"\"\n",
" party_vote = {}\n",
" for k, v in votes.items():\n",
" ## Erase the name of the MP and keep the party only\n",
" ## only when it's not from the \"Ninsc\" group - \n",
" ## these need to be differentiated by name\n",
" if re.match(\".*\\(Ninsc\\)\" , k) is None:\n",
" nk = re.sub(r\".*\\((.+?)\\).*\", r\"\\1\", k)\n",
" else:\n",
" nk = k\n",
" ## If it's the first entry for a key, create it\n",
" if nk not in party_vote:\n",
" party_vote[nk] = [0,0,0]\n",
" ## Add to a specific index in a list\n",
" if v == \"A Favor\":\n",
" party_vote[nk][0] += 1\n",
" elif v == \"Abstenção\":\n",
" party_vote[nk][1] += 1\n",
" elif v == \"Contra\":\n",
" party_vote[nk][2] += 1\n",
" for k,v in party_vote.items():\n",
" party_vote[k]=[\"A Favor\", \"Abstenção\", \"Contra\"][v.index(max(v))]\n",
" return party_vote\n",
"\n",
"def parse_voting(v_str):\n",
" \"\"\"Parses the voting details in a string and returns a dict.\n",
" \n",
" Keyword arguments:\n",
" \n",
" v_str: a string with the description of the voting behaviour.\n",
" \"\"\"\n",
" ## Split by the HTML line break and put it in a dict\n",
" d = dict(x.split(':') for x in v_str.split(' '))\n",
" ## Remove the HTML tags\n",
" for k, v in d.items():\n",
" ctext = BeautifulSoup(v, \"lxml\")\n",
" d[k] = ctext.get_text().strip().split(\",\")\n",
" ## Invert the dict to get a 1-to-1 mapping\n",
" ## and trim it\n",
" votes = {}\n",
" if len(v_str) < 1000: # Naive approach but realistically speaking... works well enough.\n",
" for k, v in d.items():\n",
" for p in v:\n",
" if (p != ' ' and # Bypass empty entries\n",
" re.match(\"[0-9]+\", p.strip()) is None and # Bypass quantified divergent voting patterns\n",
" (re.match(\".*\\w +\\(.+\\)\", p.strip()) is None or # Bypass individual votes...\n",
" re.match(\".*\\(Ninsc\\)\" , p.strip()) is not None)): # ... except when coming from \"Ninsc\"\n",
" #print(\"|\"+ p.strip() + \"|\" + \":\\t\" + k)\n",
" votes[p.strip()] = k\n",
" else: # This is a nominal vote since the size of the string is greater than 1000\n",
" for k, v in d.items():\n",
" for p in v:\n",
" if p != ' ':\n",
" votes[p.strip()] = k\n",
" ## Call the auxiliary function to produce the party position based on the majority votes\n",
" votes = party_from_votes(votes)\n",
" return votes"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
".........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................2210\n"
]
}
],
"source": [
"import collections\n",
"\n",
"root = ini_tree\n",
"\n",
"counter=0\n",
"\n",
"## We will build a dataframe from a list of dicts\n",
"## Inspired by the approach of Chris Moffitt here https://pbpython.com/pandas-list-dict.html\n",
"init_list = []\n",
"\n",
"for voting in ini_tree.findall(\".//pt_gov_ar_objectos_VotacaoOut\"):\n",
" votep = voting.find('./detalhe')\n",
" if votep is not None:\n",
" init_dict = collections.OrderedDict()\n",
" counter +=1 \n",
" init_dict['id'] = voting.find('id').text\n",
" ## Add the \"I\" for Type to mark this as coming from \"Iniciativas\"\n",
" init_dict['Tipo'] = \"I\"\n",
" for c in voting:\n",
" if c.tag == \"detalhe\":\n",
" for party, vote in parse_voting(c.text).items():\n",
" init_dict[party] = vote \n",
" elif c.tag == \"descricao\":\n",
" init_dict[c.tag] = c.text\n",
" elif c.tag == \"ausencias\":\n",
" init_dict[c.tag] = c.find(\"string\").text\n",
" else:\n",
" init_dict[c.tag] = c.text\n",
" init_list.append(init_dict)\n",
" ## Provide progression feedback\n",
" print('.', end='')\n",
" \n",
"print(counter)"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"\n",
"ini_df = pd.DataFrame(init_list)\n",
"#print(ini_df.shape)\n",
"#ini_df.head()\n"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [],
"source": [
"## Copy Livre voting record to new aggregate columns...\n",
"ini_df[\"L/JKM\"] = ini_df[\"L\"]\n",
"## ... and fill the NAs with JKM voting record.\n",
"#ini_df[\"L/JKM\"] = ini_df[\"L/JKM\"].fillna(ini_df[\"Joacine Katar Moreira (Ninsc)\"])\n",
"#ini_df[[\"descricao\",\"L\",\"Joacine Katar Moreira (Ninsc)\",\"L/JKM\"]]"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [],
"source": [
"## Copy PAN voting record to new aggregate columns...\n",
"ini_df[\"PAN/CR\"] = ini_df[\"PAN\"]\n",
"## ... and update/replace with CR voting where it exists\n",
"#ini_df[\"PAN/CR\"].update(ini_df[\"Cristina Rodrigues (Ninsc)\"])\n",
"#ini_df[[\"descricao\",\"PAN\",\"Cristina Rodrigues (Ninsc)\",\"PAN/CR\"]]\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Actividades"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"act_url = 'http://app.parlamento.pt/webutils/docs/doc.xml?path=6148523063446f764c324679626d56304c3239775a57356b595852684c3052685a47397a51574a6c636e52766379394264476c32615752685a47567a4c31684a566955794d45786c5a326c7a6247463064584a684c30463061585a705a47466b5a584e595356597565473173&fich=AtividadesXIV.xml&Inline=true'\n",
"act_tree = ET.parse(urlopen(act_url))"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"............................................................................................................................................................................................................................................................................268\n"
]
}
],
"source": [
"import re\n",
"import collections\n",
"\n",
"root = act_tree\n",
"\n",
"counter=0\n",
"\n",
"## We will build a dataframe from a list of dicts\n",
"## Inspired by the approach of Chris Moffitt here https://pbpython.com/pandas-list-dict.html\n",
"act_list = []\n",
"\n",
"def get_toplevel_desc (vid, tree):\n",
" \"\"\"\n",
" Gets the top-level title from a voting id\n",
" \"\"\"\n",
" for c in tree.find(\".//pt_gov_ar_objectos_VotacaoOut/[id='\"+ vid +\"']/../..\"):\n",
" if c.tag == \"assunto\":\n",
" return c.text\n",
"\n",
"for voting in act_tree.findall(\".//pt_gov_ar_objectos_VotacaoOut\"):\n",
" act_dict = collections.OrderedDict()\n",
" counter +=1\n",
" votep = voting.find('./detalhe')\n",
" if votep is not None:\n",
" act_dict['id'] = voting.find('id').text\n",
" ## Add the \"A\" for Type to mark this as coming from \"Iniciativas\"\n",
" act_dict['Tipo'] = \"A\"\n",
" for c in voting:\n",
" if c.tag == \"id\":\n",
" act_dict['descricao'] = get_toplevel_desc(c.text, act_tree)\n",
" if c.tag == \"detalhe\":\n",
" for party, vote in parse_voting(c.text).items():\n",
" act_dict[party] = vote \n",
" elif c.tag == \"ausencias\":\n",
" act_dict[c.tag] = c.find(\"string\").text\n",
" else:\n",
" act_dict[c.tag] = c.text\n",
" act_list.append(act_dict)\n",
" ## Provide progression feedback\n",
" print('.', end='')\n",
"\n",
"print(counter)"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [],
"source": [
"act_df = pd.DataFrame(act_list)\n",
"#print(act_df.shape)\n",
"\n",
"#act_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [],
"source": [
"## Copy Livre voting record to new aggregate columns...\n",
"act_df[\"L/JKM\"] = act_df[\"L\"]\n",
"## ... and fill the NAs with JKM voting record.\n",
"act_df[\"L/JKM\"] = act_df[\"L/JKM\"].fillna(act_df[\"Joacine Katar Moreira (Ninsc)\"])\n",
"\n",
"## Copy PAN voting record to new aggregate columns...\n",
"act_df[\"PAN/CR\"] = act_df[\"PAN\"]\n",
"## ... and update/replace with CR voting where it exists\n",
"act_df[\"PAN/CR\"].update(act_df[\"Cristina Rodrigues (Ninsc)\"])\n",
"#act_df[[\"descricao\",\"PAN\",\"Cristina Rodrigues (Ninsc)\",\"PAN/CR\"]].head()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"votes = pd.concat([ini_df.drop([\"tipoReuniao\"],axis=1),act_df.drop([\"data\",\"publicacao\"],axis=1)], sort=True)"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [],
"source": [
"votes_hm = votes[['BE', 'PCP', 'PEV', 'L/JKM', 'PS', 'PAN','PSD','IL','CDS-PP', 'CH']]\n",
"#votes_hm.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Mapa térmico"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"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",
"import matplotlib as mpl\n",
"import seaborn as sns\n",
"\n",
"votes_hmn = votes_hm.replace([\"A Favor\", \"Contra\", \"Abstenção\", \"Ausência\"], [1,-1,0,2]).fillna(0)\n",
"\n",
"voting_palette = [\"#FB6962\",\"#FCFC99\",\"#79DE79\", \"black\"]\n",
"\n",
"fig = plt.figure(figsize=(8,8))\n",
"sns.heatmap(votes_hmn,\n",
" square=False,\n",
" yticklabels = False,\n",
" cbar=False,\n",
" cmap=sns.color_palette(voting_palette),\n",
" )\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Quem vota com quem\n",
"\n",
"Com estes dados podemos tentar obter uma resposta mais clara do que o \"mapa térmico\" anterior nos apresenta como sendo semelhanças e diferenças no registo de votação.\n",
"\n",
"Uma das questões que se coloca (e normalmente coloca-se com maior ênfase sempre que há uma votação que é apontada como sendo \"atípica\", com base na percepção geral do que é o comportamente de voto habitual de cada partido) é saber \"quem vota com quem\". Estes dados podem ser obtidos através da identificação, para cada partido, da quantidade de votações onde cada outro votou da mesma forma e criação de uma tabela com os resultados:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Total voting instances: 2457\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
BE
\n",
"
PCP
\n",
"
PEV
\n",
"
L/JKM
\n",
"
PS
\n",
"
PAN
\n",
"
PSD
\n",
"
IL
\n",
"
CDS-PP
\n",
"
CH
\n",
"
\n",
" \n",
" \n",
"
\n",
"
BE
\n",
"
2457
\n",
"
1973
\n",
"
2031
\n",
"
2047
\n",
"
1189
\n",
"
1851
\n",
"
1121
\n",
"
1204
\n",
"
1106
\n",
"
1110
\n",
"
\n",
"
\n",
"
PCP
\n",
"
1973
\n",
"
2457
\n",
"
2326
\n",
"
1819
\n",
"
1157
\n",
"
1577
\n",
"
1093
\n",
"
1176
\n",
"
1100
\n",
"
1093
\n",
"
\n",
"
\n",
"
PEV
\n",
"
2031
\n",
"
2326
\n",
"
2457
\n",
"
1879
\n",
"
1143
\n",
"
1661
\n",
"
1066
\n",
"
1184
\n",
"
1051
\n",
"
1069
\n",
"
\n",
"
\n",
"
L/JKM
\n",
"
2047
\n",
"
1819
\n",
"
1879
\n",
"
2457
\n",
"
1084
\n",
"
1762
\n",
"
1037
\n",
"
1174
\n",
"
1030
\n",
"
1040
\n",
"
\n",
"
\n",
"
PS
\n",
"
1189
\n",
"
1157
\n",
"
1143
\n",
"
1084
\n",
"
2457
\n",
"
1214
\n",
"
1641
\n",
"
1220
\n",
"
1287
\n",
"
912
\n",
"
\n",
"
\n",
"
PAN
\n",
"
1851
\n",
"
1577
\n",
"
1661
\n",
"
1762
\n",
"
1214
\n",
"
2457
\n",
"
1248
\n",
"
1373
\n",
"
1209
\n",
"
1171
\n",
"
\n",
"
\n",
"
PSD
\n",
"
1121
\n",
"
1093
\n",
"
1066
\n",
"
1037
\n",
"
1641
\n",
"
1248
\n",
"
2457
\n",
"
1471
\n",
"
1723
\n",
"
1344
\n",
"
\n",
"
\n",
"
IL
\n",
"
1204
\n",
"
1176
\n",
"
1184
\n",
"
1174
\n",
"
1220
\n",
"
1373
\n",
"
1471
\n",
"
2457
\n",
"
1561
\n",
"
1476
\n",
"
\n",
"
\n",
"
CDS-PP
\n",
"
1106
\n",
"
1100
\n",
"
1051
\n",
"
1030
\n",
"
1287
\n",
"
1209
\n",
"
1723
\n",
"
1561
\n",
"
2457
\n",
"
1525
\n",
"
\n",
"
\n",
"
CH
\n",
"
1110
\n",
"
1093
\n",
"
1069
\n",
"
1040
\n",
"
912
\n",
"
1171
\n",
"
1344
\n",
"
1476
\n",
"
1525
\n",
"
2457
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" BE PCP PEV L/JKM PS PAN PSD IL CDS-PP CH\n",
"BE 2457 1973 2031 2047 1189 1851 1121 1204 1106 1110\n",
"PCP 1973 2457 2326 1819 1157 1577 1093 1176 1100 1093\n",
"PEV 2031 2326 2457 1879 1143 1661 1066 1184 1051 1069\n",
"L/JKM 2047 1819 1879 2457 1084 1762 1037 1174 1030 1040\n",
"PS 1189 1157 1143 1084 2457 1214 1641 1220 1287 912\n",
"PAN 1851 1577 1661 1762 1214 2457 1248 1373 1209 1171\n",
"PSD 1121 1093 1066 1037 1641 1248 2457 1471 1723 1344\n",
"IL 1204 1176 1184 1174 1220 1373 1471 2457 1561 1476\n",
"CDS-PP 1106 1100 1051 1030 1287 1209 1723 1561 2457 1525\n",
"CH 1110 1093 1069 1040 912 1171 1344 1476 1525 2457"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"pv_list = []\n",
"print(\"Total voting instances: \", votes_hm.shape[0])\n",
"\n",
"## Not necessarily the most straightforard way (check .crosstab or .pivot_table, possibly with pandas.melt and/or groupby)\n",
"## but follows the same approach as before in using a list of dicts\n",
"for party in votes_hm.columns:\n",
" pv_dict = collections.OrderedDict()\n",
" for column in votes_hmn:\n",
" pv_dict[column]=votes_hmn[votes_hmn[party] == votes_hmn[column]].shape[0]\n",
" pv_list.append(pv_dict)\n",
"\n",
"pv = pd.DataFrame(pv_list,index=votes_hm.columns)\n",
"pv"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure(figsize=(8,8))\n",
"ax = fig.add_subplot()\n",
"\n",
"sns.heatmap(\n",
" pv,\n",
" cmap=sns.color_palette(\"mako_r\"),\n",
" linewidth=1,\n",
" annot = True,\n",
" square =True,\n",
" fmt=\"d\",\n",
" cbar_kws={\"shrink\": 0.8})\n",
"plt.title('Portuguese Parliament 14th Legislature, identical voting count')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Matriz de distância\n",
"\n",
"Com base nos histórico de votações de cada partido produzimos uma matriz de distâncias entre eles; uma matriz de distâncias é uma matriz quadradra $n\\times n$ (onde _n_ é o número de partidos) e onde a distância entre _p_ e _q_ é o valor de $ d_{pq} $.\n",
"\n",
"$ \n",
"\\begin{equation}\n",
"D= \\begin{bmatrix} d_{11} & d_{12} & \\cdots & d_{1 n} \\\\ d_{21} & d_{22} & \\cdots & d_{2 n} \\\\ \\vdots & \\vdots & \\ddots & \\vdots \\\\ d_{31} & d_{32} & \\cdots & d_{n n} \\end{bmatrix}_{\\ n\\times n} \n",
"\\end{equation}\n",
"$\n",
"\n",
"\n",
"A distância é obtida através da comparação de todas as observações de cada par usando uma determinada métrica de distância, sendo a distância euclideana bastante comum em termos gerais e também dentro de estudos sobre o mesmo domínio temático _(Krilavičius and Žilinskas 2008)_: cada elemento da matriz representa $ d\\left( p,q\\right) = \\sqrt {\\sum _{i=1}^{n} \\left( q_{i}-p_{i}\\right)^2 }$, equivalente, para dois pontos $P,Q $ , à mais genérica distância de Minkowski $ D\\left(P,Q\\right)=\\left(\\sum _{i=1}^{n}|x_{i}-y_{i}|^{p}\\right)^{\\frac {1}{p}} $ para $ p = 1$, mas note-se que a diagonal da matrix irá representar a distância entre um partido e ele próprio, logo $ d_{11} = d_{22} = \\dots = d_{nn} = 0 $.\n",
"\n",
"Na secção [Distâncias e matrizes](Distâncias_e_matrizes) colocámos uma discussão mais detalhada (mas passo-a-passo e destinada a quem não tenha necessariamente presente a matemática utilizada) sobre distâncias, _clustering_ e como são calculdadas, para quem tenha interesse numa compreensão mais quantitativa da matéria.\n",
"\n",
"A conversão de votos em representações númericas pode ser feita de várias formas _(Hix, Noury, and Roland 2006)_; adoptamos a abordagem de Krilavičius & Žilinskas (2008) no já citado trabalho relativo às votações no parlamento lituano por nos parecer apropriada à realidade portuguesa:\n",
"\n",
"* A favor: 1\n",
"* Contra: -1\n",
"* Abstenção: 0\n",
"* Ausência: 0\n",
"\n",
"Este ponto é (mais um) dos que de forma relativamente opaca - pois raramente os detalhes têm a mesma projecção que os resultado finais - podem influenciar os resultados; cremos que em particular a equiparação entre _abstenção_ e _ausência_ merece alguma reflexão: considerámos que uma ausência em determinada votação tem um peso equivalente à abstenção, embora uma de forma passiva e outra activa.\n",
"\n",
"Para obtermos a matriz de distância usamos a função `pdist` e construímos um _dataframe_ que é uma matriz simétrica das distâncias entre os partidos."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
BE
\n",
"
PCP
\n",
"
PEV
\n",
"
L/JKM
\n",
"
PS
\n",
"
PAN
\n",
"
PSD
\n",
"
IL
\n",
"
CDS-PP
\n",
"
CH
\n",
"
\n",
" \n",
" \n",
"
\n",
"
BE
\n",
"
0.000000
\n",
"
29.000000
\n",
"
25.573424
\n",
"
22.693611
\n",
"
63.553127
\n",
"
33.896903
\n",
"
61.343296
\n",
"
52.497619
\n",
"
56.877060
\n",
"
49.386233
\n",
"
\n",
"
\n",
"
PCP
\n",
"
29.000000
\n",
"
0.000000
\n",
"
15.066519
\n",
"
31.112698
\n",
"
60.232881
\n",
"
42.047592
\n",
"
58.189346
\n",
"
52.507142
\n",
"
54.424259
\n",
"
48.249352
\n",
"
\n",
"
\n",
"
PEV
\n",
"
25.573424
\n",
"
15.066519
\n",
"
0.000000
\n",
"
28.231188
\n",
"
61.506097
\n",
"
39.509493
\n",
"
59.640590
\n",
"
52.744668
\n",
"
56.115951
\n",
"
49.183331
\n",
"
\n",
"
\n",
"
L/JKM
\n",
"
22.693611
\n",
"
31.112698
\n",
"
28.231188
\n",
"
0.000000
\n",
"
62.912638
\n",
"
33.555923
\n",
"
60.016664
\n",
"
50.606324
\n",
"
55.731499
\n",
"
48.062459
\n",
"
\n",
"
\n",
"
PS
\n",
"
63.553127
\n",
"
60.232881
\n",
"
61.506097
\n",
"
62.912638
\n",
"
0.000000
\n",
"
62.817195
\n",
"
44.022721
\n",
"
54.506880
\n",
"
50.497525
\n",
"
56.727418
\n",
"
\n",
"
\n",
"
PAN
\n",
"
33.896903
\n",
"
42.047592
\n",
"
39.509493
\n",
"
33.555923
\n",
"
62.817195
\n",
"
0.000000
\n",
"
56.709788
\n",
"
47.191101
\n",
"
52.763624
\n",
"
46.432747
\n",
"
\n",
"
\n",
"
PSD
\n",
"
61.343296
\n",
"
58.189346
\n",
"
59.640590
\n",
"
60.016664
\n",
"
44.022721
\n",
"
56.709788
\n",
"
0.000000
\n",
"
43.943145
\n",
"
34.842503
\n",
"
43.058100
\n",
"
\n",
"
\n",
"
IL
\n",
"
52.497619
\n",
"
52.507142
\n",
"
52.744668
\n",
"
50.606324
\n",
"
54.506880
\n",
"
47.191101
\n",
"
43.943145
\n",
"
0.000000
\n",
"
36.565011
\n",
"
37.054015
\n",
"
\n",
"
\n",
"
CDS-PP
\n",
"
56.877060
\n",
"
54.424259
\n",
"
56.115951
\n",
"
55.731499
\n",
"
50.497525
\n",
"
52.763624
\n",
"
34.842503
\n",
"
36.565011
\n",
"
0.000000
\n",
"
34.263683
\n",
"
\n",
"
\n",
"
CH
\n",
"
49.386233
\n",
"
48.249352
\n",
"
49.183331
\n",
"
48.062459
\n",
"
56.727418
\n",
"
46.432747
\n",
"
43.058100
\n",
"
37.054015
\n",
"
34.263683
\n",
"
0.000000
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" BE PCP PEV L/JKM PS PAN \\\n",
"BE 0.000000 29.000000 25.573424 22.693611 63.553127 33.896903 \n",
"PCP 29.000000 0.000000 15.066519 31.112698 60.232881 42.047592 \n",
"PEV 25.573424 15.066519 0.000000 28.231188 61.506097 39.509493 \n",
"L/JKM 22.693611 31.112698 28.231188 0.000000 62.912638 33.555923 \n",
"PS 63.553127 60.232881 61.506097 62.912638 0.000000 62.817195 \n",
"PAN 33.896903 42.047592 39.509493 33.555923 62.817195 0.000000 \n",
"PSD 61.343296 58.189346 59.640590 60.016664 44.022721 56.709788 \n",
"IL 52.497619 52.507142 52.744668 50.606324 54.506880 47.191101 \n",
"CDS-PP 56.877060 54.424259 56.115951 55.731499 50.497525 52.763624 \n",
"CH 49.386233 48.249352 49.183331 48.062459 56.727418 46.432747 \n",
"\n",
" PSD IL CDS-PP CH \n",
"BE 61.343296 52.497619 56.877060 49.386233 \n",
"PCP 58.189346 52.507142 54.424259 48.249352 \n",
"PEV 59.640590 52.744668 56.115951 49.183331 \n",
"L/JKM 60.016664 50.606324 55.731499 48.062459 \n",
"PS 44.022721 54.506880 50.497525 56.727418 \n",
"PAN 56.709788 47.191101 52.763624 46.432747 \n",
"PSD 0.000000 43.943145 34.842503 43.058100 \n",
"IL 43.943145 0.000000 36.565011 37.054015 \n",
"CDS-PP 34.842503 36.565011 0.000000 34.263683 \n",
"CH 43.058100 37.054015 34.263683 0.000000 "
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from scipy.spatial.distance import squareform\n",
"from scipy.spatial.distance import pdist\n",
"import scipy.spatial as sp, scipy.cluster.hierarchy as hc\n",
"from itables import show\n",
"\n",
"votes_hmn = votes_hm.replace([\"A Favor\", \"Contra\", \"Abstenção\", \"Ausência\"], [1,-1,0,0]).fillna(0)\n",
"\n",
"## Transpose the dataframe used for the heatmap\n",
"votes_t = votes_hmn.transpose()\n",
"\n",
"## Determine the Eucledian pairwise distance\n",
"## (\"euclidean\" is actually the default option)\n",
"pwdist = pdist(votes_t, metric='euclidean')\n",
"\n",
"## Create a square dataframe with the pairwise distances: the distance matrix\n",
"distmat = pd.DataFrame(\n",
" squareform(pwdist), # pass a symmetric distance matrix\n",
" columns = votes_t.index,\n",
" index = votes_t.index\n",
")\n",
"#show(distmat, scrollY=\"200px\", scrollCollapse=True, paging=False)\n",
"\n",
"## Normalise by scaling between 0-1, using dataframe max value to keep the symmetry.\n",
"## This is essentially a cosmetic step to \n",
"#distmat=((distmat-distmat.min().min())/(distmat.max().max()-distmat.min().min()))*1\n",
"distmat"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support. ' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" if (mpl.ratio != 1) {\n",
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
" }\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '');\n",
" var titletext = $(\n",
" '');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var backingStore = this.context.backingStorePixelRatio ||\n",
"\tthis.context.webkitBackingStorePixelRatio ||\n",
"\tthis.context.mozBackingStorePixelRatio ||\n",
"\tthis.context.msBackingStorePixelRatio ||\n",
"\tthis.context.oBackingStorePixelRatio ||\n",
"\tthis.context.backingStorePixelRatio || 1;\n",
"\n",
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband = $('');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width * mpl.ratio);\n",
" canvas.attr('height', height * mpl.ratio);\n",
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('');\n",
"\n",
" var fmt_picker = $('');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('');\n",
" var button = $('');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
""
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support. ' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" if (mpl.ratio != 1) {\n",
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
" }\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '');\n",
" var titletext = $(\n",
" '');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var backingStore = this.context.backingStorePixelRatio ||\n",
"\tthis.context.webkitBackingStorePixelRatio ||\n",
"\tthis.context.mozBackingStorePixelRatio ||\n",
"\tthis.context.msBackingStorePixelRatio ||\n",
"\tthis.context.oBackingStorePixelRatio ||\n",
"\tthis.context.backingStorePixelRatio || 1;\n",
"\n",
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband = $('');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width * mpl.ratio);\n",
" canvas.attr('height', height * mpl.ratio);\n",
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('');\n",
"\n",
" var fmt_picker = $('');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width / mpl.ratio, fig.canvas.height / mpl.ratio);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('');\n",
" var button = $('');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
""
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"## Display the heatmap of the distance matrix\n",
"\n",
"fig = plt.figure(figsize=(8,8))\n",
"ax = fig.add_subplot()\n",
"\n",
"sns.heatmap(\n",
" distmat,\n",
" cmap=sns.color_palette(\"Reds_r\"),\n",
" linewidth=1,\n",
" annot = True,\n",
" square =True,\n",
" cbar_kws={\"shrink\": 0.8})\n",
"plt.title('Portuguese Parliament 14th Legislature, Distance Matrix')\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"