Axis numerical offset in matplotlib

2019-09-11 01:45发布

问题:

I'm plotting something with matplotlib and it looks like this:

I can't seem to figure out why the x-axis is offset like it is...It looks like it's saying, 'whatever you read from me, add 2.398e9 to it for the actual x value'.

This is not quite what I want...Can I make it take only the first 4 digits, instead?

This is representing frequency, so I'd like to see something that reads:

2000 or 2400 or 2800....I can add the 'MHz' part in the axis title...But, this is unreadable at a glance.

Is this doing this because it's trying to make decisions on how to truncate long data?

Here's the code for the plotting:

plt.title(file_name +' at frequency '+ freq + 'MHz')
plt.xlabel('Frequency')
plt.ylabel('Conducted Power (dBm)')
plt.grid(True)
plt.plot(data['x'],data['y'])
#plt.axis([min(data['x']),max(data['x']),min(data['y'],max(data['y']))])
plt.savefig(file_name+'_'+freq)
print('plot written!')
#plt.show()
plt.close('all')

回答1:

You need to import certain formatters from matplotlib.ticker. Here is the full documentation to ticker

from matplotlib.ticker import ScalarFormatter, FormatStrFormatter
ax.xaxis.set_major_formatter(FormatStrFormatter('%.0f'))

Once you have set this to your plot likewise, you should be able to see the +2.398e9 disappear.

In general to avoid scientific notation, use the following:

ax.get_xaxis().get_major_formatter().set_scientific(False)


回答2:

If you don't want to play the formatting game and would rather just display values directly in MHz, then you could simply rescale your data to be in MHz instead of Hz. Something like

data['x'] /= 1000

and then add the 'MHz' to your axis label.