[PYTHON] Graphiques élevés dans le notebook Jupyter

Qu'est-ce que Highcharts

Une bibliothèque de visualisation qui s'exécute sur Javascript. Il a les fonctions / caractéristiques suivantes.

C'est très sophistiqué, mais il y a des frais pour une utilisation commerciale.

Pourquoi Highcharts?

beau

Comme vous pouvez le voir sur l'exemple sur le Site officiel, vous pouvez dessiner un graphique beau et cool sans aucune ingéniosité.

Lumière

C'est explosif. À titre d'exemple, dessinons un diagramme de dispersion dans lequel 1000 points, comme indiqué ci-dessous, sont codés par couleur en 7 groupes.

import numpy as np
import pandas as pd

num = 1000
x, y = np.random.random((2, num))
labels = np.random.choice(['a', 'b', 'c', 'e', 'f', 'g', 'h'], num)
df = pd.DataFrame(dict(x=x, y=y, label=labels))

Comparons-le avec les trois bibliothèques typiques suivantes.

  1. Matplotlib
  2. Bokeh
  3. Plotly

Matplotlib

import matplotlib.pyplot as plt
groups = df.groupby('label')
colors = 'bgrcmyk'
for i, (name, group) in enumerate(groups):
    plt.scatter(group.x, group.y, color=colors[i])

Bokeh

from bokeh.charts import Scatter, output_notebook, show
output_notebook()
show(Scatter(x='x', y='y', color='label', data=df))

Plotly

from plotly.offline import init_notebook_mode, iplot
init_notebook_mode()
groups = df.groupby('label')
data = [{'x': group.x, 'y': group.y, 'mode': 'markers', 'name': name} for name, group in groups]
fig = {'data': data}
iplot(fig)

Highcharts

from highcharts import Highchart

groups = df.groupby('label')
options = {
    'chart': {
        'type': 'scatter',
    },
}
H = Highchart()
H.set_dict_options(options)
for name, group in groups:
    data = list(zip(group.x, group.y))
    H.add_data_set(data, 'scatter', name)
H

Le résultat ressemble à ceci.

Y compris l'importation (initialisation)

benchmark01.png

import (initialisation) non inclus

benchmark02.png

Il y a plusieurs raisons possibles, mais c'est léger.

%% html implémenté avec magie

Highcharts est une bibliothèque JavaScript, vous devrez donc faire quelques astuces pour l'utiliser avec votre notebook Jupyter. Il existe un moyen d'utiliser un moteur de template, etc., mais à titre d'exemple simple, utilisons %% html magic.

from IPython.display import HTML
%%html
    <script src="http://code.highcharts.com/highcharts.js"></script>
    <script src="http://code.highcharts.com/modules/exporting.js"></script>
    <div id="container" style="width:300px; height:200px;"></div>
    <script>
        plot = function () { 
            $('#container').highcharts({
                chart: {
                    type: 'line'
                },
                series: [{
                    data: [1, 2, 3]
                }]
            });
        };
        plot();
    </script>

htmlmagic.png

Implémenté avec python-highchart

Dans la magie %% html mentionnée ci-dessus, vous n'écrivez que du JavaScript, pas du Python. De plus, lorsque vous souhaitez gérer des variables, vous devez utiliser un moteur de modèle, etc., ce qui est gênant.

Alors, utilisons python-highcharts, qui peut appeler Highcharts depuis Python.

Installation

Vous pouvez l'installer avec pip.

pip install python-highcharts

Graphique linéaire

Si vous implémentez le même graphe linéaire implémenté par %% html magic comme décrit ci-dessus avec python-highcharts, ce sera comme suit.

from highcharts import Highchart

H = Highchart(width=300, height=200)
H.add_data_set([1, 2, 3])
H

C'est très propre et peut maintenant être écrit en Python.

Options de graphique

Pour l'apparence du graphique, passez une valeur de type dictionnaire à highcharts.Highchart.set_options (). Consultez la référence Highcharts (http://api.highcharts.com/highcharts) pour connaître les valeurs possibles.

from highcharts import Highchart

H = Highchart(width=300, height=200)
options = {
    'title': {
        'text': 'Titre principal'
    },
    'subtitle': {
        'text': 'Sous-titre'
    },
    'xAxis': {
        'title': {'text': 'Axe X'}
    },
    'yAxis': {
        'title': {'text': 'Axe Y'},
        'lineWidth': 2
    },
}
H.set_dict_options(options)
H.add_data_set([1, 2, 3])
H

options.png

Il est également possible de régler pour chaque paramètre individuel. Cela peut être plus lisible.

from highcharts import Highchart

H = Highchart(width=300, height=200)
H.set_options('title', {'text': 'Titre principal'})
H.set_options('subtitle', {'text': 'Sous-titre'})
H.set_options('xAxis', {'title': {'text': 'Axe X'}})
H.set_options('yAxis', {'title': {'text': 'Axe Y'}, 'lineWidth': 2})
H.add_data_set([1, 2, 3])
H

L'apparence de l'élément est définie avec highcharts.Highchart.add_data_set ().

from highcharts import Highchart

H = Highchart(width=300, height=200)
H.add_data_set([1, 2, 3], dashStyle='ShortDash', color='plum', lineWidth=6)
H

glyph.png

Type de graphique

Spécifiez le type de graphique dans le deuxième argument de highcharts.Highchart.add_data_set (). La spécification de chaque paramètre de position est la suivante.

Paramètres de position objet Moule
1 base de données Liste, taple
2 Type de graphique Chaîne
3 Nom Chaîne

Dans l'exemple ci-dessous, le premier élément génère un graphe plan nommé «data1», et le deuxième élément génère un histogramme nommé «data2».

from highcharts import Highchart

H = Highchart(width=300, height=200)
H.add_data_set([1, 2, 3], 'area', 'data1')
H.add_data_set([4, 5, 6], 'bar', 'data2')
H

bar.png

Explorer

Cliquer sur un élément graphique fera apparaître un autre graphique ... et ainsi de suite.

Passez les données du dictionnaire à chaque élément de highcharts.Highchart.add_data_set (). Définissez la clé du dictionnaire sur drilldown et la valeur sur le nom correspondant à l'exploration.

Pour spécifier l'élément après l'exploration vers le bas, spécifiez les trois arguments du paramètre de position décrit ci-dessus dans highcharts.Highchart.add_drilldown_data_set (). Faites correspondre le troisième nom avec l'élément supérieur.

from highcharts import Highchart

H = Highchart(width=400, height=200)
data = [{
    'y': 1,
    'drilldown': 'a'
}, {
    'y': 2,
    'drilldown': 'b'
}, {
    'y': 3,
    'drilldown': 'c'
}]
H.add_data_set(data, 'column')
H.add_drilldown_data_set([0.3, 0.4, 0.3], 'pie', 'a')
H.add_drilldown_data_set([4, 5, 6], 'line', 'b')
H.add_drilldown_data_set([7, 8, 9], 'area', 'c')
H

drilldown.gif

Bonus (piratage Yakiu)

À titre d'exemple d'utilisation de l'exploration, créons un graphique qui affiche le nombre de victoires de 12 équipes de baseball professionnelles en 2016 sur un graphique à barres, et clique sur chaque élément pour afficher le nombre de victoires du lanceur.

import pandas as pd
from highcharts import Highchart


class Team:
    def __init__(self):
        self.team_names = ['Hawks', 'Fighters', 'Marines', 'Lions',
                           'Buffaloes', 'Eagles', 'Swallows', 'Giants',
                           'Tigers', 'Carp', 'Dragons', 'BayStars']
        self.urls = [self.make_url(x) for x in self.team_names]
        self.dfs = [self.load_pitcher_win_data(url) for url in self.urls]
        self.wins = [df['win'].sum() for df in self.dfs]
        self.team_data = [
            self.make_y_dict(team_name, wins)
            for team_name, wins in zip(self.team_names, self.wins)
        ]
        self.pitcher_data = [df.values.tolist() for df in self.dfs]

    def make_url(self, team_name):
        def join_url(x):
            return ''.join(('http://npb.jp/bis/2016/stats/idp1_', x, '.html'))

        if team_name == 'Buffaloes':
            return join_url('bs')
        elif team_name == 'BayStars':
            return join_url('db')
        else:
            return join_url(team_name[0].lower())

    def load_pitcher_win_data(self, url):
        tables = pd.read_html(url)
        df = tables[0].iloc[2:, [1, 3]]
        df.columns = ['pitcher', 'win']
        df['win'] = df['win'].astype(float)
        return df[df['win'] > 0]

    def make_y_dict(self, team_name, wins):
        return {'name': team_name, 'y': wins, 'drilldown': team_name}

t = Team()

options = {
    'chart': {
        'type': 'column'
    },
    'title': {
        'text': 'Nombre de victoires en 2016'
    },
    'subtitle': {
        'text': 'Click the columns to view pitchers.'
    },
    'xAxis': {
        'type': 'category'
    },
    'yAxis': {
        'title': {
            'text': 'win'
        }
    },
    'legend': {
        'enabled': False
    },
    'plotOptions': {
        'series': {
            'borderWidth': 0,
            'dataLabels': {
                'enabled': True,
            }
        }
    },
    'tooltip': {
        'headerFormat':
        '<span style="font-size:11px">{series.name}</span><br>',
    },
}


H = Highchart(width=850, height=400)
H.set_dict_options(options)
H.add_data_set(t.team_data, 'column', "Team", colorByPoint=True)
for i, team_name in enumerate(t.team_names):
    H.add_drilldown_data_set(
        t.pitcher_data[i], 'column', team_name, name=team_name)
H

baseball.gif

Implémenté avec pandas-highcharts

Installation

Vous pouvez l'installer avec pip.

pip install pandas-highcharts

Comme son nom l'indique, il dessine des pandas DataFrames avec Highcharts. Vous pouvez générer un graphique simplement en passant les mêmes arguments que pandas.DataFrame.plot () to pandas_highcharts.display.display_charts.

import pandas as pd
from pandas_highcharts.display import display_charts

df = pd.DataFrame([1, 2, 3], index=[list('abc')])
display_charts(df, figsize=(300, 200))

pandas01.png

La spécification du type de graphique est identique à celle des pandas.

import pandas as pd
from pandas_highcharts.display import display_charts

df = pd.DataFrame([1, 2, 3], index=[list('abc')])
display_charts(df, kind='bar', figsize=(300, 200))

pandas02.png

En termes de fonctionnalités, python-highcharts est plus abondant, mais si vous souhaitez visualiser les données des pandas, c'est plus facile.

Recommended Posts

Graphiques élevés dans le notebook Jupyter
Afficher le PDF sur Jupyter Notebook
Exécutez Jupyter Notebook sous Windows
Formatage avec autopep8 sur le notebook Jupyter
Essayez d'exécuter Jupyter Notebook sur Mac
Écrivez des graphiques en temps réel avec Matplotlib sur le notebook Jupyter
Mémo Jupyter Notebook
Présentation de Jupyter Notebook
Faire de Jupyter Notebook un service sur CentOS
Essayez SVM avec scikit-learn sur Jupyter Notebook
Puissant ordinateur portable Jupyter
Démarrez le notebook jupyter sur le serveur GPU (serveur distant)
Golang avec Jupyter
Cloner le référentiel github sur le notebook Jupyter
Jupyter sur AWS
Vérification du GPU du PC sur le notebook Jupyter
Afficher l'histogramme / diagramme de dispersion sur Jupyter Notebook
Construire un notebook jupyter sur un serveur distant (CentOS)
Mot de passe du notebook Jupyter
Utiliser les raccourcis clavier vim dans Jupyter Notebook lancé avec Docker
Mémo Jupyter Notebook
Exécuter le notebook Jupyter sur un serveur distant
Installer matplotlib et afficher le graphique dans Jupyter Notebook
[Jupyter Notebook / Lab] Trois méthodes de débogage sur Jupyter [Pdb]
[Pythonocc] J'ai essayé d'utiliser la CAO sur un notebook Jupyter
Affichage simple du graphique linéaire sur Jupyter Notebook
Essayez Apache Spark avec Jupyter Notebook (sur Docker local
Notebook Jupyter ouvert à distance lancé sur le serveur
jupyter notebook ne commence pas par fish sur mac
Bonjour X3DOM sur Jupyter
Démarrer Jupyter Notebook
3 astuces du notebook Jupyter (Python)
[Cloud103] # 3 Jupyter Notebook à nouveau
Exécutez Tensorflow à partir de Jupyter Notebook sur Bash sur Ubuntu sous Windows
Surveiller le modèle d'entraînement avec TensorBord sur Jupyter Notebook
Essayez les opérations de base sur Pandas DataFrame sur Jupyter Notebook
Approvisionnement EC2 avec Vagrant + Jupyter (IPython Notebook) sur Docker
[Windows] [Python3] Installer python3 et Jupyter Notebook (anciennement ipython notebook) sous Windows
Comment afficher la barre de progression sur Jupyter Notebook pour voir la progression
Installez octave_kernel sur Jupyter [note supplémentaire]
Touche de raccourci pour le bloc-notes Jupyter
Exécutez Jupyter sur Ubuntu sous Windows
Introduction de Jupyter Notebook dans CentOS7
Utilisation de Graphviz avec Jupyter Notebook
[Mémo] Afficher Jupyter Notebook sur PC dans une police de largeur égale (Mac)
Afficher le HTML dans le notebook Jupyter
Utiliser pip avec Jupyter Notebook
Erreur de multitraitement dans Jupyter Notebook
Rechargez en douceur les modules sur Jupyter
Affichage des chaînes sur le notebook IPython
Essayez d'utiliser Jupyter Notebook de manière dynamique
[Super Basics] À propos de Jupyter Notebook
Utiliser Cython avec Jupyter Notebook
homebrew, pyenv, anaconda, Jupyter Notebook
Jouer avec Jupyter Notebook (IPython Notebook)
Étiqueter des images sur Jupyter Lab
[Édition complète] Raccourci vers le bloc-notes Jupyter
Impossible d'afficher le tensorboard dans le notebook Jupyter sur Docker (résolu)
Exécutez IPython Notebook sur Docker
Un moyen très pratique de présenter avec Jupyter Notebook