Math
Math

Reputation: 251

How to plot a log-log histogram in matplotlib

I'm wondering how to have a log-log plot for visualizing the frequency of elements in a list, for example:

my_list=[1,2,3,3,3,4,1,2,5,2,10,4,5,3,3,3,2,1]

I plotted data using a histogram:

plt.hist(my_list, label='Frequency Distribution of matches')
plt.legend()
plt.ylabel('Frequency')

But it would be better to visualize it as log-log.

Upvotes: 2

Views: 1511

Answers (1)

tdy
tdy

Reputation: 41327

plt.hist includes a log param, which behaves like plt.yscale('log') since it only scales the y-axis:

log: If True, the histogram axis will be set to a log scale.

To also scale the x-axis, combine it with plt.xscale('log'):

plt.hist(my_list, log=True)
plt.xscale('log')

If you want equal-width bars, define bins as 10 ** edges:

start, stop = np.log10(min(my_list)), np.log10(max(my_list))
bins = 10 ** np.linspace(start, stop, 10)

plt.hist(my_list, log=True, bins=bins)
ax.set_xscale('log')

To get a log-log line plot of the frequencies, use plt.stairs (requires matplotlib 3.4+) with np.histogram:

plt.stairs(*np.histogram(my_list))
plt.yscale('log')
plt.xscale('log')

Upvotes: 2

Related Questions