Conversion de graphique Matplotlib en graphique
Avez-vous déjà voulu créer directement Plotly graphiques à partir d’une trame de données?
Pandas utilise actuellement Matplotlib comme backend de traçage par défaut. Depuis la version 0.25, il a également prend en charge d’autres backends tel que Bokeh. Cependant, Plotly n’est pas actuellement pris en charge. Par conséquent, j’ai décidé de voir s’il était possible de convertir un graphique Matplotlib en son équivalent Plotly.
Voici le code complet si vous souhaitez suivre cet article.
La première étape a consisté à inspecter la façon dont chacune des bibliothèques représentait les parcelles en interne.
Le fonctionnement interne des deux bibliothèques est si bien résumé que, pour la plupart des fins de traçage courantes, nous n’avons presque jamais besoin de bricoler avec les internes. df.plot
amène le traçage à un niveau d’abstraction encore plus élevé. Vous appelez simplement plot()
sur une trame de données, en spécifiant éventuellement le type de tracé, pour un tracé instantané – pas besoin de créer une figure vide, de définir des étiquettes d’axe, des légendes, etc. Par exemple.,
Propriétés des axes Matplotlib
J’ai commencé par examiner ax
, le AxesSubplot
objet retourné par data.plot
. Après une recherche rapide, j’ai trouvé que AxesSubplot
les objets ont un properties()
méthode qui renvoie leurs propriétés sous forme de dictionnaire.
Voici un graphique à barres de mon cahier Kaggle contenant EDA sur les données de batailles et de décès de Game of Thrones.
Sous le graphique se trouve un extrait de ses propriétés renvoyé par ax.properties()
.
le children
l’attribut contient le Rectangle
objets rendus sous forme de barres. Naturellement, Rectangle
s encapsule la plupart des informations de traçage (coordonnées x, hauteur et largeur). title
est le titre de l’intrigue et xlabel
et ylabel
sont respectivement les titres des axes x et y.
Propriétés des figures
Voici le rendu Plotly du graphique à barres ci-dessus. Ses propriétés sont en dessous.
data
est l’attribut qui contient presque toutes les informations requises pour le tracé ci-dessus. Sous le layout
attribut, title
, xaxis.title
, et yaxis.title
contiennent le titre du tracé et les titres des axes.
Les chiffres de Matplotlib contre les chiffres de Plotly
Notez que si une figure Plotly est la contrepartie de niveau supérieur d’une figure Matplotlib, une Figure complotement est un concept différent d’un Figurine Matplotlib.
Cependant, nous avons directement reflété les propriétés du AxesSubplot
même si c’est contenu à l’intérieur de la figure. Ceci est dû au fait AxesSubplot
contient tous nos objets d’intérêt.
Cependant, si la figure contenait des sous-tracés comme indiqué ci-dessous, nous devrions refléter les propriétés de chacun des sous-tracés. Remarquez les quatre AxesSubplot
objets contenus dans la figure fig
.
Ici, nous ferons référence à plotly.graph_objects
comme on vient de go
.
Convertisseur de graphique à barres
Armé de la compréhension de la section précédente, j’ai écrit la fonction suivante pour convertir un graphique à barres Matplotlib donné en Plotly
graphique à barres. Il prend un seul argument de type AxesSubplot
.
Il effectue les étapes suivantes.
- Extrait tous les objets rectangulaires de l’axe.
- Construit des listes de coordonnées x, largeurs, hauteurs et couleurs des rectangles. Notez qu’il convertit les couleurs dans un format que Plotly comprend.
- Construit des listes de positions de tick et d’étiquettes.
- Crée un
go.Figure
objet contenant un seulgo.Bar
. - Ajoute des titres et des ticks.
Convertisseur de nuage de points
La fonction suivante prend un Matplotlib AxesSubplot
contenant un nuage de points et renvoie un Plotly go.Figure
contenant le nuage de points correspondant.
Considérez le diagramme de dispersion Matpotlib suivant.
Si vous le passez à la fonction ci-dessus, vous obtenez le diagramme de dispersion Plotly ci-dessous.
Limites
Bien que cette approche fonctionne pour une gamme étroite de cas d’utilisation de traçage, elle est hacky et ne convient pas à une gamme plus large de cas d’utilisation. Cela peut être facilement vu en exécutant une variété de tracés via la fonction de conversion et en observant la sortie. Les autres limitations sont les suivantes.
- Terrain légendes ne sont pas mappés. Si vous créez un graphique à barres groupé dans Plotly à l’aide de
go
ouplotly.express
, les informations de regroupement sont conservées. Contrairement à Plotly, cependant, les informations de regroupement des barres ne sont pas stockées explicitement sous le capot dans Matplotlib. Par conséquent, pour obtenir un « vrai » graphique à barres groupées dans Plotly, nous devons en quelque sorte déduire les informations de regroupement à partir du graphique Matplotlib. En outre, je ne pouvais pas trouver un moyen direct d’ajouter une légende à une figure Plotly en dehors de ajout de traces avec un nom etshow_legend=True
. - Les étiquettes de survol affichent un minimum d’informations. Si vous créez un graphique à l’aide de
plotly.express
, les étiquettes de survol sont automatiquement remplies d’informations utiles, ce qui est l’une des fonctionnalités les plus intéressantes de Plotly. Tu pourrais encore personnaliser les étiquettes de survol, en tout cas, pour afficher plus d’informations. - Les propriétés internes sont sujettes à changement. Si une modification incompatible en amont est introduite dans l’une des bibliothèques, le code de conversion peut se casser et doit être mis à jour.
Check-out Boutons de manchette, une bibliothèque tierce qui ajoute un iplot()
méthode aux trames de données. df.iplot()
est Plotly as df.plot()
est à Matplotlib.
Bokeh est une bibliothèque de traçage cool et interactive. Vous pouvez le définir comme vos pandas traçage du backend en exécutant pd.set_option('plotting.backend', 'pandas_bokeh')
.
Pendant ce temps, Nicolas Kruchten (VP produit chez Plotly) a récemment commenté que Plotly pourrait être ajouté comme option de back-end de traçage aux pandas dans la prochaine version!