【问题标题】:How to define different functions for ticks based on zoom level如何根据缩放级别为刻度定义不同的函数
【发布时间】:2019-06-12 20:58:30
【问题描述】:

我有一个数据分析图,其中 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 年 9 月才开始编码,但我喜欢它!有人可以帮忙吗?

Here is a plot of my real code ,这是重现我当前情况的代码:

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()

【问题讨论】:

  • 从某种意义上说,它是交互式的,您可以放大,仅此而已,而我遇到的问题是滴答声。我还应该为此目的使用 Bokeh 吗?

标签: python matplotlib graph interactive


【解决方案1】:

具体指定的缩放行为可能有点难以完成,但默认值非常接近它。

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()

【讨论】:

  • 我试过了,它同时显示所有刻度;我需要的是隐藏大部分内容,直到你放大更多。
  • 不,它不会同时显示所有内容。在任何缩放级别,它都会显示有用的刻度数。
  • 没关系,我没有编辑“return new”部分。这绝对是一个很大的改进,谢谢!
  • 我无法将它完全实现到我的代码中,因为在某些部分我添加了一条取决于 x 值的水平直线,但在这种情况下它被绘制在接近 0 年的位置
  • 它被绘制在你给它的坐标处。
猜你喜欢
  • 1970-01-01
  • 2018-10-07
  • 2017-10-14
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多