Reputation: 231
Given an an array of values, I want to plot a log log histogram of these values by their counts. I only know how to log the x values, but not the y values because they are not explicitly created in my program.
Upvotes: 23
Views: 30397
Reputation: 977
Based on this solution we can define this simple method:
import numpy as np
import matplotlib.pyplot as plt
def plot_loghist(x, bins):
hist, bins = np.histogram(x, bins=bins)
logbins = np.logspace(np.log10(bins[0]),np.log10(bins[-1]),len(bins))
plt.hist(x, bins=logbins)
plt.xscale('log')
plt.yscale('log')
And after that call like this:
plot_loghist(data, 10)
This is an example of the output for my data:
Upvotes: 1
Reputation: 756
Check out the pyplot documentation.
bins
keyword argument, but you have to "log" x axis yourselfFor example:
#!/usr/bin/python
import numpy
from matplotlib import pyplot as plt
data = numpy.random.gumbel(2 ** 20, 2 ** 19, (1000, ))
bins = range(15, 25)
plt.xticks(bins, ["2^%s" % i for i in bins])
plt.hist(numpy.log2(data), log=True, bins=bins)
plt.show()
This will give you the actual counts of how how many elements fall into each bin, plotted on a log axis (which is what people usually mean by a log plot). I couldn't tell from your wording if you wanted this or the log of the count plotted on a linear axis.
Btw., bins don't even have to be spaced evenly.
Upvotes: 28