[PYTHON] [Visualisation] Je veux dessiner un beau graphique avec Plotly

c'est

Trace complotement de beaux graphiques avec une petite quantité de code, mais comme je n'ai utilisé que matplotlib et que je ne savais pas grand-chose, c'est un mémorandum de la personne qui a essayé de démarrer en vérifiant.

environnement

Google colaboratory

Installation

S'il s'agit de colab, il n'y a pas d'installation, mais si nécessaire, vous pouvez l'installer avec pip

pip install plotly

Préparation des données

J'ai des données de séries chronologiques qui peuvent être utilisées immédiatement avec seaborn, donc je vais les utiliser. Ce qui suit est la préparation des données, alors ignorez-la

import seaborn as sns
import pandas as pd
from calendar import month_name

month_name_mappings = {name[:3]: n for n, name in enumerate(month_name)}

#Juste la préparation des données
df = sns.load_dataset('flights')
df["month"] = df.month.apply(lambda x: month_name_mappings[x])
df["year-month"] = pd.to_datetime(df.year.astype(str) + "-" + df.month.astype(str))
ts_data = df[["passengers", "year-month"]].set_index("year-month")["passengers"]
ts_data
year-month
1949-01-01    112
1949-02-01    118
1949-03-01    132
1949-04-01    129
1949-05-01    121
             ... 
1960-08-01    606
1960-09-01    508
1960-10-01    461
1960-11-01    390
1960-12-01    432
Name: passengers, Length: 144, dtype: int64

Des données simples sur le nombre de passagers par mois.

opération de base

Créons un graphique

import plotly.graph_objects as go

fig = go.Figure()
fig.show()

image.png

J'ai un graphique, je vais ajouter diverses choses ici.

#Graphique linéaire
fig = go.Figure()
fig.add_trace(go.Scatter(x=ts_data.index, y=ts_data.values, name="passengers"))
fig.show()

image.png

Essayez d'afficher la mémoire en affichage logarithmique

#Graphique linéaire
fig = go.Figure()
fig.add_trace(go.Scatter(x=ts_data.index, y=ts_data.values, name="passengers"))

#Pour personnaliser l'apparence, jouez avec la mise en page
fig.update_layout(yaxis_type="log")
fig.show()

image.png

Je veux dessiner un graphique magnifique

Je veux le rendre plus luxueux, je vais donc essayer de le visualiser de différentes manières

#Pétrir un peu de données
ts_data_monthly = df.groupby("month")["passengers"].apply(list)
ts_sum_yearly = df.groupby("year")["passengers"].sum()
#Je souhaite créer plusieurs graphiques linéaires
ts_data_monthly
month
1     [112, 115, 145, 171, 196, 204, 242, 284, 315, ...
2     [118, 126, 150, 180, 196, 188, 233, 277, 301, ...
3     [132, 141, 178, 193, 236, 235, 267, 317, 356, ...
4     [129, 135, 163, 181, 235, 227, 269, 313, 348, ...
5     [121, 125, 172, 183, 229, 234, 270, 318, 355, ...
6     [135, 149, 178, 218, 243, 264, 315, 374, 422, ...
7     [148, 170, 199, 230, 264, 302, 364, 413, 465, ...
8     [148, 170, 199, 242, 272, 293, 347, 405, 467, ...
9     [136, 158, 184, 209, 237, 259, 312, 355, 404, ...
10    [119, 133, 162, 191, 211, 229, 274, 306, 347, ...
11    [104, 114, 146, 172, 180, 203, 237, 271, 305, ...
12    [118, 140, 166, 194, 201, 229, 278, 306, 336, ...
Name: passengers, dtype: object
#Je veux faire un graphique à barres
ts_sum_yearly
year
1949    1520
1950    1676
1951    2042
1952    2364
1953    2700
1954    2867
1955    3408
1956    3939
1957    4421
1958    4572
1959    5140
1960    5714
Name: passengers, dtype: int64
#étiquette(axe x)
ts_labels = ts_sum_yearly.index
ts_labels
Int64Index([1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959,
            1960],
           dtype='int64', name='year')

Visualisons-le, j'ai un peu joué avec la mise en page.

fig = go.Figure()

#Faire des données de séries chronologiques mensuelles un graphique à lignes de pliage
for month, passengers in ts_data_monthly.iteritems():
    fig.add_trace(go.Scatter(x=ts_labels, y=passengers, name=str(month)+"Mois", yaxis='y2'))

#Faire un graphique à barres pour le total annuel
fig.add_trace(go.Bar(x=ts_labels, y=ts_sum_yearly.values, name="total", yaxis="y1"))

#Pour personnaliser l'apparence, jouez avec la mise en page
#Puisqu'il y a deux axes, il n'y a pas de mémoire
fig.update_layout(
    title={
        "text": "Données de séries chronologiques sur le nombre de passagers",
        "x":0.5,
        "y": 0.9
    },
    legend={
        "orientation":"h",
        "x":0.5,
        "xanchor":"center"
    },
    yaxis1={
        "title": "Nombre de passagers(total)",
        "side": "left",
        "showgrid":False
    },
    yaxis2={
        "title": "Nombre de passagers(Par mois)",
        "side": "right",
        "overlaying": "y",
        "showgrid":False
    }
)
fig.show()

image.png

Vous pouvez faire flotter la légende. C'est incroyable de pouvoir dessiner un graphique qui peut être déplacé un peu avec une si petite quantité de code ...

Autre

Donuts (mignon)

import numpy as np

ts_sum_monthly = df.groupby("month")["passengers"].sum()
#Faites en sorte que cela ressemble à une pizza coupée en lune avec le plus de passagers
pull=[0]*12
pull[np.argmax(ts_sum_monthly.values)] = 0.2

fig = go.Figure()
fig.add_trace(go.Pie(
    labels=[str(month) + "Mois" for month in ts_sum_monthly.index],
    values=ts_sum_monthly.values,
    hole=.3,
    pull=pull
    )
)
fig.update_layout(
    title={
        "text": "Pourcentage de passagers(1949~1960 au total)",
        "x":0.5,
        "y": 0.9
    }
)
fig.show()

image.png

Créez un graphique circulaire pour le nombre total de passagers chaque année

from plotly.subplots import make_subplots

specs = [[{'type':'domain'}, {'type':'domain'}, {'type':'domain'}, {'type':'domain'}] for _ in range(3)]
# 3*Divisez le graphique en 4 grilles
fig = make_subplots(rows=3, cols=4, specs=specs)

#Position du titre de l'étiquette sur chaque graphe circulaire de l'étiquette
pos_x = [0.09, 0.37, 0.63, 0.91]
pos_y = [0.9, 0.5, 0.1]
annotations = []  

# (row, col)Placez un graphique circulaire à la position de
row = 0
for i, (year, df_yearly) in enumerate(df.groupby(["year"])[["month","passengers"]]):
    pull=[0]*12
    pull[np.argmax(df_yearly.passengers.values)] = 0.2
    col = i%4+1
    if col == 1:
        row += 1
    annotations.append({
        "text": str(year)+"Année",
        "x": pos_x[col-1],
        "y": pos_y[row-1],
        "font_size": 10,
        "showarrow":False
    })
    fig.add_trace(go.Pie(
        labels=[str(month) + "Mois" for month in df_yearly.month.values],
        values=df_yearly.passengers.values,
        name=str(year)+"Année",
        hole=.3,
        pull=pull
    ),
    row, col
    )

fig.update_layout(
    title={
        "text": "Pourcentage de passagers(Annuel)",
        "x":0.5,
        "y": 0.9
    },
    annotations=annotations
)
fig.show()

image.png

la fin

Suis-je le seul à être heureux que le graphique fonctionne? La prochaine fois, je voudrais résumer un framework Web appelé dash qui vous permet de créer des tableaux de bord avec plotly.

Le site que j'ai utilisé comme référence

Recommended Posts

[Visualisation] Je veux dessiner un beau graphique avec Plotly
(Matplotlib) Je veux dessiner un graphique avec une taille spécifiée en pixels
Comment dessiner un graphique à 2 axes avec pyplot
Je veux faire un jeu avec Python
Je veux écrire dans un fichier avec Python
Dessinez un graphique avec NetworkX
Dessinez un graphique avec networkx
[Python] Comment dessiner un graphique linéaire avec Matplotlib
Je veux faire la transition avec un bouton sur le ballon
Je veux travailler avec un robot en python.
Je veux diviser une chaîne de caractères avec hiragana
Je veux faire fonctionner un ordinateur quantique avec Python
Je veux lier une variable locale avec lambda
Tracez un graphe avec Julia + PyQtGraph (2)
Je veux créer un éditeur de blog avec l'administrateur de django
Je veux démarrer un environnement Jupyter avec une seule commande
Dessinez un graphique lâche avec matplotlib
Je veux faire une macro de clic avec pyautogui (désir)
Tracez un graphique avec Julia + PyQtGraph (1)
Dessinez un graphique avec Julia + PyQtGraph (3)
Je veux faire une macro de clic avec pyautogui (Outlook)
Je souhaite utiliser un environnement virtuel avec jupyter notebook!
Dessinez un graphique avec des pandas + XlsxWriter
Je veux faire ○○ avec les Pandas
Faire un joli graphique avec plotly
Je veux déboguer avec Python
Dessinez un graphique avec l'interface graphique PySimple
Visualisation des données avec Python - La méthode de dessin simultané de graphes basés sur les attributs avec "Facet" est trop pratique
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove
Je souhaite rechercher le texte intégral avec elasticsearch + python
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
Je veux détecter des objets avec OpenCV
Je veux imprimer dans la notation d'inclusion
Comment dessiner un graphique avec Matplotlib
Je veux écrire un blog avec Jupyter Notebook
Je veux créer un environnement Python
Je veux installer Python avec PythonAnywhere
Je veux analyser les journaux avec Python
Je veux jouer avec aws avec python
Dessinez un graphique avec PyQtGraph Part 1-Drawing
Je veux créer un graphique avec des lignes ondulées au milieu avec matplotlib (je veux manipuler l'impression)
J'ai essayé d'utiliser "Asciichart Py" qui peut dessiner un beau graphique sur la console avec Python.
J'ai écrit un diagramme de configuration du système avec des diagrammes sur Docker
Je veux faire de matplotlib un thème sombre
Dessinez une surface plane avec un graphique 3D matplotlib
Je souhaite créer facilement un modèle de bruit
Dessinez un graphique avec des étiquettes japonaises dans Jupyter
Je veux utiliser MATLAB feval avec python
Je veux INSÉRER un DataFrame dans MSSQL
Comment dessiner un graphique 3D avant l'optimisation
Mémo qui a fait un graphique pour animer avec intrigue
Je veux créer une fenêtre avec Python
Dessinez un graphique en traitant avec Pandas groupby
[Python] Dessinez un graphe orienté avec Dash Cytoscape
Je veux moquer datetime.datetime.now () même avec pytest!
Essayez de dessiner une courbe de vie avec python
Je souhaite afficher plusieurs images avec matplotlib.
Je veux frapper 100 sciences des données avec Colaboratory
Je veux être OREMO avec setParam!