6
votes

Comment puis-je produire des graphiques de style étudiant à l'aide de Matplotlib?

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.

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.

Y a-t-il un moyen assez simple d'atteindre ce genre de chose avec Matplotlib?

text alt


0 commentaires

3 Réponses :


8
votes

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()


3 commentaires

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.



1
votes

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)


2 commentaires

@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



2
votes

Ceci est une version modifiée de la réponse acceptée ci-dessus. Peut-être que quelqu'un trouvera cette utile xxx

 Terrain de grille fin: cahier carré


0 commentaires