J'essaie d'expérimenter avec Matplotlib pour le moment. Il y a quelque temps, j'ai utilisé Excel VBA code pour produire des images telles que celle attachée. P>
Vous remarquerez qu'il n'est pas présenté dans un style scientifique / de recherche, mais plutôt comme si produit par un étudiant-étudiant sur papier graphique - avec trois styles de ligne de grille différents. P>
Y a-t-il un moyen assez simple d'atteindre ce genre de chose avec Matplotlib? P>
p>
3 Réponses :
Oui, vous pouvez utiliser épines pour cela.
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') # draw curve x = np.arange(-2.5,2.5,0.01) line, = ax.plot(x, x**2) #set bounds ax.set_ybound(-1,7) # create grid #ax.xaxis.set_major_locator(MultipleLocator(1)) #ax.xaxis.set_minor_locator(MultipleLocator(0.2)) #ax.yaxis.set_major_locator(MultipleLocator(1)) #ax.yaxis.set_minor_locator(MultipleLocator(0.2)) #ax.xaxis.grid(True,'minor') #ax.yaxis.grid(True,'minor') #ax.xaxis.grid(True,'major',linewidth=2) #ax.yaxis.grid(True,'major',linewidth=2) #adjust grid on the 2s #for idx,loc in enumerate(ax.xaxis.get_majorticklocs()): #if loc !=0 and loc % 2 == 0: ax.get_xgridlines()[idx].set_c('r') #for idx,loc in enumerate(ax.yaxis.get_majorticklocs()): #if loc !=0 and loc % 2 == 0: ax.get_ygridlines()[idx].set_c('r') ## THIS IS THE EDIT ax.xaxis.set_minor_locator(MultipleLocator(0.2)) ax.yaxis.set_minor_locator(MultipleLocator(0.2)) ax.xaxis.grid(True,'minor',linewidth=2) ax.yaxis.grid(True,'minor',linewidth=2) minor_grid_lines = [tick.gridline for tick in ax.xaxis.get_minor_ticks()] for idx,loc in enumerate(ax.xaxis.get_minorticklocs()): if loc % 2.0 == 0: minor_grid_lines[idx].set_c('r' ) elif loc % 1.0 == 0: minor_grid_lines[idx].set_c('g' ) else: minor_grid_lines[idx].set_c( 'b' ) plt.show()
Ma dernière question serait la suivante: Y a-t-il un moyen d'obtenir les trois styles de ligne de grille différents? Je veux un style pour * 0,2, un autre pour * 1 et une autre pour * 2 (comme dans le papier graphique). Cela semble difficile car Matplotlib semble imposer uniquement des tiques majeures / mineures. Merci encore!
@Geddes, voir les modifications ci-dessus. Je pense que le moyen le plus simple serait de simplement ajuster les lignes de grille en fonction de leur position (c'est-à-dire sur les multiples de 2).
Merci encore marquer. Je vais devoir me donner la tête là-dessus maintenant - des choses assez avancées en cours! Tous mes vœux.
Juste une autre pensée - j'ai aussi essayé de tout faire avec les lignes de grille mineures (en dehors de tout ce qui pourrait aider ma compréhension), mais il ne s'agit pas correctement, sans aucun doute en raison de get_minortkklocs et d'AX.GET_XGRIDLINES. Désolé, et merci d'avance ...
GEDDES P>
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') # draw curve x = np.arange(-2.5,2.5,0.01) line, = ax.plot(x, x**2) #set bounds ax.set_ybound(-1,7) # create grid ax.xaxis.set_minor_locator(MultipleLocator(0.2)) ax.yaxis.set_minor_locator(MultipleLocator(0.2)) ax.xaxis.grid(True,'minor',linewidth=2) ax.yaxis.grid(True,'minor',linewidth=2) #adjust grid on the 2s for idx,loc in enumerate(ax.xaxis.get_minorticklocs()): if loc % 2 == 0: ax.get_xgridlines()[idx].set_color('r') if loc % 1 == 0: ax.get_xgridlines()[idx].set_color('g') if loc % 0.2 == 0: ax.get_xgridlines()[idx].set_color('b') for idx,loc in enumerate(ax.yaxis.get_majorticklocs()): if loc % 2 == 0: ax.get_ygridlines()[idx].set_c('b') plt.savefig('spines3.png',dpi=300)
@Geddes, l'AX.GET_XGRIDLINES () ne renvoie que les principales grilles. Voir les modifications à ma réponse ci-dessus.
Fantastique - Merci beaucoup pour toute votre aide Today Mark - Je sais que je suis un client exigeant! Tous mes meilleurs voeux, Geddes