2017-08-09 1 views
1

Je veux montrer le cadre sur cette figure. enter image description here J'ai essayé l'exécution du code ci-dessous, mais il n'a pas fonctionné:Comment dessiner un cadre sur une figure matplotlib

ax = self.canvas.figure.add_subplot(111) 
ax.spines['top'].set_visible(True) 
ax.spines['right'].set_visible(True) 
ax.spines['bottom'].set_visible(True) 
ax.spines['left'].set_visible(True) 
ax.plot(diff) 

J'ai aussi essayé:

plt.tight_layout() 

mais il génère cette erreur:

> File "runme.py", line 54, in autocorr_function 
>  plt.tight_layout() File "/usr/local/lib/python2.7/dist-packages/matplotlib/pyplot.py", line 
> 1406, in tight_layout 
>  fig.tight_layout(pad=pad, h_pad=h_pad, w_pad=w_pad, rect=rect) File "/usr/local/lib/python2.7/dist-packages/matplotlib/figure.py", 
> line 1753, in tight_layout 
>  rect=rect) File "/usr/local/lib/python2.7/dist-packages/matplotlib/tight_layout.py", 
> line 326, in get_tight_layout_figure 
>  max_nrows = max(nrows_list) ValueError: max() arg is an empty sequence 

Votre aide serait appréciée , Je vous remercie.

EDIT: Voici le code de la toile:

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 

import matplotlib.pyplot as plt from PyQt4 import QtGui 

class Canvas(FigureCanvas): 

    def __init__(self, parent=None): 
     self.figure = plt.figure()  #plt.tight_layout(pad=4) 
     FigureCanvas.__init__(self, self.figure) 
     self.setParent(parent) 
     FigureCanvas.setSizePolicy(self, 
           QtGui.QSizePolicy.Expanding, 
           QtGui.QSizePolicy.Expanding) 
     FigureCanvas.updateGeometry(self) 
+1

Il semble que vous ne tracez pas de graphique dans une figure orpheline matplotlib, mais dans le canevas d'une interface graphique. Nous avons besoin de plus d'informations. tight_layout est une méthode de figure pour étirer les axes dans le cadre de la figure, il ne s'agit pas des frontières. – Wli

+0

J'ai ajouté le code de la toile, j'espère qu'il met plus de clarté. –

+0

Pour quoi avez-vous besoin de la toile? Pourquoi ne pas le tracer en utilisant simplement plt.plot (...) – 2Obe

Répondre

3

Les frontières (ou épines) sont déjà visibles, mais le blanc. Vous devez changer la couleur comme expliqué dans cette réponse: https://stackoverflow.com/a/43265998/1773344

exemple pour une sorte de gris:

ax.spines['bottom'].set_color('0.5') 
ax.spines['top'].set_color('0.5') 
ax.spines['right'].set_color('0.5') 
ax.spines['left'].set_color('0.5') 

Si vous voulez que les frontières autour des axes, il n'y a pas de solution simple. Sauf peut-être mettre votre axe à l'intérieur d'un axe avec des limites ajustées comme expliqué partiellement dans cette réponse: https://stackoverflow.com/a/22608025/1773344

2

Le point principal est que vous semblez utiliser seaborn ou au moins le style darkgrid seaborn. Si cela est vraiment souhaité, mais que vous voulez toujours une bordure autour des axes, vous devez changer le style.

plt.rcParams["axes.edgecolor"] = "black" 
plt.rcParams["axes.linewidth"] = 1 

Ceci est (comme @Wli mentions) a expliqué dans this answer.

Tout cela est indépendant de tight_layout. La raison pour laquelle plt.tight_layout() produit l'erreur indiquée ne peut être déterminée avec certitude avec les informations disponibles. Cependant, vous pouvez généralement appeler la méthode de la figure plutôt que d'utiliser pyplot dans l'interface graphique. Donc, vous pouvez essayer self.canvas.figure.tight_layout() à la place.