首页 > 解决方案 > 极坐标,日期时间

问题描述

我正在尝试在极坐标系中绘制一些与时间相关的数据。问题是我得到了一个我不知道从哪里开始的输出:时间、定位器……没有“正确”绘制。

我每 2 小时需要一些主要滴答声,每小时需要一些次要滴答声,以及与一天转换相对应的天标签。在正常坐标中似乎没问题,但是当切换到极坐标时,它似乎更复杂,这非常令人困惑。我想念 smt 但不知道是什么。

我试过了

p_locator = mpolar.ThetaLocator(mdates.AutoDateLocator(minticks=24, maxticks=24))
p_formatter = mpolar.ThetaFormatter()

或与

p_locator = mdates.AutoDateLocator()
p_formatter = mdates.DateFormatter("%H:%M")

但没有成功。我想我错过了对象matplotlib内部的工作方式datetime。不仅仅是蜱,定位器和公司。是“错误的”,但数据甚至不适合整个圆圈(->我应该应用比例转换吗?)

我真的很感激一些帮助来理解它背后的机制。

更新轴

ax.set_xticks(time_ticks)   
ax.xaxis.set_major_formatter(p_formatter)
ax.xaxis.set_major_locator(p_locator)

这是一个代码示例

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
    secs = sorted([random.randint(0, 24*60*60 - 1) for _ in range(n_times)])
    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
ax.set_xticks(np.linspace(0, 2 * np.pi, N_MAJOR_TICKS, endpoint=False))
ax.set_xticklabels(time_ticks)


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

标签: pythondatetimematplotlib

解决方案


推荐阅读