Как определить различные функции для тиков на основе уровня масштабирования - PullRequest
0 голосов
/ 12 июня 2019

У меня есть график анализа данных, где ось X содержит даты. Сюжет должен быть интерактивным, и я хочу сделать следующее: По мере увеличения и увеличения я хочу, чтобы график (каждая точка при большем увеличении)

  • Показывать только галочки года
  • Показывать только месячные отметки
  • Показывать только дневные отметки
  • Ограничение разрешения в днях

Лучшее решение моей проблемы, которое я нашел до сих пор, это использование

ax.xaxis.set_major_formatter(FuncFormatter(dateticks))
ax.xaxis.set_major_locator(MaxNLocator(12)) #limits ticks
fig.autofmt_xdate() #rotates strings

Где "dateticks" - это функция, которая возвращает строку даты на основе значения x (например, "18-3-2018")

Это решение ограничивает общее количество тиков на экране за раз и позволяет отображать новые при увеличении, но показывает «случайные» даты, а когда график уменьшается, вы не знаете, где интервалы года являются. Более того, если вы увеличите разрешение за день, добавятся дополнительные отметки с тем же днем.

Я начал кодировать только в сентябре 2018 года, но мне это нравится! Может кто-нибудь помочь?

Вот график моего реального кода и вот код, который воспроизводит мою текущую ситуацию:

import datetime
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter,MaxNLocator

def dateticks(dayssince00,pos):
    start=datetime.date(2000,1,1)
    new= start+datetime.timedelta(days=dayssince00)
    return "{}-{}-{}".format(new.day, new.month, new.year)

def graph():
    fig, ax = plt.subplots(1)

    days=[x for x in range(1000)]
    func=[x**2 for x in days]
    plt.plot(days,func)

    ax.xaxis.set_major_formatter(FuncFormatter(dateticks))
    ax.xaxis.set_major_locator(MaxNLocator(12)) #limits ticks
    fig.autofmt_xdate() #rotates strings

    plt.grid()
    plt.show()

graph()

1 Ответ

0 голосов
/ 13 июня 2019

Точное заданное поведение масштабирования может быть немного сложным, но настройки по умолчанию довольно близки к нему.

import datetime
import matplotlib.pyplot as plt

def dateticks(dayssince00):
    start=datetime.date(2000,1,1)
    new= start+datetime.timedelta(days=dayssince00)
    return new

def graph():
    fig, ax = plt.subplots(1)

    day_num = list(range(1000))
    days = [dateticks(x) for x in day_num]
    func = [x**2 for x in day_num]
    plt.plot(days,func)

    fig.autofmt_xdate() #rotates strings

    plt.grid()
    plt.show()

graph()
...