【问题标题】:Datetime axis spacing日期时间轴间距
【发布时间】:2015-05-25 20:37:25
【问题描述】:

我有一个误差线图,其中 xaxis 是日期时间对象的列表。标准绘图方法会将第一个和最后一个点放置在绘图的边界框上。我想偏移半个刻度,以便可以清楚地看到第一个和最后一个点。

ax.axis(xmin=-0.5,xmax=len(dates)-0.5)

由于明显的原因不起作用。如果能够在不硬编码任何日期的情况下做到这一点,那就太好了。

以下将产生一个有 10 个点的图,但你实际上只能看到 8 个。

import datetime
import matplotlib.pyplot as plt

dates = [datetime.date(2002, 3, 11) - datetime.timedelta(days=x) for x in range(0, 10)]
yvalues = [2, 4, 1,7,9,2, 4, 1,7,9]
errorvalues = [0.4, 0.1, 0.3,0.4, 0.1,.4, 0.1, 0.3,0.4, 0.1]

fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1)
ax.errorbar(dates,yvalues,yerr=errorvalues,fmt='.') 
fig.autofmt_xdate()

plt.show()

【问题讨论】:

  • 用一些示例数据帮助您会容易得多。例如,某些方法可能会根据您的日期相距多远而受到青睐或不受欢迎。
  • 我希望有一种通用的方式。实际日期无关紧要。假设我们希望日期之间的间距相等,而不管列表中的值如何。目标是让刻度晚半个空格开始,提前半个空格结束。我在下面的答案中给出了我目前的技巧。
  • 没关系。提供一个简单的、可复制/可粘贴的脚本作为启动点是一种很好的做法。帮助你越容易,你得到的帮助就越多。就目前而言,我必须激活一个 conda 环境,启动一个 ipython 笔记本服务器,并创建我自己的假数据,并希望它能够代表您面临的问题。

标签: python datetime matplotlib axis


【解决方案1】:

一个丑陋的解决方法可能是以下

fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1)
ax.errorbar(range(len(dates)),yvalues,yerr=errorvalues) 
ax.set_xticks(range(len(dates))
ax.set_xticklabels(dates, fontsize=8)
ax.axis(xmin=-0.5,xmax=len(dates)-0.5)
fig.autofmt_xdate()

这样做的缺点是轴对象不是日期时间类型,因此您不能使用很多函数。

【讨论】:

    【解决方案2】:

    您可以使用ax.margins 来获得您想要的。

    如果没有看到您的数据,就很难知道您真正想要的利润有多大。如果您使用 python 日期时间类型进行绘图,则边距 1 对应于相当大的边距:

    fig, ax = plt.subplots()
    ax.bar(x, y)
    [t.set_ha('right') for t in ax.get_xticklabels()]
    [t.set_rotation_mode('anchor') for t in ax.get_xticklabels()]
    [t.set_rotation(45) for t in ax.get_xticklabels()]
    ax.margins(x=1)
    

    但同样,如果不查看现有数据和图表,很难变得过于具体。

    【讨论】:

    • @Keith ax.margins 是否不适用于误差线图(本质上是条形图)?
    【解决方案3】:

    您可以使用 margins() 设置间距

    import datetime
    import matplotlib.pyplot as plt
    
    dates = [datetime.date(2002, 3, 11) - datetime.timedelta(days=x) for x in range(0, 10)]
    yvalues = [2, 4, 1,7,9,2, 4, 1,7,9]
    errorvalues = [0.4, 0.1, 0.3,0.4, 0.1,.4, 0.1, 0.3,0.4, 0.1]
    
    fig = plt.figure() 
    ax = fig.add_subplot(1, 1, 1)
    ax.errorbar(dates,yvalues,yerr=errorvalues,fmt='.') 
    ax.margins(x=0.05)
    fig.autofmt_xdate()
    
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 2013-06-28
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多