Polar coordinates and datetime

I am trying to plot some time dependent data in a polar coordinates system. The problem is that I got such an output that I have no clue where to start: times, locators, … not “correctly” drawn.

I need some major ticks each 2 hours, minor tick every hour, and a day label in correspondence with a day transition. In normal coordinates it seems ok but when switching to polar it seems more complicated and this is very confusing. I miss smt but don’t know what.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.ticker as ticker
import matplotlib.projections.polar as mpolar
import matplotlib.ticker as mticker

import datetime
import random

N_MAJOR_TICKS = 12  # amount of major ticks

IS_MULTI_DAYS = True

def random_daily_hours(n_times, base_date=datetime.datetime.today()): # ordered list of day-hours
    # number seconds in a day
    n_secs = 24*60*60
    # generate list of seconds in a timeinterval of 24 hours
    secs = sorted([random.randint(0, n_secs - 1) for _ in range(n_times)])
    # convert the seconds to datetime objects
    return [base_date + datetime.timedelta(seconds=s) for s in secs]

def uniform_daily_hours(n, base_date=datetime.datetime.today()): # return floats! matplolib format!!!
    return [base_date + datetime.timedelta(days=1)*i/n for i in range(n)]

# time ticks
time_ticks = uniform_daily_hours(N_MAJOR_TICKS)

# random values
random.seed(10)     # fixing random state for reproducibility
x = random_daily_hours(15)
y = [random.random() for _ in range(len(x))]

# multi days - append a consecutive day
if IS_MULTI_DAYS:
    day = datetime.timedelta(days=1)
    x += random_daily_hours(15, base_date=datetime.datetime.today() + 1 * day)
    y = [random.random() for _ in range(len(x))]

ax = plt.subplot(projection='polar')

# fix scale & orientation
ax.set_rticks([0.5, 1, 1.5, 2])  # set values radial ticks
ax.set_rlabel_position(120)  # set location radial scale
ax.set_theta_zero_location('N')  # set polar reference direction
ax.set_theta_direction(-1)  # set default orientation - clockwise

# attempt 1
if 1:
    def ticks_labels(times):
        time_ticks = []
        for t in times:
            h, m = t.hour, t.minute
            if h < 10:
                h = '0{}'.format(h)
            if m < 10:
                h = '0{}'.format(m)
            time_ticks += ['{}:{}'.format(h, m)]

        return time_ticks

    ax.set_xticks(np.linspace(0, 2 * np.pi, N_MAJOR_TICKS, endpoint=False))
    ax.set_xticklabels(time_ticks) # ax.set_xticklabels(ticks_labels(time_ticks))

# attempt 2
if 0:
    p_locator = mpolar.ThetaLocator(mdates.AutoDateLocator(minticks=24, maxticks=24))
    p_formatter = mpolar.ThetaFormatter()
    ax.set_xticks(time_ticks)
    ax.xaxis.set_major_formatter(p_formatter)
    ax.xaxis.set_major_locator(p_locator)


ax.plot(x, y, '-')
ax.grid(True)
plt.show()

The x in a polar plot is an angle. It appears your x is in hours (looping around at 24 then). You need to rescale this to be between 0 and 2pi first.