2017-05-09 1 views
0

J'ai tracé quelques données avec Python et essayé de changer les ticks avec FuncFormatter. Maintenant, je veux changer la segmentation en nombres ronds. Je veux aussi des ticks mineurs dans la même formation, dans mon cas ce serait une segmentation 1/x. Je veux que la mise à l'échelle se répande. Les images vous aideront à imaginer mon problème.Python 1/x mise en forme de l'échelle de tracé, position de la coche

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.ticker as tick 
x = np.array([805.92055,978.82006,564.88627,813.70311,605.73361,263.27184,169.40317]) 
y = np.array([10,9,8,7,6,3,2]) 
fig, ax = plt.subplots(figsize =(3.6,2.5)) 
plt.plot(1/x,y,linestyle ='None',marker='1') 
a=0.001 
b=0.005 
plt.xlim(a,b) 
def my_formatter_fun(x, p): 
    return "%.0f" % (1/x)   
ax.get_xaxis().set_major_formatter(tick.FuncFormatter(my_formatter_fun)) 

plot with changed xtick

Comment puis-je changer le segmentaion pour que je sois quelque chose comme ça? Je pensais qu'il pourrait y avoir un moyen d'ajouter mes souhaits dans my_formatter_fun mais je ne sais pas comment. Comment pourrais-je ajouter des ticks mineurs dans une distribution 1/x? J'ai essayé plt.minorticks_on() mais cela ne fonctionne pas, car ils sont dans une position linéaire.

desired plot

Répondre

0

L'emplacement des tiques peut être contrôlé avec un matplotlib.ticker.Locator. Pour 1/x tiques, vous devez définir votre propre coutume Locator:

class ReciprocalLocator(tick.Locator): 
    def __init__(self, numticks = 5): 
     self.numticks = numticks 
    def __call__(self): 
     vmin, vmax = self.axis.get_view_interval() 
     ticklocs = np.reciprocal(np.linspace(1/vmax, 1/vmin, self.numticks)) 
     return self.raise_if_exceeds(ticklocs) 

Vous pouvez l'utiliser dans votre intrigue en appelant

ax.get_xaxis().set_major_locator(ReciprocalLocator(numticks=4)) 
ax.get_xaxis().set_minor_locator(ReciprocalLocator(numticks=20)) 

Ceci a besoin de plus de peaufinage pour déplacer les endroits aux numéros agréables. Pour l'inspiration, jetez un oeil sur le code source de matplotlib.ticker.MaxNLocator.