user706838
user706838

Reputation: 5380

set constant width to every bar in a bar plot

I am trying to plot a bar plot where each bin has a difference length and as a result I end up with a very ugly result.c:) What I would like to do is still be able to define a bin of deference lengths but all the bars be plotted the same fixed width. How can I do that? Here is what I have done so far:

%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

sns.set_palette("deep", desat=.6)
sns.set_context(rc={"figure.figsize": (8, 4)})
np.random.seed(9221999)

data = [0,2,30,40,50,10,50,40,150,70,150,10,3,70,70,90,10,2] 
bins = [0,1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100,200]
plt.hist(data, bins=bins);

enter image description here

EDIT

This question has been marked as duplicate but in fact non of the proposed links solved my problem; the 1st is a very crappy workaround and the 2nd doesn't solve the problem at all as it sets all bars' width to a certain number.

Upvotes: 2

Views: 5464

Answers (2)

hitzg
hitzg

Reputation: 12701

Here you go, with seaborn, as you please. But you have to understand that seaborn itself uses matplotlib to create plots. AND: Please delete your other question, now it really is a duplicate.

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

sns.set_palette("deep", desat=.6)
sns.set_context(rc={"figure.figsize": (8, 4)})

data = [0,2,30,40,50,10,50,40,150,70,150,10,3,70,70,90,10,2]
bins = [0,1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100,200]


bin_middles = bins[:-1] + np.diff(bins)/2.
bar_width = 1. 
m, bins = np.histogram(data, bins)
plt.bar(np.arange(len(m)) + (1-bar_width)/2., m, width=bar_width)
ax = plt.gca()
ax.set_xticks(np.arange(len(bins)))
ax.set_xticklabels(['{:.0f}'.format(i) for i in bins])

plt.show()

enter image description here

Personally I think, that plotting your data like this is confusing. Having non-linear (or non-log) axis scaling is usually not a good idea.

Upvotes: 3

Joe Kington
Joe Kington

Reputation: 284652

Are you wanting to place a bar with a fixed width at the center of each bin?

If so, try something something similar to this:

import numpy as np
import matplotlib.pyplot as plt

data = [0,2,30,40,50,10,50,40,150,70,150,10,3,70,70,90,10,2]
bins = [0,1,2,3,4,5,6,7,8,9,10,20,30,40,50,60,70,80,90,100,200]

counts, _ = np.histogram(data, bins)
centers = np.mean([bins[:-1], bins[1:]], axis=0)

plt.bar(centers, counts, width=5, align='center')
plt.show()

enter image description here

Upvotes: 2

Related Questions