Plotting scientific format on the axis label and different size minor formatter text size
I wrote the code below to out开发者_Python百科put the figure but still need to figure out two things.
1) How do I get scientific notation on the axis for the minor tick label. Since I only have it show the 5000 I assume I could just change this in the showOnlySomeTicks function to return a string in scientific format. Is there a better way to do this?? Also a better way to show only the 5000 minor tick mark (eg 5e5). 2) I want to make the minor tick mark label size smaller than the major tick mark label size. How do I go about this?
Cheers for any help
import matplotlib.pyplot as plt
import matplotlib.ticker as tick
from numpy import load, sqrt, shape, size
def clear_spines(ax):
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
def set_spineLineWidth(ax, lineWidth):
for i in ax.spines.keys():
ax.spines[i].set_linewidth(lineWidth)
def showOnlySomeTicks(x, pos):
s = str(int(x))
if x == 5000:
return s
return ''
plt.close('all')
spineLineWidth = 0.5
inFile = '7semiat220'
outFile = inFile
inExt = '.npz'
outExt = ['.eps','.pdf','.tif','.png']
mydpi = 300
storeMat = load(inFile+inExt)
fig_width_pt = 246.0
inches_per_pt = 1.0/72.27
golden_mean = (sqrt(5)-1.0)/2.0
fig_width = fig_width_pt*inches_per_pt
fig_height = 2 #fig_width*golden_mean
fig_size = [fig_width,fig_height]
tick_size = 9
fontlabel_size = 10.5
params = {'backend': 'wxAgg', 'axes.labelsize': fontlabel_size, 'text.fontsize': fontlabel_size, 'legend.fontsize': fontlabel_size, 'xtick.labelsize': tick_size, 'ytick.labelsize': tick_size, 'text.usetex': True, 'figure.figsize': fig_size}
plt.rcParams.update(params)
x = storeMat['freq']
y = storeMat['mag']
sizeX = x.size
fig = plt.figure(1)
#figure(num=None, figsize=(8, 6), dpi=80, facecolor='w', edgecolor='k')
#fig.set_size_inches(fig_size)
plt.clf()
ax = plt.axes([0.125,0.2,0.95-0.125,0.95-0.2])
plt.plot(x,y,'k',label='$\sin(x)$')
plt.xscale('log')
plt.xlim(x[sizeX-1]*.95,x[0]*1.05)
plt.xlabel('Log Frequency (Hz)')
plt.ylabel('Magnitude')
set_spineLineWidth(ax,spineLineWidth)
clear_spines(ax)
ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('bottom')
ax.xaxis.set_minor_formatter(tick.FuncFormatter(showOnlySomeTicks))
#plt.legend()
for i in outExt:
plt.savefig(outFile+i, dpi = mydpi)
#def grayConvert()
#Image.open('color.png').convert('L').save('bw.png') #direct method
#image=Image.open('colored_image.png').convert("L") #other manipulations can use this method
#arr=np.asarray(image)
#p.figimage(arr,cmap=cm.Greys_r)
#p.savefig('grayed.png')
You have to use a combination of Formatter and Locator
The locator will tell where the tick should be placed.
The Formatter will return the string to be displayed at the location.
see: Ticker module documentation
ax.xaxis.set_minor_locator( xLocator )
ax.xaxis.set_minor_formatter( xminorFormatter )
精彩评论