2010-03-21 16 views
3

Je travaille sur l'utilisation de Matplotlib pour produire des graphiques d'équations implicites (par exemple, y^x = x^y). Avec beaucoup de remerciements à l'aide que j'ai déjà reçue, je suis assez loin avec elle. J'ai utilisé une ligne de contour pour produire l'intrigue. Mon problème résiduel est avec le formatage de la ligne de contour, par exemple la largeur, la couleur et surtout le zorder, où le contour apparaît derrière mon quadrillage. Ceux-ci fonctionnent bien lors du tracé d'une fonction standard bien sûr.Comment formater des courbes de niveau à partir de Matplotlib

import matplotlib.pyplot as plt 
from matplotlib.ticker import MultipleLocator, FormatStrFormatter 
import numpy as np 

fig = plt.figure(1) 
ax = fig.add_subplot(111) 

# set up axis 
ax.spines['left'].set_position('zero') 
ax.spines['right'].set_color('none') 
ax.spines['bottom'].set_position('zero') 
ax.spines['top'].set_color('none') 
ax.xaxis.set_ticks_position('bottom') 
ax.yaxis.set_ticks_position('left') 

# setup x and y ranges and precision 
x = np.arange(-0.5,5.5,0.01) 
y = np.arange(-0.5,5.5,0.01) 

# draw a curve 
line, = ax.plot(x, x**2,zorder=100,linewidth=3,color='red') 

# draw a contour 
X,Y=np.meshgrid(x,y) 
F=X**Y 
G=Y**X 
ax.contour(X,Y,(F-G),[0],zorder=100,linewidth=3,color='green') 

#set bounds 
ax.set_xbound(-1,7) 
ax.set_ybound(-1,7) 

#add gridlines 
ax.xaxis.set_minor_locator(MultipleLocator(0.2)) 
ax.yaxis.set_minor_locator(MultipleLocator(0.2)) 
ax.xaxis.grid(True,'minor',linestyle='-',color='0.8') 
ax.yaxis.grid(True,'minor',linestyle='-',color='0.8') 

plt.show() 

Répondre

3

Ce qui est assez hackish mais ...

Apparemment, dans la version actuelle Matplotlib ne prend pas en charge zorder sur les contours. Ce support, cependant, was recently added to the trunk. Donc, la bonne façon de le faire est soit d'attendre la version 1.0, soit d'aller de l'avant et de réinstaller depuis le réseau.

Maintenant, voici la partie hackish. Je l'ai fait un test rapide et si je l'ai changé la ligne 618 dans

python/site-packages/matplotlib/contour.py

pour ajouter un zorder dans l'appel collections.LineCollection, il fixe votre spécifique problème.

col = collections.LineCollection(nlist, 
    linewidths = width, 
    linestyle = lstyle, 
    alpha=self.alpha,zorder=100) 

Pas la bonne façon de faire les choses, mais peut-être juste à la rigueur.

Aussi hors-sujet, si vous acceptez des réponses à vos questions précédentes, vous obtiendrez probablement une aide plus rapide ici. Les gens aiment ces rep repères :)

+0

Merci beaucoup Mark - merci pour les conseils de réponse aussi, je ne savais pas comment tout cela a fonctionné! – Geddes