HotDogCannon
HotDogCannon

Reputation: 2386

Formatting axes when plotting with matplotlib

I am trying to format the x-axis of the plot generated by following sample code. The x-axis is plotted in log scale. Currently, the plot shows [1000,2000,3000,4000,5000] with minor tics = 100. I would like to see every 100 as a labeled major tic from [0,1000] and then only every 1000 from [1000,5000].

Basically, I want the x-axis would have the following labels: [100,200,300,400,500,600,700,800,900,1000,2000,3000,4000,5000]. Is this possible using matplotlib?

import numpy
import math
import random

from matplotlib import pyplot
from matplotlib.ticker import MultipleLocator, FormatStrFormatter

### ----------------------------- ###

plot_aspect = 1.7
plot_height = 10.0
plot_width = int(plot_height*plot_aspect)

pyplot.figure(figsize=(plot_width, plot_height), dpi=100)
pyplot.subplots_adjust(left=0.10, right=0.90, top=0.90, bottom=0.10, hspace=0.30)

### ----------------------------- ###

title1 = 'Example Plot Title'
main_title = 'Example Main Title'
png_title = 'example_plot.png'

file1_data = []

for i in range(10,5100,10):
    b = (60-(2*math.log(i)))+random.uniform(-2.0,2.0)
    file1_data.append([i,b])

# ----------

subplot1 = pyplot.subplot(111)

majorLocator1   = MultipleLocator(1000)
majorFormatter1 = FormatStrFormatter('%d')
minorLocator1   = MultipleLocator(100)

pyplot.plot(numpy.array(file1_data)[:,0],numpy.array(file1_data)[:,1],'red',linewidth=1.0,label=title1)

pyplot.xscale('log',fontsize=10)

pyplot.xlim(0,5000)

pyplot.xticks(fontsize = 10)

subplot1.xaxis.set_major_locator(majorLocator1)
subplot1.xaxis.set_major_formatter(majorFormatter1)
subplot1.xaxis.set_minor_locator(minorLocator1)

subplot1.xaxis.grid()

pyplot.legend(loc=3,prop={'size':20})

pyplot.yticks(fontsize = 16)
pyplot.ylim(30,65)
pyplot.xlabel('Freq [Hz]', fontsize=16, weight="bold")
pyplot.ylabel('PSD [dB/Hz]', fontsize=16, weight="bold")

pyplot.suptitle(main_title, fontsize = 28, weight="bold")

### ----------------------------- ###

pyplot.savefig(png_title, dpi=100)
pyplot.show()

enter image description here

Upvotes: 0

Views: 1456

Answers (1)

HotDogCannon
HotDogCannon

Reputation: 2386

@Thibaut helped me with this one (with some minor adjustments):

import numpy
import math
import random

from matplotlib import pyplot
from matplotlib.ticker import MultipleLocator, FormatStrFormatter

### ----------------------------- ###

plot_aspect = 1.7
plot_height = 10.0
plot_width = int(plot_height*plot_aspect)

pyplot.figure(figsize=(plot_width, plot_height), dpi=100)
pyplot.subplots_adjust(left=0.10, right=0.90, top=0.90, bottom=0.10, hspace=0.30)

### ----------------------------- ###

title1 = 'Example Plot Title'
main_title = 'Example Main Title'
png_title = 'example_plot.png'

file1_data = []

for i in range(10,5100,10):
    b = (60-(2*math.log(i)))+random.uniform(-2.0,2.0)
    file1_data.append([i,b])

# ----------

subplot1 = pyplot.subplot(111)

majorLocator1   = MultipleLocator(1000)
majorFormatter1 = FormatStrFormatter('%d')
minorLocator1   = MultipleLocator(100)

pyplot.plot(numpy.array(file1_data)[:,0],numpy.array(file1_data)[:,1],'red',linewidth=1.0,label=title1)

pyplot.xscale('log',fontsize=10)

pyplot.xlim(0,5000)

xticks = range(100, 1001, 100) + range(2000, 6000, 1000)

# pyplot.xticks(fontsize = 10)
pyplot.xticks(xticks, fontsize=10)

# subplot1.xaxis.set_major_locator(majorLocator1)
subplot1.xaxis.set_major_formatter(majorFormatter1)
# subplot1.xaxis.set_minor_locator(minorLocator1)

subplot1.xaxis.grid()

pyplot.legend(loc=3,prop={'size':20})

pyplot.yticks(fontsize = 16)
pyplot.ylim(30,65)
pyplot.xlabel('Freq [Hz]', fontsize=16, weight="bold")
pyplot.ylabel('PSD [dB/Hz]', fontsize=16, weight="bold")

pyplot.suptitle(main_title, fontsize = 28, weight="bold")

### ----------------------------- ###

pyplot.savefig(png_title, dpi=100)
pyplot.show()

enter image description here

Upvotes: 1

Related Questions