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