# 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.