Updated with matplotlib v3.3.4
- Update
def scatter_logpolar_mpl
to use 'symlog'
, because using 'log'
results in posx and posy should be finite values
, and an empty plot for 'log-polar matplotlib'
.
# updated function with symlog
def scatter_logpolar_mpl(ax, theta, r):
ax.scatter(theta, r)
ax.set_rlim(0)
ax.set_rscale('symlog')
ax.set_title('log-polar matplotlib')
# use other unchanged original functions
# setup the plot
r = np.arange(0, 3.0, 0.01) + 0.001
theta = 2 * np.pi * r
ax = plt.subplots(1, 3, subplot_kw=dict(polar=True), figsize=(12, 7))[1].flatten()
scatter_polar_mpl(ax[0], theta, r)
scatter_logpolar_mpl(ax[1], theta, r)
scatter_logpolar(ax[2], theta, r)
plt.tight_layout()
plt.show()
Original Answer
There are more problems with the current matplotlib and log-polar plots.
For example, try to add a small value to the radius in the matplotlib example for polar plots, and then use set_rlim(0)
and set_rscale('log')
to plot it (as has been suggested in the comments here). All values below 0.1 get some special treatment. This affects the ticks on the r
axis (note the completely misplaced 10e-2 and 10e-3) as well as the plotted data:
The behavior seems to be undocumented. I ended up doing the log-transform manually (third plot in the series above). For others coming across this thread, here is my code:
import numpy as np
import matplotlib.pyplot as plt
def scatter_polar_mpl(ax, theta, r):
ax.scatter(theta, r)
ax.set_rlim(0)
ax.set_title('polar matplotlib')
def scatter_logpolar_mpl(ax, theta, r):
ax.scatter(theta, r)
ax.set_rlim(0)
ax.set_rscale('log')
ax.set_title('log-polar matplotlib')
def scatter_logpolar(ax, theta, r_, bullseye=0.3, **kwargs):
min10 = np.log10(np.min(r_))
max10 = np.log10(np.max(r_))
r = np.log10(r_) - min10 + bullseye
ax.scatter(theta, r, **kwargs)
l = np.arange(np.floor(min10), max10)
ax.set_rticks(l - min10 + bullseye)
ax.set_yticklabels(["1e%d" % x for x in l])
ax.set_rlim(0, max10 - min10 + bullseye)
ax.set_title('log-polar manual')
return ax
r = np.arange(0, 3.0, 0.01) + 0.001
theta = 2 * np.pi * r
ax = plt.subplots(1, 3, subplot_kw=dict(polar=True))[1].flatten()
scatter_polar_mpl(ax[0], theta, r)
scatter_logpolar_mpl(ax[1], theta, r)
scatter_logpolar(ax[2], theta, r)
plt.show()