matplotlib中的日期刻度和旋转

2024-05-15 22:27:38 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试在matplotlib中旋转日期刻度时遇到问题。下面是一个小的示例程序。如果我尝试旋转末端的记号,则记号不会旋转。如果我尝试按注释“crashes”下所示旋转记号,则matplot lib将崩溃。

只有当x值是日期时才会发生这种情况。如果我在对avail_plot的调用中将变量t替换为变量dates,则xticks(rotation=70)调用在avail_plot内部工作正常。

有什么想法吗?

import numpy as np
import matplotlib.pyplot as plt
import datetime as dt

def avail_plot(ax, x, y, label, lcolor):
    ax.plot(x,y,'b')
    ax.set_ylabel(label, rotation='horizontal', color=lcolor)
    ax.get_yaxis().set_ticks([])

    #crashes
    #plt.xticks(rotation=70)

    ax2 = ax.twinx()
    ax2.plot(x, [1 for a in y], 'b')
    ax2.get_yaxis().set_ticks([])
    ax2.set_ylabel('testing')

f, axs = plt.subplots(2, sharex=True, sharey=True)
t = np.arange(0.01, 5, 1)
s1 = np.exp(t)
start = dt.datetime.now()
dates=[]
for val in t:
    next_val = start + dt.timedelta(0,val)
    dates.append(next_val)
    start = next_val

avail_plot(axs[0], dates, s1, 'testing', 'green')
avail_plot(axs[1], dates, s1, 'testing2', 'red')
plt.subplots_adjust(hspace=0, bottom=0.3)
plt.yticks([0.5,],("",""))
#doesn't crash, but does not rotate the xticks
#plt.xticks(rotation=70)
plt.show()

Tags: importplotasnpdtpltvalax
3条回答

如果您喜欢非面向对象的方法,请在两个调用之前将plt.xticks(rotation=70)移到右边的,例如

plt.xticks(rotation=70)
avail_plot(axs[0], dates, s1, 'testing', 'green')
avail_plot(axs[1], dates, s1, 'testing2', 'red')

这将在设置标签之前设置旋转特性。因为这里有两个轴,plt.xticks在绘制完这两个图后会感到困惑。在plt.xticks什么也不做的时候,plt.gca()不给你想要修改的轴,所以plt.xticks,作用于当前轴,是行不通的。

对于不使用plt.xticks的面向对象方法,可以使用

plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70 )

在两个avail_plot调用之后。这将特别设置正确轴上的旋转。

一个简单的解决方法是使用

^{}

此命令自动旋转xaxis标签并调整其位置。默认值为旋转角度30°和水平对齐“右”。但它们可以在函数调用中更改

fig.autofmt_xdate(bottom=0.2, rotation=30, ha='right')

附加的bottom参数相当于设置plt.subplots_adjust(bottom=bottom),这允许将底轴填充设置为更大的值以承载旋转的ticklebels。

所以基本上这里有所有的设置,你需要有一个漂亮的日期轴在一个命令。

可以在matplotlib页上找到good example

解决方案适用于matplotlib 2.1+

有一个axes方法tick_params可以更改tick属性。它也作为axis方法存在,如set_tick_params

ax.tick_params(axis='x', rotation=45)

或者

ax.xaxis.set_tick_params(rotation=45)

另外,当前的解决方案通过使用命令plt.xticks(rotation=70)将有状态接口(使用pyplot)与面向对象接口混合在一起。由于问题中的代码使用面向对象的方法,因此最好始终坚持这种方法。这个解确实给出了一个很好的plt.setp( axs[1].xaxis.get_majorticklabels(), rotation=70 )显式解

相关问题 更多 >