web-dev-qa-db-fra.com

L'utilisation de% matplotlib notebook après% matplotlib inline dans Jupyter Notebook ne fonctionne pas

J'utilise Jupyter Notebook pour tracer des figures à la pièce. 

Dans première cellule avec mon code, j'ai une commande magique %matplotlib inline et après cette commande magique, je lance mon code, tout fonctionne correctement et ma figure est rendue. 

Mais dans seconde cellule lorsque je règle %matplotlib notebook pour un traçage interactif, ma figure ne sera pas rendue après avoir exécuté cette seconde cellule. 

Je dois redémarrer le noyau et exécuter à nouveau la cellule avec %matplotlib notebook. Je ne peux pas exécuter la commande %matplotlib inline auparavant. 

Voici mon code pour première cellule avec %matplotlib inline, ce qui rend bien:

import matplotlib.pyplot as plt

%matplotlib inline

labels = "No", "Yes"
sizes = [100, 50]

fig, ax = plt.subplots(figsize=(6, 6))

_, texts, autotexts = ax.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%',
             shadow=False, startangle=90)

ax.axis('equal')

Après cela, j'ai deuxième cellule avec le même code, seulement %matplotlib inline est remplacé par %matplotlib notebook. La figure ne sera pas rendue après l'exécution de cette cellule et je dois redémarrer le noyau et l'exécuter à nouveau. 

Pourquoi?

16
delusionX

Vous avez juste le mauvais ordre de vos commandes. Un backend doit être défini avant l'importation de pyplot dans jupyter. Ou en d'autres termes, après avoir modifié le backend, pyplot doit être réimporté.

Par conséquent, appelez %matplotlib ... avant d'importer pyplot.

En première cellule: 

%matplotlib inline
import matplotlib.pyplot as plt
plt.plot([1,1.6,3])

Dans la deuxième cellule:

%matplotlib notebook
#calling it a second time may prevent some graphics errors
%matplotlib notebook  
import matplotlib.pyplot as plt
plt.plot([1,1.6,3])

 enter image description here

21

Edit: il s'avère que vous pouvez réellement modifier le système de manière dynamique sur jupyter. Laissant toujours la réponse ici parce que je pense que c'est pertinent et explique une certaine magie matplotlib qui peut surgir parfois.

La commande magique, comme indiqué dans le code source , appelle matplotlib.pyplot.switch_backend(newbackend) pour modifier le backend. Comme indiqué dans les docs de matplotlib:

matplotlib.pyplot.switch_backend (newbackend)

Basculez le backend par défaut. Cette fonctionnalité est expérimentale et ne devrait fonctionner qu’en basculant vers un backend d’image. Par exemple, si vous souhaitez exécuter une série de scripts PostScript à partir d'une session ipython interactive, vous pouvez passer au backend PS avant de les exécuter pour éviter de générer une série de fenêtres GUI. Si vous essayez de basculer de manière interactive d'un backend graphique à un autre, vous allez exploser.

Vous devez donc vraiment redémarrer le noyau chaque fois que vous changez de serveur, car matplotlib a un problème pour changer de serveur après avoir été utilisé.

Ce problème est principalement dû aux incompatibilités entre les différentes boucles principales du back-end de l'interface graphique. Parce que normalement chaque serveur prend également en charge les threads et les entrées de l'utilisateur, vous ne pouvez pas exécuter Qt et Tkinter côte à côte. Donc, cette limitation est reportée sur jupyter.

Voir aussi cette question: Comment changer de serveur dans matplotlib/Python

3
lolopop

Dans Jupyter notebook, vous devez entrer matplotlib notebook sur la même ligne que celle que vous souhaitez exécuter. Même si vous entrez "inline" suivi de "notebook", cela ne fonctionnera toujours pas. Il doit être sur la même ligne que le code que vous voulez rendre. 

0
Michelle Abaya