0

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

2
  • 1
    Have you tried something like: xticks = range(100, 1001, 100) + range(1001, 5001, 1000) and then pyplot.xticks(xticks, fontsize=10)? Commented Nov 11, 2014 at 17:08
  • xticks = range(100, 1001, 100) + range(2000, 6000, 1000), but yes that works Commented Nov 11, 2014 at 17:20

1 Answer 1

1

@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

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.