30

It's probably a trivial question, but I am trying to plot a bar chart with matplotlib and with rotated text on the x axis. The code I'm using is shown below:

fig = plt.figure()

x_labels_list = []

for i in range(0, pow(2, N)):
    x_labels_list.append(str(f(i)))  # The function f() converts i to a binary string

ax = plt.subplot(111)
width = 1.0
bins = map(lambda x: x-width, range(1,pow(2,N)+1))
ax.bar(bins, my_data, width=width)
ax.set_xticks(map(lambda x: x-width/2, range(1,pow(2,N)+1)))
ax.set_xticklabels(x_labels_list, rotation=90, rotation_mode="anchor", ha="right")

It works perfectly, but I obtain an annoying white space on the right of the x axis, as shown by the red ellipse in the following picture:

enter image description here

Do you know how I can remove it? Thanks in advance!

user2983638
  • 903
  • 1
  • 13
  • 20

1 Answers1

37

Try calling plt.xlim() with the number of bins, e.g.

plt.xlim([0,bins.size])

Here is an example:

#make some data
N = 22
data = np.random.randint(1,10,N)
bin = np.arange(N)  
width = 1

#plot it
ax = plt.subplot(111)
ax.bar(bin, data, width, color='r')
plt.show()

No plt.xlim() output:

no xlim

Now plot it with plt.xlim using the number of bins to define the size:

#plot it
ax = plt.subplot(111)
ax.bar(bin, data, width, color='r')
plt.xlim([0,bin.size])
plt.show()

Results it:

with xlim

There may be a better way, but this should work for you.

dnf0
  • 1,609
  • 17
  • 21
  • 26
    You can also use `plt.axis('tight')` to accomplish the same thing without having to worry about specifying the number of bins. Also, if you'd prefer a bit of space at the edges, use `plt.margins(0.05, 0)` to pad the limits with 5% of the data range in the x-direction and 0% in the y-direction. – Joe Kington Nov 26 '13 at 14:51
  • @Joe Kington: Yes, I have tried also your solution, and it works! – user2983638 Nov 26 '13 at 15:11